在构建时间中替换清单中的字符串并不适用于Gradle 2.1

时间:2016-05-10 18:29:28

标签: android android-gradle

我收到INSTALL_PARSE_FAILED_MANIFEST_MALFORMED错误。 问题是在构建时间内应该在Android Manifest中替换的String不是。全部在我更新Gradle 2.1版后开始 在更新到Gradle 2.1(从2.0)之前,我的代码正在运行。现在我得到以下错误日志:

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

我用来替代PACKAGE_NAME的代码是:

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')
}

在构建之后,我在文件夹/intermediates/manifests/full/${flavor.name}/${buildtype.name}/AndroidManifest.xml中检查了AndroidManifest.xml文件,所有内容都被替换了。似乎执行顺序在Gradle文件中的某些部分代码和.apk中的包装都被更改了。 你知道我要做些什么来解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

你的包裹名称是什么?我曾经有过一次,将包名更改为小案例修复了我的问题

答案 1 :(得分:0)

这是有史以来最奇怪的问题。问题是我在我的gradle脚本中偶然出现了这些行:

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'

但是应用程序是在没有错误的情况下构建的,而不是在安装apk上失败。