So unterschreiben Sie eine bereits kompilierte Apk

119

Ich habe eine APK mit apktool dekodiert (da der ursprüngliche Quellcode verloren gegangen ist), damit ich einige Probleme mit den Layout-XML-Dateien beheben konnte. Ich habe es dann wieder mit apktool erstellt und als ich versuchte, es auf meinem Gerät zu installieren (mit adb: adb install appname.apk), gab es mir diesen Fehler:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Die ursprüngliche Apk wurde jedoch von einem Keystore (in der Eclipse-IDE) signiert. Dies ist nicht der Fall. Wie kann ich sie ordnungsgemäß mit der ursprünglichen Keystone-Datei außerhalb von Eclipse signieren?

svarog
quelle
Ja, der springende Punkt bei Zertifikaten ist, die Leute davon abzuhalten, dies zu tun ... Wenn Sie nicht über das Originalzertifikat verfügen, müssen Sie eines
erneuern
das ist es nur, ich habe das ursprüngliche Zertifikat, aber das Dekodieren / Wiederherstellen der apk hat es entfernt.
Svarog

Antworten:

283

Erstellen Sie einen Schlüssel mit

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

dann unterschreibe die apk mit:

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

Weitere Informationen finden Sie hier

user3854546
quelle
11
Dies sollte die Antwort sein, 27 Gegenstimmen gegenüber 3 zur ursprünglichen Antwort, komm schon!
Kyle
1
Wenn Sie dies tun und versuchen, das APK zu installieren, wird möglicherweise der Fehler INSTALL_FAILED_DUPLICATE_PERMISSION angezeigt. Dies geschieht, wenn die ursprüngliche APK nicht überschrieben werden kann (z. B. System oder integrierte App)
Couitchy
@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr. Deo
13
Wenn Sie sich nicht die Mühe machen möchten, einen Schlüssel zu erstellen, können Sie den Debug-Schlüssel verwenden mit: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet
3
Gibt es einen Unterschied zwischen jarsignerund apksigner? Einer muss unterschrieben und dann zipaligniert werden und der andere muss zipaligniert und dann signiert werden
Maria Ines Parnisari
72

Automatisierter Prozess:

Verwenden Sie dieses Tool (verwendet den neuen Apksigner von Google):

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

Haftungsausschluss: Ich bin der Entwickler :)

Manueller Prozess:

Schritt 1: Keystore generieren (nur einmal)

Sie müssen einmal einen Keystore generieren und damit Ihre unsignedapk signieren . Verwenden Sie das vom JDK bereitgestellte inkeytool %JAVA_HOME%/bin/

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

Schritt 2 oder 4: Zipalign

zipalign Dies ist ein Tool, das vom Android SDK bereitgestellt wird, z. B. %ANDROID_HOME%/sdk/build-tools/24.0.2/ein obligatorischer Optimierungsschritt, wenn Sie die Apk in den Play Store hochladen möchten.

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

Hinweis: Wenn Sie das alte verwenden jarsigner, müssen Sie NACH dem Signieren zipalignieren . Wenn Sie die neue apksignerMethode verwenden, tun Sie dies VOR dem Signieren (verwirrend, ich weiß). Das Aufrufen von zipalign vor apksigner funktioniert einwandfrei, da apksigner die APK-Ausrichtung und -Komprimierung beibehält (im Gegensatz zu jarsigner).

Sie können die Ausrichtung mit überprüfen

zipalign -c 4 my-aligned.apk

Schritt 3: Signieren und überprüfen

Verwenden von Build-Tools 24.0.2 und älter

Verwendung jarsigner, die wie die keytool, mit der JDK - Distribution kommt gefunden %JAVA_HOME%/bin/und es verwendet , etwa so:

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

und kann mit überprüft werden

jarsigner -verify -verbose my_application.apk

Verwenden von Build-Tools 24.0.3 und neuer

Android 7.0 führt das APK-Signaturschema v2 ein, ein neues App-Signaturschema, das schnellere App-Installationszeiten und mehr Schutz vor unbefugten Änderungen an APK-Dateien bietet ( weitere Informationen finden Sie hier und hier ). Aus diesem Grund hat Google einen eigenen apk-Unterzeichner namensapksigner (duh!) Implementiert. Die Skriptdatei befindet sich in %ANDROID_HOME%/sdk/build-tools/24.0.3/(die .jar befindet sich im /libUnterordner). Verwenden Sie es so

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

und kann mit überprüft werden

apksigner verify my-app.apk

Die offizielle Dokumentation finden Sie hier.

Patrick Favre
quelle
6
Danke für uber-apk-signer! Tolles Werkzeug!
Cantoni
2
Für Build-Tools 24.0.3 ist die korrekte Methode zum Aufrufen von zipalign: zipalign -p 4 my.apk my-align.apk
kinORnirvana
Danke für deine Beschreibung! Ich habe zuerst uber-apk-signer ausprobiert, bin aber wahrscheinlich gescheitert, weil ich openJDK auf meinem System anstelle von oracles "offiziellem" Java installiert habe. Also habe ich es manuell versucht und bin auch gescheitert (immer noch der gleiche Fehler [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). Die Überprüfung mit uber-apk-signer gab mir weitere Einblicke 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]]. Ja, Android 4.2.2, SHA256 nicht da? Ideen?
Antiplex
@antiplex bitte melden Sie das Problem in Github nicht SO
Patrick Favre
@ for3st meinst du, dass meine Probleme möglicherweise nicht auf mein begrenztes Wissen über Apk-Signing zurückzuführen sind, sondern auf irgendeine Form der Inkompatibilität von Uber-Apk-Signer? Aber selbst dann schlägt auch der manuelle Weg fehl, der nichts mit Ihrem Werkzeug zu
tun zu haben
14

Der schnellste Weg ist das Signieren mit dem Debug-Keystore:

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

oder unter Windows:

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

Sie verwenden Jarsigner, um APKs zu signieren. Sie müssen nicht mit dem ursprünglichen Schlüsselspeicher signieren, sondern nur einen neuen generieren. Lesen Sie die Details: http://developer.android.com/guide/publishing/app-signing.html

Nikolay Elenkov
quelle
1
Die Verbindung wurde unterbrochen
Jayatubi
4

Für diejenigen unter Ihnen, die nicht für jedes Projekt eine Bat-Datei zum Bearbeiten erstellen oder sich nicht alle Befehle merken möchten, die mit den Keytools- und Jarsigner-Programmen verknüpft sind, und diese nur in einem Prozess ausführen möchten, verwenden Sie dieses Programm:

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

Ich habe es erstellt, weil ich es satt hatte, jedes Mal alle Dateispeicherorte eingeben zu müssen.

Dieses Programm kann Ihre Konfiguration speichern. Wenn Sie es das nächste Mal starten, müssen Sie nur auf Generieren klicken und es wird für Sie erledigt. Das ist es.

Keine Installation erforderlich, es ist vollständig portabel und speichert seine Konfigurationen in einer CSV im selben Ordner.

Luke Alderton
quelle