android - samsung - huawei p10 ant+
Android firma con Ant (6)
La solución a largo plazo es parchear la tarea de signjar de Ant:
https://issues.apache.org/bugzilla/show_bug.cgi?id=52344
Los nuevos atributos se agregaron a signjar en Ant 1.8.3, pero el script de construcción de Android (a partir de r19) aún no se ha modificado para utilizarlos:
http://code.google.com/p/android/issues/detail?id=19567
Mientras tanto, "presetdef" puede proporcionar una solución alternativa:
<presetdef name="signjar">
<signjar sigalg="MD5withRSA" digestalg="SHA1" />
</presetdef>
Usando Ant, estoy tratando de construir una aplicación de Android en modo de lanzamiento para su distribución. Mi problema está en el proceso de firma. Creé un keystore y un alias a través de Eclipse usando el asistente Exportar aplicación Android y la aplicación está correctamente firmada si se exporta a través de Eclipse. Cuando intento completar el mismo proceso a través de Ant, hago referencia a mi keystore y alias en mi archivo build.properties:
key.store=C://Users//a512091//.android//release.keystore
key.alias=application
key.store.password=android
key.alias.password=android
El proceso de compilación es exitoso y recibo un archivo Application-release.apk. Optimicé este APK con jarsigner y todos los archivos tienen etiquetas "sm". Esta es la cola de la salida:
jar verified.
Warning:
This jar contains entries whose certificate chain is not validated.
Cuando intento instalar este APK en un emulador o dispositivo, obtengo lo siguiente:
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
Logcat muestra problemas de firma en mi archivo CSS y activos de imagen:
11-07 11:06:20.060: WARN/PackageParser(58): Exception reading assets/www/css/base.css in /data/app/vmdl48898.tmp
11-07 11:06:20.060: WARN/PackageParser(58): java.lang.SecurityException: META-INF/XXXXX.SF has invalid digest for assets/www/res/droidhdpi/favorite_off.png in /data/app/vmdl48898.tmp
11-07 11:06:20.060: WARN/PackageParser(58): at java.util.jar.JarVerifier.verifyCertificate(JarVerifier.java:369)
11-07 11:06:20.060: WARN/PackageParser(58): at java.util.jar.JarVerifier.readCertificates(JarVerifier.java:272)
11-07 11:06:20.060: WARN/PackageParser(58): at java.util.jar.JarFile.getInputStream(JarFile.java:392)
11-07 11:06:20.060: WARN/PackageParser(58): at android.content.pm.PackageParser.loadCertificates(PackageParser.java:337)
11-07 11:06:20.060: WARN/PackageParser(58): at android.content.pm.PackageParser.collectCertificates(PackageParser.java:508)
11-07 11:06:20.060: WARN/PackageParser(58): at com.android.server.PackageManagerService.installPackageLI(PackageManagerService.java:5885)
11-07 11:06:20.060: WARN/PackageParser(58): at com.android.server.PackageManagerService.access$2100(PackageManagerService.java:134)
11-07 11:06:20.060: WARN/PackageParser(58): at com.android.server.PackageManagerService$5.run(PackageManagerService.java:4743)
11-07 11:06:20.060: WARN/PackageParser(58): at android.os.Handler.handleCallback(Handler.java:587)
11-07 11:06:20.060: WARN/PackageParser(58): at android.os.Handler.dispatchMessage(Handler.java:92)
11-07 11:06:20.060: WARN/PackageParser(58): at android.os.Looper.loop(Looper.java:123)
11-07 11:06:20.060: WARN/PackageParser(58): at android.os.HandlerThread.run(HandlerThread.java:60)
11-07 11:06:20.069: ERROR/PackageParser(58): Package com.xxxxx.xxxxx has no certificates at entry assets/www/css/base.css; ignoring!
Parece que puedes estar usando JDK 7 (1.7.0) así que intenta agregar estas opciones cuando firmes con jarsigner:
-digestalg SHA1 -sigalg MD5withRSA
Según la documentación del desarrollador de Android , debe colocar estas propiedades dentro del archivo ant.properties:
$ cat ant.properties
key.store=C://Users//a512091//.android//release.keystore
key.alias=application
key.store.password=android
key.alias.password=android
Si está atascado (como yo) con una versión de Ant anterior a la 1.8.3 y Java 7, aquí hay una solución alternativa:
<exec executable="${java.bin.path}/jarsigner">
<arg value="-signedjar"/>
<arg value="signed-${app.apk.name}"/>
<arg value="-keystore"/>
<arg value="my.keystore"/>
<arg value="-storepass"/>
<arg value="passwd"/>
<arg value="-sigalg"/>
<arg value="MD5withRSA"/>
<arg value="-digestalg"/>
<arg value="SHA1"/>
<arg value="${app.apk.name}"/>
<arg value="my_keystore"/>
</exec>
<!-- Where old version was: -->
<signjar
alias="my_keystore" keystore="my.keystore"
storepass="passwd"
preservelastmodified="true"
signedjar="signed-${app.apk.name}">
<path>
<fileset dir="." includes="${app.apk.name}" />
</path>
</signjar>
Si tiene la versión Ant <1.8.3 ( ant -version
) pruebe este enfoque para el problema con JDK 7 (basado en la respuesta anterior):
Agrega signjarjdk7 a ANDROID_SDK / tools / ant / build.xml
<macrodef name="signjarjdk7"> <attribute name="jar" /> <attribute name="signedjar" /> <attribute name="keystore" /> <attribute name="storepass" /> <attribute name="alias" /> <attribute name="keypass" /> <attribute name="verbose" /> <sequential> <exec executable="jarsigner" failonerror="true"> <!-- Magic key, always verbose --> <arg line="-verbose -digestalg SHA1 -sigalg MD5withRSA" /> <arg line="-keystore @{keystore} -storepass @{storepass} -keypass @{keypass}" /> <arg line="-signedjar "@{signedjar}"" /> <arg line=""@{jar}" @{alias}" /> </exec> </sequential> </macrodef>
Reemplaza
''signjar''
por''signjarjdk7''
en''release''
objetivo''release''
en el mismo build.xml.
NOTA: Debe definir las propiedades ''key.store.password'' y ''key.alias.password'' para su proyecto (en project.properties o en local.properties).
ACTUALIZACIÓN 1:
Si ha instalado Ant 1.8.3 (o posterior), tiene una mejor solución:
Abra su ANDROID_SDK / tools / ant / build.xml y agregue dos nuevos parámetros - sigalg y digestalg - en la invocación original de ''signjar'':
<signjar
sigalg="MD5withRSA"
digestalg="SHA1"
jar="${out.packaged.file}"
signedjar="${out.unaligned.file}"
keystore="${key.store}"
storepass="${key.store.password}"
alias="${key.alias}"
keypass="${key.alias.password}"
verbose="${verbose}" />
ACTUALIZACIÓN 2: Parece que esta respuesta está en desuso después de que ''signjar'' se reemplazó por ''signapk'' en la última versión de las herramientas de Android SDK.
Usando Ubuntu 14.04 (Trusty Tahr) y Windows, crea un archivo ".keystore".
Este archivo debe generarse, lo que se puede hacer con el comando keytool que viene con Java. Normalmente se puede encontrar en ''C: / Archivos de programa / Java / jre7 / bin''. Que también debe agregarse a su variable PATH.
Vaya a la raíz de su proyecto y use este comando:
Generando un archivo .keystore:
$ keytool -genkey -v -keystore key-name.keystore -alias alias-name -keyalg RSA -keysize 2048 -validity 10000
Cree un archivo llamado ant.properties en la carpeta "plataformas / android /" ant.properties.
key.store=D://path//to//the//project//keyname.keystore
key.alias=alias-name
Crea el archivo APK de compilación:
$ cordova build android --release