37 votes

Signature Android avec ANT

Je suis en train de construire une application Android sur le mode de diffusion pour la distribution via ANT. Mon problème est le processus de signature. J'ai créé un fichier de clés et alias via Eclipse à l'aide de l'Exportation d'une Application Android assistant et que l'application est correctement signé si l'exporter via Eclipse. Lorsque je tente d'effectuer le même processus via ANT je référence mon fichier de clés et d'alias dans mon construire.fichier de propriétés:

key.store=C:\\Users\\a512091\\.android\\release.keystore
key.alias=application
key.store.password=android
key.alias.password=android

Le processus de compilation est réussie et je reçois une Demande de libération.fichier apk. Je veryfied cette apk avec jarsigner et tous les fichiers ont "sm" balises. C'est la queue de la sortie:

jar verified.
Warning:
This jar contains entries whose certificate chain is not validated.

Lorsque j'essaie d'installer cette apk dans un émulateur de périphérique ou je reçois le texte suivant:

Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Logcat montre la signature de problèmes sur mon fichier css et des actifs d'image:

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!

49voto

FeelGood Points 2769

Si vous avez des ant version < 1.8.3 (ant -version) essayez cette approche pour le problème avec le JDK 7 fondant à la réponse précédente.

  1. Ajouter signjarjdk7 à 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 &quot;@{signedjar}&quot;" />
                <arg line="&quot;@{jar}&quot; @{alias}" />
            </exec>
        </sequential>
    </macrodef>
    
  2. Remplacer 'signjar' de 'signjarjdk7' en 'release' de la cible dans le même build.xml.

REMARQUE: Vous devez définir la touche.magasin.le mot de passe' et 'clé.alias.le mot de passe' propriétés de votre projet (dans le projet.propriétés ou en local.les propriétés).

Mise à JOUR 1:

Si vous avez installé ant-1.8.3+ vous avez une meilleure solution:

Ouvrez vous ANDROID_SDK\tools\ant\build.xml et d'ajouter deux nouveaux paramètres - sigalg et digestalg - dans original "signjar' invocation:

    <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}" />

Mise à JOUR 2: Il semble que la réponse est obsolète après "signjar" a été remplacé à "signapk" dans la dernière version d'Android SDK tools.

9voto

mr-euro Points 997

Il semble que vous utilisiez JDK 7 (1.7.0). Essayez donc d’ajouter ces options lors de la signature avec jarsigner:

 -digestalg SHA1 -sigalg MD5withRSA
 

6voto

Plinio.Santos Points 610

Selon la documentation destinée aux développeurs Android , vous devez placer ces propriétés dans le fichier ant.properties:

 $ cat ant.properties
key.store=C:\\Users\\a512091\\.android\\release.keystore
key.alias=application
key.store.password=android
key.alias.password=android
 

2voto

Joe Bowbeer Points 878

La solution à long terme est de patch de la Fourmi signjar tâche:

https://issues.apache.org/bugzilla/show_bug.cgi?id=52344

Les nouveaux attributs ont été ajoutés à signjar en Ant 1.8.3, mais Android est le script de construction (comme des r19) n'a pas encore été modifiés pour l'utiliser:

http://code.google.com/p/android/issues/detail?id=19567

En attendant, "presetdef" peut fournir une solution de contournement:

 <presetdef name="signjar">
  <signjar sigalg="MD5withRSA" digestalg="SHA1" />
 </presetdef>

0voto

hemisphire Points 694

Si vous êtes bloqué (comme moi) avec une version de ant antérieure à 1.8.3 et Java 7, voici une solution de contournement:

 <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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X