Come firmare un Apk già compilato


121

Ho decodificato un APK con apktool (poiché il codice sorgente originale è andato perso) in modo da poter risolvere alcuni problemi con i file xml di layout. L'ho quindi ricostruito con apktool e quando ho provato a installarlo sul mio dispositivo (usando adb: adb install appname.apk) mi ha dato questo errore:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

l'apk originale tuttavia è stato firmato da un keystore (su eclipse IDE), questo non lo è, come posso firmarlo correttamente con il suo file keystone originale fuori da Eclipse !?


sì, lo scopo dei certificati è impedire alle persone di farlo ... Se non hai il certificato originale dovrai rigenerarne uno
terzo

è proprio così, ho il certificato originale, ma la decodifica / ricostruzione dell'apk lo ha rimosso.
svarog

Risposte:


285

creare una chiave utilizzando

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

quindi firma l'apk utilizzando:

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

controlla qui per maggiori informazioni


11
questa dovrebbe essere la risposta, 27 voti positivi contro 3 alla risposta originale, dai!
Kyle

1
se lo fai e provi a installare l'APK, potresti finire con un errore INSTALL_FAILED_DUPLICATE_PERMISSION. Ciò accade quando l'APK originale non può essere sovrascritto (sistema o app integrata per esempio)
Couitchy

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

14
se non vuoi preoccuparti di creare una chiave puoi usare la chiave di debug con: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet

3
C'è una differenza tra usare jarsignere apksigner? Uno richiede la firma e poi lo zipaligning e l'altro lo zipaligning e poi la firma
Maria Ines Parnisari

72

Processo automatizzato:

Usa questo strumento (utilizza il nuovo apksigner di Google):

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

Disclaimer: sono lo sviluppatore :)

Processo manuale:

Passaggio 1: genera il keystore (solo una volta)

Devi generare un keystore una volta e usarlo per firmare il tuo unsignedapk. Usa il fornito dal JDK trovato inkeytool %JAVA_HOME%/bin/

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

Passaggio 2 o 4: Zipalign

zipalign che è uno strumento fornito dall'SDK Android che si trova ad esempio, %ANDROID_HOME%/sdk/build-tools/24.0.2/è un passaggio di ottimizzazione obbligatorio se si desidera caricare l'apk sul Play Store.

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

Nota: quando si utilizza il vecchio jarsignerè necessario zipalign DOPO la firma. Quando usi il nuovo apksignermetodo lo fai PRIMA di firmare (confuso, lo so). Invocare zipalign prima di apksigner funziona bene perché apksigner conserva l'allineamento e la compressione dell'APK (a differenza di jarsigner).

È possibile verificare l'allineamento con

zipalign -c 4 my-aligned.apk

Passaggio 3: firma e verifica

Utilizzo di build-tools 24.0.2 e versioni precedenti

Usa jarsignerche, come il keytool, viene fornito con la distribuzione JDK trovata in %JAVA_HOME%/bin/e usalo in questo modo:

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

e può essere verificato con

jarsigner -verify -verbose my_application.apk

Utilizzo di build-tools 24.0.3 e versioni successive

Android 7.0 introduce APK Signature Scheme v2, un nuovo schema di firma delle app che offre tempi di installazione delle app più rapidi e maggiore protezione contro le alterazioni non autorizzate dei file APK (vedi qui e qui per maggiori dettagli). Pertanto, Google ha implementato il proprio firmatario dell'apk chiamatoapksigner (duh!) Il file di script può essere trovato in %ANDROID_HOME%/sdk/build-tools/24.0.3/(il .jar è nella /libsottocartella). Usalo in questo modo

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

e può essere verificato con

apksigner verify my-app.apk

La documentazione ufficiale può essere trovata qui.


6
Grazie per uber-apk-firmatario! Ottimo strumento!
cantoni

2
Per build-tools 24.0.3 il modo corretto per chiamare zipalign è: zipalign -p 4 my.apk my-align.apk
kinORnirvana

Grazie per la tua descrizione! ho provato prima uber-apk-signer ma non è riuscito probabilmente perché ho openJDK installato sul mio sistema invece di oracles java "ufficiale". Quindi ho provato il modo manuale e anche fallito (sempre lo stesso errore [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). La verifica con uber-apk-signer mi ha fornito ulteriori informazioni 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]]. Sì, Android 4.2.2, SHA256 non è presente? idee?
antiplex

@antiplex per favore segnala il problema in github non SO
Patrick Favre

@ for3st vuoi dire che i miei problemi potrebbero non essere dovuti alla mia conoscenza limitata sulla firma di apk ma a una qualche forma di incompatibilità di uber-apk-signer? ma anche in questo caso fallisce anche il modo manuale, il che sembra estraneo al tuo strumento ...
antiplex

14

il modo più veloce è firmare con il keystore di debug:

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

o su Windows:

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


4

Per quelli di voi che non vogliono creare un file bat da modificare per ogni progetto, o non vogliono ricordare tutti i comandi associati ai programmi keytools e jarsigner e vogliono solo farlo in un unico processo, utilizzare questo programma:

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

L'ho costruito perché ero stufo del lungo processo di dover digitare tutte le posizioni dei file ogni volta.

Questo programma può salvare la tua configurazione, quindi la prossima volta che lo avvii, devi solo premere Genera e lo gestirà per te. Questo è tutto.

Nessuna installazione richiesta, è completamente portatile e salva le sue configurazioni in un CSV nella stessa cartella.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.