Cómo firmar un Apk ya compilado

120

He decodificado un APK con apktool (ya que se perdió el código fuente original) para poder solucionar algunos problemas con los archivos xml de diseño. Luego lo reconstruí con apktool y cuando intenté instalarlo en mi dispositivo (usando adb: adb install appname.apk) me dio este error:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Sin embargo, el apk original fue firmado por un almacén de claves (en el IDE de eclipse), este no lo es, ¿cómo puedo firmarlo correctamente con su archivo keystone original fuera de Eclipse?

svarog
fuente
sí, el objetivo de los certificados es evitar que la gente haga esto ... Si no tiene el certificado original, tendrá que regenerar uno
edthethird
eso es todo, tengo el certificado original, pero la decodificación / reconstrucción de la apk lo eliminó.
svarog

Respuestas:

284

crear una clave usando

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

luego firme el apk usando:

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

Revisa aquí para mas información

user3854546
fuente
11
esta debería ser la respuesta, 27 votos a favor frente a 3 de la respuesta original, ¡vamos!
Kyle
1
si hace esto e intenta instalar el APK, puede terminar con un error INSTALL_FAILED_DUPLICATE_PERMISSION. Esto sucede cuando el APK original no se puede sobrescribir (sistema o aplicación incorporada, por ejemplo)
Couitchy
@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr Deo
13
si no quiere molestarse en crear una clave, puede usar la clave de depuración con: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet
3
¿Hay alguna diferencia entre usar jarsignery apksigner? Uno requiere firmar y luego zipaligning y el otro zipaligning y luego firmar
Maria Ines Parnisari
72

Proceso automatizado:

Utilice esta herramienta (utiliza el nuevo apksigner de Google):

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

Descargo de responsabilidad: soy el desarrollador :)

Proceso manual:

Paso 1: Genere el almacén de claves (solo una vez)

Necesita generar un almacén de claves una vez y usarlo para firmar su unsignedapk. Utilice el proporcionado por el JDK que se encuentra enkeytool %JAVA_HOME%/bin/

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

Paso 2 o 4: Zipalign

zipalign que es una herramienta proporcionada por el SDK de Android que se encuentra en, por ejemplo, %ANDROID_HOME%/sdk/build-tools/24.0.2/es un paso de optimización obligatorio si desea cargar el apk en Play Store.

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

Nota: cuando utilice el antiguo jarsigner, deberá zipalign DESPUÉS de firmar. Cuando usa el nuevo apksignermétodo, lo hace ANTES de firmar (confuso, lo sé). Invocar zipalign antes de apksigner funciona bien porque apksigner conserva la alineación y la compresión del APK (a diferencia de jarsigner).

Puede verificar la alineación con

zipalign -c 4 my-aligned.apk

Paso 3: Firmar y verificar

Uso de herramientas de compilación 24.0.2 y anteriores

Use jarsignerque, como la herramienta de teclas, viene con la distribución JDK que se encuentra en %JAVA_HOME%/bin/y úsela así:

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

y se puede verificar con

jarsigner -verify -verbose my_application.apk

Uso de herramientas de compilación 24.0.3 y posteriores

Android 7.0 presenta APK Signature Scheme v2, un nuevo esquema de firma de aplicaciones que ofrece tiempos de instalación de aplicaciones más rápidos y más protección contra alteraciones no autorizadas en archivos APK (consulte aquí y aquí para obtener más detalles). Por lo tanto, Google implementó su propio firmante de apk llamadoapksigner (¡duh!). El archivo de script se puede encontrar en %ANDROID_HOME%/sdk/build-tools/24.0.3/(el .jar está en la /libsubcarpeta). Úselo así

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

y se puede verificar con

apksigner verify my-app.apk

La documentación oficial se puede encontrar aquí.

Patrick Favre
fuente
6
¡Gracias por uber-apk-signer! ¡Gran herramienta!
cantoni
2
Para build-tools 24.0.3, la forma correcta de llamar a zipalign es: zipalign -p 4 my.apk my-align.apk
kinORnirvana
¡Gracias por tu descripción! Probé uber-apk-signer primero pero fallé probablemente porque tengo openJDK instalado en mi sistema en lugar de oráculos "oficial" java. Así que probé de forma manual y también fallé (sigue siendo el mismo error [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). Verificar con uber-apk-signer me dio más información 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 no está ahí? ideas?
Antiplex
@antiplex, informe el problema en github, no SO
Patrick Favre
@ for3st ¿quiere decir que mis problemas pueden no deberse a mi conocimiento limitado sobre la firma de apk, sino a algún tipo de incompatibilidad de uber-apk-signer? pero incluso entonces la forma manual también falla, lo que parece no estar relacionado con su herramienta ...
antiplex
14

La forma más rápida es firmar con el almacén de claves de depuración:

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

o en Windows:

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

Para aquellos de ustedes que no quieren crear un archivo bat para editar para cada proyecto, o no quieren recordar todos los comandos asociados con los programas keytools y jarsigner y solo quieren hacerlo en un proceso, use este programa:

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

Lo construí porque estaba harto del largo proceso de tener que escribir todas las ubicaciones de los archivos cada vez.

Este programa puede guardar su configuración, por lo que la próxima vez que lo inicie, solo necesita presionar Generar y lo manejará por usted. Eso es.

No requiere instalación, es completamente portátil y guarda sus configuraciones en un CSV en la misma carpeta.

Luke Alderton
fuente