Error de "archivo de paquete no firmado correctamente": detecte si ocurre o no con la aplicación de Google Play.
Tengo problemas con el error descrito en las siguientes preguntas:
Publicado Android apk da error "El archivo de paquete no estaba firmado correctamente"
Algunos usuarios (pero no todos) reciben "El archivo del paquete no se firmó correctamente" al descargar mi aplicación desde Google Play
- Fallo
- ¿Genera un almacén de claves para una aplicación de Android en el asistente Exportar aplicación de Android?
- Perdió la clave privada para firmar android apk. ¿Se puede publicar la aplicación en Android Market?
- Cambio de contraseña de contraseña de firma de android
- ¿Cómo puedo firmar automáticamente las solicitudes de facturación?
Específicamente, cuando algunos usuarios intentan descargar mi aplicación de Google Play, obtienen el error, otros no.
Mi pregunta es: ¿cómo detectar antes de la presentación si el problema va a ocurrir o no?
Por lo que vale, cuando corro
jarsigner -verify -verbose -certs myapk.apk
Veo algo como lo siguiente:
86226 Dom Nov 09 10:34:54 EET 2014 META-INF / MANIFEST.MF X.509, // [material personal omitido] [el certificado es válido del 8/20/14 8:04 AM al 1/5/42 7 : 04 AM] [CertPath no validado: Path no encadena con ninguno de los anclajes de confianza] // varios cientos de entradas como el anterior, y luego: jar verificado.
Advertencia: Este tarro contiene entradas cuya cadena de certificados no está validada. Este frasco contiene firmas que no incluyen una marca de tiempo. Sin una marca de tiempo, los usuarios pueden no ser capaces de validar este tarro después de la fecha de caducidad del certificado de firmante (2042-01-05) o después de cualquier fecha de revocación futura.
- ¿Qué precauciones y advertencias debemos conocer al usar el nuevo "APK Signature Scheme v2"?
- Archivo de configuración de inicio de sesión de Google para varios desarrolladores
- Firmar APK sin poner información de almacén de claves en build.gradle
- Gradle firma sabores con diferentes claves en Android
- Cómo se firman los archivos .apk
- Aplicación Android de Eclipse: Ejecutar firmada con certificado real
- Descripción del almacén de claves, certificados y alias
En realidad, este es un problema común y supongo que debe estar utilizando Java 7 o posterior.
Solución
Ejecutar jarsigner:
jarsigner -verbose -verify -keystore ${KEYSTORE_PATH} ${YOU_JAR_FILE}
Echa un vistazo aquí
No es realmente una prueba para ver si el apk está firmemente firmado, pero siento que esto es útil:
Tengo este problema hace un tiempo, mi solución: firmar a mano.
Aquí está el script:
#!/bin/bash storepass="your store pass" keypass="your key pass" alias="alias" if [ $# -lt 1 ]; then echo "$0 <apk file>" exit 1; fi filename=$(basename "$1") extension="${filename##*.}" filename="${filename%.*}" if [ $extension != "apk" ]; then echo "Inputfile is no apk!" exit 1; fi cp $filename.apk $filename-tmp.apk zip -d $filename-tmp.apk "META-INF*" rm -rf $filename-signed.apk jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $keystore -storepass $storepass -keypass $keypass $filename-tmp.apk $alias /Developer/android-sdk-macosx/build-tools/20.0.0/zipalign -f -v 4 $filename-tmp.apk $filename-signed.apk rm -rf $filename-tmp.apk
Es posible que deba actualizar la configuración. Lo he probado con varios dispositivos (Galaxy Note 10.5, Samsung Galaxy S3, S5, Nexus 4, Lenovo Tab)
Parece que funciona hasta ahora.
(Firmado en Mac OSX)
Cordova construir android –release
Antes de asegurarse de configurarlo: Cree un archivo ant.properties en plataformas / android / con una ruta de acceso de claves y un nombre de alias:
Key.store = / path / to / keystore / release_key_name.keystore key.alias = alias_name
Se le solicitará la contraseña.
El APK se creará en las plataformas / android / ant-build / app_name-release.apk.
Fuente http://ilee.co.uk/Sign-Releases-with-Cordova-Android/
Cómo detectar antes de la presentación si el problema va a ocurrir o no
Si ejecuta jarsigner -verify -verbose -certs myapk.apk
antes de enviar su compilación y no recibe ninguna advertencia como la que está viendo, entonces el problema no va a ocurrir.
Por lo que vale la pena, en OSX evitar este problema cambiando temporalmente a Java 6 sólo para la versión de la versión:
sudo cp -R /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /Library/Java/JavaVirtualMachines/1.6.0.jdk sudo mv /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk ~/Desktop/jdk1.8.0_31.jdk java -version // shows java version "1.6.0_65" yay!!
Hacer mi compilación sin el certificado y los errores timestamped. Y volver a Java 8:
sudo mv ~/Desktop/jdk1.8.0_31.jdk /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk
Utilice eclipse proguard para ese asunto y reemplace su contenido proguard.cfg con eso: (tenga en cuenta que si está utilizando android studio puede importar el proyecto para eclipsar mediante la importación)
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -dontpreverify -dontshrink -verbose -injars bin/classes -injars libs -outjars bin/classes-processed.jar -dontwarn org.apache.** -dontwarn org.slf4j.** -dontwarn org.json.* -dontwarn org.mortbay.** -dontwarn org.apache.log4j.** -dontwarn org.apache.commons.logging.** -dontwarn org.apache.commons.logging.** -dontwarn org.apache.commons.codec.binary.** -dontwarn javax.xml.** -dontwarn javax.management.** -dontwarn java.lang.management.** -dontwarn android.support.** -dontwarn com.google.code.** -dontwarn oauth.signpost.** -dontwarn twitter4j.** -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keep public class com.google.code.linkedinapi.** -keep class javax.** { *; } -keep class org.** { *; } -keep class java.lang.management.** { *; } # use the keep command in that format for your third party libraries -keepclassmembers public class com.google.code.linkedinapi.client.impl.LinkedInApiXppClient { public <init>(java.lang.String, java.lang.String); } -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
Este es un problema de herramientas JAVA. Esto ocurre frecuentemente con la mezcla de herramientas JDK y JRE en el sistema. No utilice las herramientas de Java 7. Sólo utilice las herramientas de JDK 6.
Opcionalmente, podemos dejar de perder más tiempo pegando la salida de lo siguiente para que ambos se sientan que han hecho algo:
which jar signer jarsigner -verify -verbose -certs yourJar.jar
Por favor, revise esto para más detalles