Comment signer un Apk déjà compilé

121

J'ai décodé un APK avec apktool (car le code source d'origine a été perdu) afin que je puisse résoudre certains problèmes avec les fichiers xml de mise en page. Je l'ai ensuite reconstruit avec apktool et lorsque j'ai essayé de l'installer sur mon appareil (en utilisant adb: adb install appname.apk), cela m'a donné cette erreur:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Cependant, l'apk d'origine a été signé par un keystore (sur l'IDE eclipse), celui-ci ne l'est pas, comment puis-je le signer correctement avec son fichier keystone original en dehors d'Eclipse !?

svarog
la source
oui, tout l'intérêt des certificats est d'empêcher les gens de faire ça ... Si vous n'avez pas le certificat d'origine, vous devrez en régénérer un
troisième
c'est juste cela, j'ai le certificat d'origine, mais le décodage / la reconstruction de l'apk l'a supprimé.
svarog

Réponses:

285

créer une clé en utilisant

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

puis signez l'apk en utilisant:

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

vérifier ici pour plus d'informations

user3854546
la source
11
cela devrait être la réponse, 27 votes positifs contre 3 à la réponse originale, allez!
Kyle
1
si vous faites cela et essayez d'installer l'APK, vous risquez de vous retrouver avec une erreur INSTALL_FAILED_DUPLICATE_PERMISSION. Cela se produit lorsque l'APK d'origine ne peut pas être écrasé (système ou application intégrée par exemple)
Couitchy
@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr Deo
14
si vous ne voulez pas vous donner la peine de créer une clé, vous pouvez utiliser la clé de débogage avec: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet
3
Y a-t-il une différence entre utiliser jarsigneret apksigner? L'un nécessite une signature, puis un zipaligning et l'autre zipaligning puis une signature
Maria Ines Parnisari
72

Processus automatisé:

Utilisez cet outil (utilise le nouvel apksigner de Google):

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

Avertissement: Je suis le développeur :)

Processus manuel:

Étape 1: Générer Keystore (une seule fois)

Vous devez générer un keystore une fois et l'utiliser pour signer votre unsignedapk. Utilisez le fourni par le JDK trouvé danskeytool %JAVA_HOME%/bin/

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

Étape 2 ou 4: Zipalign

zipalign qui est un outil fourni par le SDK Android trouvé dans par exemple %ANDROID_HOME%/sdk/build-tools/24.0.2/est une étape d'optimisation obligatoire si vous souhaitez télécharger l'apk sur le Play Store.

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

Remarque: lorsque vous utilisez l'ancien, jarsignervous devez zipalign APRÈS la signature. Lorsque vous utilisez la nouvelle apksignerméthode, vous le faites AVANT de signer (déroutant, je sais). L'appel de zipalign avant apksigner fonctionne correctement car apksigner préserve l'alignement et la compression de l'APK (contrairement à jarsigner).

Vous pouvez vérifier l'alignement avec

zipalign -c 4 my-aligned.apk

Étape 3: signer et vérifier

Utilisation des build-tools 24.0.2 et versions antérieures

Utilisez jarsignerqui, comme le keytool, est fourni avec la distribution JDK trouvée dans %JAVA_HOME%/bin/et utilisez-le comme ceci:

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

et peut être vérifié avec

jarsigner -verify -verbose my_application.apk

Utilisation des outils de construction 24.0.3 et plus récents

Android 7.0 présente APK Signature Scheme v2, un nouveau schéma de signature d'applications qui offre des temps d'installation d'application plus rapides et une protection accrue contre les modifications non autorisées des fichiers APK (voir ici et ici pour plus de détails). Par conséquent, Google a implémenté son propre signataire apk appeléapksigner (duh!) Le fichier de script se trouve dans %ANDROID_HOME%/sdk/build-tools/24.0.3/(le .jar est dans le /libsous - dossier). Utilisez-le comme ça

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

et peut être vérifié avec

apksigner verify my-app.apk

La documentation officielle peut être trouvée ici.

Patrick Favre
la source
6
Merci pour uber-apk-signer! Excellent outil!
cantoni
2
Pour build-tools 24.0.3, la manière correcte d'appeler zipalign est: zipalign -p 4 my.apk my-Aligné.apk
kinORnirvana
Merci pour votre description! essayé uber-apk-signer en premier mais a échoué probablement parce que j'ai openJDK installé sur mon système au lieu d'oracles java "officiels". J'ai donc essayé la méthode manuelle et j'ai également échoué (toujours la même erreur [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). La vérification avec uber-apk-signer m'a donné un aperçu supplémentaire 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]]. Oui, Android 4.2.2, SHA256 pas là? des idées?
antiplex
@antiplex s'il vous plaît rapporter le problème dans github not SO
Patrick Favre
@ for3st voulez-vous dire que mes problèmes ne sont peut-être pas dus à mes connaissances limitées sur la signature d'apk, mais à une certaine forme d'incompatibilité d'uber-apk-signer? mais même dans ce cas, la méthode manuelle échoue également, ce qui semble sans rapport avec votre outil ...
antiplex
14

Le moyen le plus rapide est de signer avec le keystore de débogage:

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

ou sous Windows:

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

Vous utilisez jarsigner pour signer des APK. Vous n'êtes pas obligé de signer avec le keystore d'origine, il suffit d'en générer un nouveau. Renseignez-vous sur les détails: http://developer.android.com/guide/publishing/app-signing.html

Nikolay Elenkov
la source
1
le lien a été rompu
jayatubi
4

Pour ceux d'entre vous qui ne veulent pas créer un fichier bat à éditer pour chaque projet, ou qui ne veulent pas se souvenir de toutes les commandes associées aux programmes keytools et jarsigner et qui veulent simplement le faire en un seul processus, utilisez ce programme:

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

Je l'ai construit parce que j'en avais marre du long processus consistant à taper tous les emplacements de fichiers à chaque fois.

Ce programme peut enregistrer votre configuration afin que la prochaine fois que vous le démarrez, il vous suffit d'appuyer sur Générer et il le gérera pour vous. C'est tout.

Aucune installation requise, il est complètement portable et enregistre ses configurations dans un CSV dans le même dossier.

Luke Alderton
la source