Làm thế nào để ký một Apk đã được biên dịch


120

Tôi đã giải mã một APK bằng apktool (vì mã nguồn ban đầu bị mất) nên tôi có thể khắc phục một số vấn đề với bố cục tệp xml. Sau đó, tôi đã sao lưu lại nó bằng apktool và khi tôi cố gắng cài đặt nó trên thiết bị của mình (sử dụng adb: adb install appname.apk), nó đã cho tôi lỗi này:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Tuy nhiên, apk gốc đã được ký bởi một kho khóa (trên IDE eclipse), cái này thì không, làm cách nào tôi có thể ký đúng bằng tệp keystone gốc bên ngoài Eclipse !?


yeah, toàn bộ các điểm chứng chỉ là để ngăn không cho người từ làm điều này ... Nếu bạn không có cert gốc bạn đang gonna phải tái sinh một
edthethird

đó chỉ là nó, tôi có chứng chỉ ban đầu, nhưng giải mã / xây dựng lại apk đã xóa nó.
svarog

Câu trả lời:


284

tạo một khóa bằng cách sử dụng

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

sau đó đăng nhập apk bằng:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

kiểm tra ở đây để biết thêm thông tin


11
đây sẽ là câu trả lời, 27 phiếu tán thành so với 3 phiếu bầu cho câu trả lời ban đầu, thôi nào!
Kyle

1
nếu bạn làm điều này và cố gắng cài đặt APK, bạn có thể gặp phải lỗi INSTALL_FAILED_DUPLICATE_PERMISSION. Điều này xảy ra khi APK gốc không thể overwrited (hệ thống hoặc tích hợp trong ứng dụng ví dụ)
Couitchy

@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr Deo

13
Nếu bạn không muốn làm phiền việc tạo ra một chìa khóa bạn có thể sử dụng phím debug với: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ / .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet

3
Có sự khác biệt giữa việc sử dụng jarsignerapksigner? Một đòi hỏi ký và sau đó zipaligning và zipaligning khác và sau đó signinig
Maria Ines Parnisari

72

Quy trình tự động:

Sử dụng công cụ này (sử dụng apksigner mới của Google):

https://github.com/patrickfav/uber-apk-signer

Tuyên bố từ chối trách nhiệm: Tôi là nhà phát triển :)

Quy trình thủ công:

Bước 1: Tạo Kho khóa (chỉ một lần)

Bạn cần tạo một kho khóa một lần và sử dụng nó để ký gói unsignedứng dụng của mình . Sử dụng cung cấp bởi JDK được tìm thấy trongkeytool %JAVA_HOME%/bin/

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app

Bước 2 hoặc 4: Zipalign

zipalign là một công cụ được cung cấp bởi SDK Android, ví dụ, %ANDROID_HOME%/sdk/build-tools/24.0.2/là bước tối ưu hóa bắt buộc nếu bạn muốn tải gói ứng dụng lên Cửa hàng Play.

zipalign -p 4 my.apk my-aligned.apk

Lưu ý: khi sử dụng cái cũ jarsignerbạn cần zipalign SAU KHI ký. Khi sử dụng apksignerphương pháp mới, bạn thực hiện TRƯỚC KHI ký (khó hiểu, tôi biết). Gọi zipalign trước khi apksigner hoạt động tốt vì apksigner duy trì tính năng căn chỉnh và nén APK (không giống như jarigner).

Bạn có thể xác minh sự liên kết với

zipalign -c 4 my-aligned.apk

Bước 3: Ký & Xác minh

Sử dụng công cụ xây dựng 24.0.2 trở lên

Sử dụng jarsignercái mà, như keytool, đi kèm với bản phân phối JDK được tìm thấy trong %JAVA_HOME%/bin/và sử dụng nó như vậy:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name

và có thể được xác minh bằng

jarsigner -verify -verbose my_application.apk

Sử dụng công cụ xây dựng 24.0.3 và mới hơn

Android 7.0 giới thiệu APK Signature Scheme v2, một sơ đồ ký ứng dụng mới cung cấp thời gian cài đặt ứng dụng nhanh hơn và bảo vệ nhiều hơn chống lại các thay đổi trái phép đối với tệp APK (Xem tại đâytại đây để biết thêm chi tiết). Do đó, Google đã triển khai trình ký apk của riêng họ được gọi làapksigner (duh!) Tệp script có thể được tìm thấy trong %ANDROID_HOME%/sdk/build-tools/24.0.3/(.jar nằm trong /libthư mục con). Sử dụng nó như thế này

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name

và có thể được xác minh bằng

apksigner verify my-app.apk

Tài liệu chính thức có thể được tìm thấy ở đây.


6
Cảm ơn vì uber-apk-signer! Công cụ tuyệt vời!
cantoni

2
Đối với build-tools 24.0.3, cách gọi zipalign chính xác là: zipalign -p 4 my.apk my-align.apk
kinORnirvana

Cảm ơn cho mô tả của bạn! đã thử uber-apk-signer trước nhưng không thành công có lẽ vì tôi đã cài đặt openJDK trên hệ thống của mình thay vì oracles "chính thức" java. Nên mình đã thử cách thủ công và cũng không thành công (vẫn bị lỗi như cũ [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). Việc xác minh bằng uber-apk-signer đã cho tôi thêm một số thông tin chi tiết signature VERIFY FAILED[...] ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported on API Levels [[15, 17]]. Có, android 4.2.2, SHA256 không có? ý tưởng?
antiplex 19/07/17

@antiplex xin vui lòng báo cáo vấn đề trong github không SO
Patrick Favre

@ for3st ý của bạn là vấn đề của tôi có thể không phải do kiến ​​thức hạn chế của tôi về việc ký apk mà do một số hình thức không tương thích của uber-apk-signer? nhưng ngay cả sau đó cách thủ công cũng không thành công mà dường như không liên quan đến công cụ của bạn ...
antiplex 12/02/18

14

cách nhanh nhất là ký với kho khóa gỡ lỗi:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android

hoặc trên Windows:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android


4

Đối với những người bạn không muốn tạo tệp bat để chỉnh sửa cho mọi dự án hoặc không muốn nhớ tất cả các lệnh được liên kết với các chương trình keytools và jarigner và chỉ muốn hoàn thành nó trong một quá trình, hãy sử dụng chương trình này:

http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx

Tôi đã xây dựng nó bởi vì tôi đã chán ngấy với quá trình kéo dài phải nhập tất cả các vị trí tệp mỗi lần.

Chương trình này có thể lưu cấu hình của bạn để lần sau khi khởi động, bạn chỉ cần nhấn Generate an nó sẽ xử lý cho bạn. Đó là nó.

Không cần cài đặt, nó hoàn toàn di động và lưu các cấu hình của nó trong một CSV trong cùng một thư mục.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.