Intentando firmar manualmente el paquete de Android con jarsigner.exe e instalarlo con adb.exe
apk jar-signing (3)
Para firmar apks usando JDK 1.7, uno tiene que usar estas palabras clave "-sigalg MD5withRSA -digestalg SHA1 "
Motivo: A partir de JDK 7, el algoritmo de firma predeterminado ha cambiado, requiriendo que especifique los algoritmos de firma y resumen (-sigalg y -digestalg) cuando firme un APK.
Mando:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile]
[originalapk] alias_name
He estado intentando usar jarsigner.exe y adb.exe para firmar manualmente un paquete de Android e instalarlo en un emulador de API V8. Creé un proyecto simple HelloAndroid y generaría un HelloAndroid.apk firmado utilizando el debug.keystore ubicado en el directorio .android del usuario. Cuando se inicia desde Eclipse, crea e instala la apk en el emulador sin ningún problema.
Utilicé las herramientas de Android para exportar un paquete de aplicación sin firmar a un directorio separado. Firmé y configuré zipAligned y usé adb para instalarlo pero recibí el error:
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
Utilicé el siguiente comando para firmarlo.
jarsigner -verbose -keystore c:/users/jhwong/.android/debug.keystore
-storepass android -keypass android -digestalg SHA-1 -sigalg SHA1withRSA
-sigfile CERT -signedjar temp/HelloWorld2.apk
temp/HelloWorld.unsigned.apk androiddebugkey
adding: META-INF/MANIFEST.MF
adding: META-INF/CERT.SF
adding: META-INF/CERT.RSA
signing: res/layout/main.xml
signing: AndroidManifest.xml
signing: resources.arsc
signing: res/drawable-hdpi/icon.png
signing: res/drawable-ldpi/icon.png
signing: res/drawable-mdpi/icon.png
signing: classes.dex
Eso no me dio ningún error y solo para asegurarme de que corrí:
jarsigner -verify -verbose temp/HelloWorld2.apk
Mostró que el frasco fue verificado y cada archivo firmado y parte del manifiesto.
zipalign -v 4 temp/HelloWorld2.apk temp/HelloWorld3.apk
que terminó sin un error. Luego usé adb install -r temp/HelloWorld3.apk
.
He visto varios temas y artículos relacionados que sugieren estas instrucciones, pero estoy perplejo en cuanto a por qué no funciona manualmente los versos que usan Eclipse para compilar el paquete firmado. Incluso tomé el paquete creado a partir de Eclipse y pude usar adb.exe para instalarlo, así que lo he reducido a la firma del paquete. He probado los almacenes de claves que he generado desde la herramienta de claves pero no funcionaron tan bien, por eso probé el debug.keystore.
Apreciaría cualquier consejo si notara algo malo con mi código de señalización.
Si está utilizando JDK 7, intente
jarsigner -sigalg SHA1withRSA -digestalg SHA1
Si lo consigues
jarsigner error: java.security.SignatureException: private key algorithm is not compatible with signature algorithm
entonces intenta
jarsigner -sigalg MD5withRSA -digestalg SHA1
Tuvimos exactamente el mismo problema. Intente usar los siguientes valores de parámetros:
jarsigner ... -digestalg SHA1 -sigalg MD5withRSA ...
Por cierto, el uso de sigalg y digestalg explícitos parece ser obligatorio con JDK 7.