【问题标题】:ProGuard Warning: can't write resource (Duplicate zip entry)ProGuard 警告:无法写入资源(重复的 zip 条目)
【发布时间】:2015-07-29 21:47:45
【问题描述】:

首先我知道这个问题已经存在于stackoverflow中,但是我无法解决它,尽管我尝试了不使用-injar、使用packagingOptions等的建议

我知道该版本会起作用,但我喜欢干净的构建。当我生成签名的 apk 时。清理项目后,我得到了这些错误:

Warning:can't write resource [.readme] (Duplicate zip entry [classes.jar:.readme])
Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [joda-time-2.8.1.jar:META-INF/LICENSE.txt])
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [joda-time-2.8.1.jar:META-INF/NOTICE.txt])

有时会出现 commons-collections4-4.0.jar(相同的 .readme、licence、notice)警告,而不是 joda-time-2.8.1.jar。

我尝试使用 PackagingOptions 排除那些,但它不起作用。

这是我的模块的 build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude '.readme'
    }

    defaultConfig {
        applicationId 'com.example.myapp'
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName '0.1'
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'org.apache.commons:commons-collections4:4.0'
    compile 'org.jsoup:jsoup:1.8.2'
    compile 'com.android.support:recyclerview-v7:22.2.0'
    compile 'com.android.support:cardview-v7:22.2.0'
    compile 'com.android.support:design:22.2.0'
    compile 'com.google.android.gms:play-services-gcm:7.5.0'
    compile 'joda-time:joda-time:2.8.1'
}

还有我的 proguard-rules.pro 文件

# Defaults
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

-keepnames class * implements java.io.Serializable

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclassmembers class * {
    public void *ButtonClicked(android.view.View);
}

# Use this to prevent errors in builds.
# usage of org.joda.time in this app does not need org.joda.convert
-dontwarn org.joda.convert.**


# Remove logs. Only when using 'proguard-android-optimize.txt'
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

提前致谢。

编辑:根据可能的重复警告 (Proguard warnings "can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry)") 的要求。问这个问题的用户说他正在使用多个模块(而不是一个)并且没有发布任何文件(由于敏感数据),所以我不知道它是否相同。还尝试了第一个答案中的所有可能选项,但都没有奏效。其他答案也不起作用(除了 -dontwarn 选项,出于明显的原因我不会使用它)。

【问题讨论】:

标签: android proguard android-proguard


【解决方案1】:

我很确定您在两个位置添加了这个罐子。

1# 在您的图书馆项目中 2# 在您的实施项目中(使用该库)

在这种情况下,您可以从实现项目中删除 jar,因为它将从库中打包。

或者..也许你已经在你的类路径中添加了jar,android会自动从libs文件夹中获取它,所以不需要将它添加到类路径中。

【讨论】:

  • 我只在gradle(maven)中指定那些依赖,如上图。该应用程序仅包含一个模块,并且在 app/libs 内只有 aniqroid.jar(不重复)。我搜索了整个项目文件夹,没有像 joda-time.jar 或 apache-commons.jar 这样的东西。当我打开项目结构窗口时,app/libs里面只有sdk Location、Project和app,没有库,或者除了maven依赖和aniqroid.jar之外的其他模块。
  • 在对文件等进行了一些挖掘之后,我回来了。至于重复的 .readme,我发现了问题。我搜索了 appcompat-design 和 appcompat-v7 中的 sdk 文件夹,我发现在各自的 .aar 文件中有一个 class.jar 文件,其中包含 design 和 v7 中的 .readme 文件。您可以通过创建一个空项目(只是一个主要活动)并在 build.gradle pastebin.com/YU560ckN 和 proguard-rules.pro pastebin.com/BFjwrYzc 中使用它来重现我最初问题的一部分。如果添加其余依赖项(无 jar),则会收到所有警告。你能确认一下吗?
  • 同样的问题,即使我不使用 proguard。在得到上述评论后——我只是从依赖项中删除了 appcombat-v7——这解决了问题。请你自己试试……
猜你喜欢
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多