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

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.

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.