2 votes

Remplacer une chaîne dans le manifeste au moment de la construction ne fonctionne pas avec Gradle 2.1.

Je reçois INSTALL_PARSE_FAILED_MANIFEST_MALFORMED erreur. Le problème est que la chaîne qui devrait être remplacée dans Android Manifest au moment de la construction ne l'est pas. Tout a commencé après que j'ai mis à jour la version 2.1 de Gradle Avant la mise à jour vers Gradle 2.1 (à partir de 2.0), mon code fonctionnait. Maintenant, j'obtiens le journal d'erreur suivant :

> Failed parse during installPackageLI
android.content.pm.PackageParser$PackageParserException: /data/app/vmdl264927358.tmp/base.apk (at Binary XML file line #16): Bad class name PACKAGE_NAME.permission.C2D_MESSAGE in package my.package.xyz
at android.content.pm.PackageParser.parseBaseApk(PackageParser.java:892)
at android.content.pm.PackageParser.parseClusterPackage(PackageParser.java:790)
at android.content.pm.PackageParser.parsePackage(PackageParser.java:754)
at com.android.server.pm.PackageManagerService.installPackageLI(PackageManagerService.java:12252)
at com.android.server.pm.PackageManagerService.-wrap25(PackageManagerService.java)
at com.android.server.pm.PackageManagerService$9.run(PackageManagerService.java:10170)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
at com.android.server.ServiceThread.run(ServiceThread.java:46)

Le code que j'utilise pour remplacer le PACKAGE_NAME est le suivant :

applicationVariants.all {variant ->
    def flavor = variant.productFlavors.get(0)
    def buildType = variant.buildType
    variant.outputs[0].processManifest.doLast {
        replaceInManifest(variant,
                          'PACKAGE_NAME',
                          [flavor.applicationId, buildType.applicationIdSuffix].findAll().join())
    }
}

def replaceInManifest ( variant, fromString, toString ) {
    def flavor = variant.productFlavors.get(0)
    def buildtype = variant.buildType
    def manifestFile = "$buildDir/intermediates/manifests/full/${flavor.name}/${buildtype.name}/AndroidManifest.xml"
    def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll(fromString, toString)
    new File(manifestFile).write(updatedContent, 'UTF-8')
}

Après la construction, j'ai vérifié le fichier AndroidManifest.xml dans le dossier /intermediates/manifests/full/${flavor.name}/${buildtype.name}/AndroidManifest.xml et tout a été remplacé. Il semble que l'ordre d'exécution de certaines parties du code dans le fichier Gradle et l'emballage dans le .apk aient été modifiés. Savez-vous ce que je dois faire pour résoudre ce problème ?

0voto

TheAppchemist Points 280

Quel est le nom de votre paquet ? J'ai eu ce problème une fois et le fait de changer le nom du paquet en petites caisses l'a réglé.

0voto

Vladimir Jovanović Points 1338

C'était le plus étrange des problèmes. Le problème était que j'avais ces lignes par accident dans mon gradle script :

compile 'com.github.frankiesardo:icepick:2.3.6'
provided 'com.github.frankiesardo:icepick-processor:2.3.6'
compile 'frankiesardo:icepick:3.2.0'
provided 'frankiesardo:icepick-processor:3.2.0'

Mais l'application a été construite sans erreur et a échoué lors de l'installation de l'apk.

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