【问题标题】:proguard - Duplicate zip entry classes.jarproguard - 重复的 zip 条目 classes.jar
【发布时间】:2018-10-22 20:46:21
【问题描述】:
我无法构建签名的 apk。我在我的项目中实现了这个库:https://github.com/anjlab/android-inapp-billing-v3
在我实现它之后,当我尝试生成 apk 时出现此错误:
Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
> java.io.IOException: Can't write [C:\Users\Admin\StudioProjects\MealPlanner\app\build\intermediates\transforms\proguard\release\jars\3\1f\main.jar] (Can't read [C:\Users\Admin\StudioProjects\MealPlanner\app\build\intermediates\exploded-aar\com.android.billingclient\billing\1.0\jars\classes.jar(;;;;;;**/*.class)] (Duplicate zip entry [classes.jar:com/android/vending/billing/IInAppBillingService$Stub$Proxy.class]))
我的项目中没有任何aidl 文件,我尝试使用 outjars 并将其从 build.gradle 中排除,但问题仍然存在。
有什么办法解决这个问题吗?
【问题讨论】:
标签:
android
proguard
in-app-billing
android-proguard
【解决方案1】:
当我尝试在Android Studio 3.2.1、buildtools version 28.0.3 中为 Google Play 构建应用内计费应用(基于他们的 TrivialDrive 示例)时,我还发现签名版本 APK 的生成被 Java.IO.Exception, transformClassesAndResourcesWithProguardForRelease, duplicate zip entry classes etcetera 阻止...
首先我按照互联网上的建议来调整proguard pro文件,然后我更新了buildtools版本,多次更改我的gradle文件,没有任何帮助!
奇怪的是,2 周前原始的 trivialdrive 示例构建没有问题,其依赖项包括“com.android.billingclient:billing:1.1”。
删除实现'com.android.billingclient:billing:1.1'后,构建成功!
所以我认为应用内计费依赖要求有所改变??
【解决方案2】:
我最近在添加第三方库(开源)后遇到了这个问题,并且花了很多时间努力解决问题。堆栈溢出有很多问题和围绕它的讨论。每个人都提出了不同的解决方案但是我关注了this one,它建议更正版本号。但这并不能解决我的问题。
由于我的情况与您的情况相同(即"Duplicate zip entry" 和"java.io.IOException: Can't write"),所以我想回答您的问题。
这是我所做的(除了上面提到的版本更改):
在您添加的库的 build.gradle 中,添加以下内容:
buildTypes
{
release
{
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'billing-proguard-rules.pro'
}
debug
{
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'billing-proguard-rules.pro'
}
}
您的 billing-proguard-rules.pro 应该如下所示:
-keep public class * extends com.anjlab.android.iab.v3.** { *; }
-keepclassmembernames class * extends com.anjlab.android.iab.v3.** { *; }
由于您导入的计费库是开源的(就像我的情况一样),因此可以保持原样。
你准备好了!