(重复的 zip 条目 [coolLib.jar:{pkg}/BuildConfig.class])

(Duplicate zip entry [coolLib.jar:{pkg}/BuildConfig.class]))

我在 Android Studio 2.3.0 beta4 中有一个 android 项目,它依赖于库项目 CoolLib.

CoolLib 在其 libs[=34= 中的 jar 文件 coolLib.jar 中有源代码] 文件夹。 coolLib.jar 包含文件 {pkg}/BuildConfig.class.

当我尝试在 Android API-22+ 的 device/emulator 中构建和 运行 项目时,它 运行 非常完美,但是当我尝试在 API VERSION < 22 的 device/emulator 上做同样的事情,Android Studio fails to build with an Exception--

Warning: Exception while processing task java.io.IOException: Can't write [D:\AndroidStudioProjects\CoolProject\app\build\intermediates\transforms\proguard\debug\jarsf\main.jar] (Can't read [D:\AndroidStudioProjects\CoolProject\CoolLib\build\intermediates\bundles\default\libs\coolLib.jar(;;;;;;**.class)] (Duplicate zip entry [coolLib.jar:{pkg}/BuildConfig.class])) :app:transformClassesAndResourcesWithProguardForDebug FAILED

项目build.gradle包含以下版本的支持库等--

ext {
supportLibVer = '25.1.1'
playServiceVer = '10.0.1'

buildToolsVer = "25.0.2"

compileSdkVer = 25
targetSdkVer = 25
minSdkVer = 16
}


dependencies {
compile files('libs/FLurry_3.2.2.jar')
compile files('libs/jxl-2.6.12.jar')

compile project(':CoolLib')

compile files('libs/gcm.jar')
compile "com.google.android.gms:play-services-ads:$playServiceVer"
compile "com.android.support:appcompat-v7:$supportLibVer"
compile "com.android.support:design:$supportLibVer"
compile "com.android.support:cardview-v7:$supportLibVer"
compile "com.android.support:support-v13:$supportLibVer"
compile 'com.github.bumptech.glide:glide:3.7.0'
}

好的,我找到了解决方案。

为什么-

我在 gradle 控制台中比较了 API22(构建成功)和 API16(构建失败)的构建步骤。在 API22,控制台说-

+Instant Run: Proguard is not compatible with instant run. It has been disabled for debug

+Instant Run: Resource shrinker automatically disabled for debug

..构建成功。当我禁用 InstantRun 时,它在 API22 上也失败了。

原因-

问题出在 proguard 配置中。 BuildConfig.class of coolLib.jar 被定义为保存在 proguard-project.txt ,因此它将所有 .class 文件保留在该包中,但 BuildConfig.class 必须根据主项目在构建时修改。

解决方案-

我删除了 -keep 声明,它非常有效。

我遇到了同样的问题。

我的解决方法是将 packageBuildConfig = false 放入库项目 build.gradle 文件的 android { ... } 部分:

android {
    packageBuildConfig = false
    ...
}

即使它已被弃用,它仍然有效。