Cara Menandatangani Apk yang Telah Dikompilasi

121

Saya telah mendekodekan APK dengan apktool (karena kode sumber aslinya hilang) sehingga saya dapat memperbaiki beberapa masalah dengan file layout xml. Saya kemudian membangunnya kembali dengan apktool dan ketika saya mencoba menginstalnya di perangkat saya (menggunakan adb: adb install appname.apk) itu memberi saya kesalahan ini:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Namun apk asli telah ditandatangani oleh keystore (di eclipse IDE), yang ini tidak, bagaimana saya bisa menandatanganinya dengan benar dengan file keystone asli di luar Eclipse !?

svarog.dll
sumber
ya, inti dari sertifikat adalah untuk menghentikan orang melakukan ini ... Jika Anda tidak memiliki sertifikat asli Anda harus membuat ulang satu
ketiga
hanya itu, saya memiliki sertifikat asli, tetapi decoding / membangun ulang apk menghapusnya.
svarog

Jawaban:

285

buat kunci menggunakan

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

lalu tanda tangani apk menggunakan:

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

periksa di sini untuk info lebih lanjut

pengguna3854546
sumber
11
ini seharusnya jawabannya, 27 suara positif versus 3 dari jawaban asli, ayolah!
Kyle
1
jika Anda melakukan ini dan mencoba memasang APK, Anda mungkin akan mendapatkan kesalahan INSTALL_FAILED_DUPLICATE_PERMISSION. Ini terjadi ketika APK asli tidak dapat ditimpa (sistem atau aplikasi
bawaan
@Couitchy adb shell pm instal -r /data/tmp/myapk.apk
Dr Deo
14
jika Anda tidak ingin repot membuat kunci, Anda dapat menggunakan kunci debug dengan: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet
3
Apakah ada perbedaan antara menggunakan jarsignerdanapksigner ? Satu membutuhkan penandatanganan dan kemudian zipaligning dan yang lainnya zipaligning dan kemudian signinig
Maria Ines Parnisari
72

Proses Otomatis:

Gunakan alat ini (menggunakan apksigner baru dari Google):

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

Penafian: Saya pengembang :)

Proses Manual:

Langkah 1: Buat Keystore (hanya sekali)

Anda perlu membuat keystore sekali dan menggunakannya untuk menandatangani unsigned apk . Gunakan yang disediakan oleh JDK yang ada dikeytool %JAVA_HOME%/bin/

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

Langkah 2 atau 4: Zipalign

zipalign yang merupakan alat yang disediakan oleh Android SDK misalnya, %ANDROID_HOME%/sdk/build-tools/24.0.2/merupakan langkah pengoptimalan wajib jika Anda ingin mengunggah apk ke Play Store.

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

Catatan: saat menggunakan yang lama jarsignerAnda perlu zipalign SETELAH penandatanganan. Saat menggunakan yang baruapksigner metode Anda melakukannya SEBELUM penandatanganan (membingungkan, saya tahu). Memanggil zipalign sebelum apksigner berfungsi dengan baik karena apksigner mempertahankan penyelarasan dan kompresi APK (tidak seperti jarsigner).

Kamu bisa memverifikasi keselarasan dengan

zipalign -c 4 my-aligned.apk

Langkah 3: Tanda Tangan & Verifikasi

Menggunakan alat build 24.0.2 dan yang lebih lama

Gunakan jarsigneryang, seperti keytool, hadir dengan distribusi JDK yang ditemukan di %JAVA_HOME%/bin/ dan menggunakannya seperti ini:

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

dan dapat diverifikasi dengan

jarsigner -verify -verbose my_application.apk

Menggunakan alat build 24.0.3 dan yang lebih baru

Android 7.0 memperkenalkan APK Signature Scheme v2, skema penandatanganan aplikasi baru yang menawarkan waktu penginstalan aplikasi lebih cepat dan lebih banyak perlindungan terhadap perubahan tidak sah pada file APK (Lihat di sini dan di sini untuk detail selengkapnya). Oleh karena itu, Google menerapkan penandatangan apkapksigner mereka sendiri yang disebut (duh!) File skrip dapat ditemukan di %ANDROID_HOME%/sdk/build-tools/24.0.3/(.jar ada di /libsubfolder). Gunakan seperti ini

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

dan dapat diverifikasi dengan

apksigner verify my-app.apk

Dokumentasi resmi dapat ditemukan di sini.

Patrick Favre
sumber
6
Terima kasih untuk uber-apk-signer! Alat yang hebat!
cantoni
2
Untuk build-tools 24.0.3, cara yang benar untuk memanggil zipalign adalah: zipalign -p 4 my.apk my-aligned.apk
kinORnirvana
Terima kasih atas uraian Anda! mencoba uber-apk-signer terlebih dahulu tetapi gagal mungkin karena saya telah menginstal openJDK di sistem saya, bukan java "resmi" oracles. Jadi saya coba cara manual dan juga gagal (masih error sama [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). Memverifikasi dengan uber-apk-signer memberi saya wawasan lebih lanjut 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]]. Ya, android 4.2.2, SHA256 tidak ada? ide ide?
antiplex
@antiplex tolong laporkan masalah ini di github bukan SO
Patrick Favre
@ for3st, maksud Anda, masalah saya mungkin bukan karena pengetahuan saya yang terbatas seputar penandatanganan apk tetapi karena beberapa bentuk ketidakcocokan uber-apk-signer? tetapi meskipun demikian cara manual juga gagal yang tampaknya tidak terkait dengan alat Anda ...
antiplex
14

cara tercepat adalah dengan masuk dengan keystore debug:

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

atau di Windows:

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

Bagi Anda yang tidak ingin membuat file bat untuk diedit untuk setiap proyek, atau tidak ingin mengingat semua perintah yang terkait dengan program keytools dan jarsigner dan hanya ingin menyelesaikannya dalam satu proses gunakan program ini:

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

Saya membuatnya karena saya muak dengan proses yang panjang karena harus mengetik semua lokasi file setiap saat.

Program ini dapat menyimpan konfigurasi Anda sehingga lain kali Anda memulainya, Anda hanya perlu menekan Generate dan program itu akan menanganinya untuk Anda. Itu dia.

Tidak perlu instalasi, ini sepenuhnya portabel dan menyimpan konfigurasinya dalam CSV di folder yang sama.

Luke Alderton
sumber