Android:在proguard中重复类错误

JMR*_*ies 9 android proguard gradle

编译我的应用程序时,我收到以下错误(编辑出的敏感路径)

Execution failed for task ':app:proguardDebug'.
> java.io.IOException: Can't write [/projects/app/build/intermediates/classes-proguard/debug/classes.jar] (Can't read [/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/4216af16d38465bbab0f3dff8efa14204f7a399a/commons-codec-1.4.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [commons-codec-1.4.jar:org/apache/commons/codec/binary/Base64.class]))
Run Code Online (Sandbox Code Playgroud)

这向我表明,编译器会看到应用程序尝试使用commons.codec.binary.Base64.class作为依赖项的两个位置.我再次检查并检查了我的库,但只有一个库(Amazon AWS)正在尝试使用它.

在这个错误之上,我得到了一些其他的警告,这些警告也为我引起了一个红旗:

Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [commons-lang3-3.1.jar:META-INF/LICENSE.txt])
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [commons-lang3-3.1.jar:META-INF/NOTICE.txt])
Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [commons-codec-1.4.jar:META-INF/LICENSE.txt])
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [commons-codec-1.4.jar:META-INF/NOTICE.txt])
Run Code Online (Sandbox Code Playgroud)

我根本没有在我的应用程序中明确使用commons-codec-1.4或commons-lang3-3.1,以为我以后在使用lang3之前将其删除.为什么在编译日志中引用它们?我的一个maven图书馆可以使用它们吗?我将在gradle文件中包含下面的maven库列表.

这是我的proguard和gradle文件供参考:

ProGuard的

-keep class org.w3c.dom.bootstrap.** { *; }
-keep class org.joda.time.** { *; }
-keep class com.facebook.** { *; }
-keep class org.apache.commons.** { *; }
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-dontwarn org.codehaus.jackson.map.ext.**
-dontwarn oauth.**
-dontwarn com.amazonaws.**
-dontwarn org.joda.time.**
-dontwarn org.apache.commons.codec.**
-dontwarn com.fasterxml.jackson.databind.ext.**
Run Code Online (Sandbox Code Playgroud)

摇篮

apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'

    defaultConfig {
        applicationId 'com.my.package'
        minSdkVersion 14
        targetSdkVersion 20
        versionCode 9
        versionName '1.2'
    }

    buildTypes {
        release {
            debuggable false
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
        debug {
            debuggable true
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    lintOptions {
        checkReleaseBuilds false
    }

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

dependencies {
    compile fileTree(dir: 'libs',  include: ['*.jar'])

    //noinspection GradleDependency
    compile 'com.google.android.gms:play-services:5.0.89'

    compile 'com.nineoldandroids:library:2.4.0'
    compile 'com.viewpagerindicator:library:2.4.1@aar'
    compile 'se.emilsjolander:StickyScrollViewItems:1.1.0'
    compile 'se.emilsjolander:stickylistheaders:2.5.0'
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.2'
    compile project(':facebook')
    compile 'com.tumblr:jumblr:0.0.10'
    compile 'com.android.support:support-v4:20.0.0'
}
Run Code Online (Sandbox Code Playgroud)

我最好的猜测是这些库中的一个或多个使用apache lang3和codec作为它们自己的依赖项,这在编译应用程序时会导致冲突.这个问题只发生在我将亚马逊包含在必需的jar中时,所以我知道这在某种程度上是罪魁祸首,但我不知道还有什么与之相冲突.

我读了一些关于在proguard中使用-injars的内容,但根据他们的文档,Android不需要你使用它.

任何建议将不胜感激,谢谢!

小智 0

造成这个问题的原因是jar文件重复。

在您的项目目录中,尝试查找并删除

/projects/app/build/intermediates/classes-proguard/debug/classes.jar](无法读取[/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/4216af16d38465bbab0f3dff8efa14204f7a399a /commons-codec-1.4.jar

这个 jar 文件,看看是否有任何变化。另外,如果同一目录或上层目录中有 commons-lang3-3.1.jar,请尝试删除它并重建。

希望能帮助到你!