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 ?