Android - Proguard重复zip条目错误 - Android支持库

4

我正在尝试在使用android库项目android应用程序中使用Proguard。 我的核心android项目依赖于两个android库项目。核心和库项目都依赖于android支持库(在我的情况下是:android-support-v4.jar)。 当我尝试使用ProGuard混淆它时,我总是会得到以下错误(如果在Gradle脚本中禁用了Proguarg,则编译正常运行):

:MYANDROIDPROJECT:proguardDemoRelease FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':MYANDROIDPROJECT:proguardDemoRelease'.
> java.io.IOException: Can't write [MYANDROIDPROJECT_PATH\build\intermediates\classes-proguard\demo\release\classes.jar] (Can't read [MYANDROIDPROJECT_PATH\build\intermediates\exploded-aar\com.android.support\support-v4\21.0.3\classes.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [classes.jar:android/support/v4/graphics/drawable/DrawableCompat$HoneycombDrawableImpl.class]))

我的核心项目Gradle构建脚本:
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.2+'
    }
}

apply plugin: 'android'

android {
    buildToolsVersion "19.1.0"
    compileSdkVersion 19

    lintOptions {
        abortOnError false
    }

    signingConfigs {
        localks {
            storeFile file("keystore/keystore")
            storePassword "xx"
            keyAlias "xx"
            keyPassword "xx"
        }
    }

    buildTypes {
        debug {
            debuggable true
            runProguard false       
            zipAlign true
            signingConfig signingConfigs.localks
        }

        release {
            debuggable false   
            zipAlign true
            proguardFile 'proguard.txt'
            runProguard true        
            signingConfig signingConfigs.localks
        }
    }

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        ndk{
            moduleName "S3DClient"
            abiFilter "armeabi-v7a"
            stl "gnustl_static"
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            resources.srcDirs = ['src/main/java']
            aidl.srcDirs = ['src/main/java']
            renderscript.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
            jni.srcDirs = []
        }
        paid {
            manifest.srcFile 'src/paid/AndroidManifest.xml'
            java.srcDirs = ['src/paid/java']
            res.srcDirs = ['src/paid/res']

            jni.srcDirs = []
        }
        demo {
            manifest.srcFile 'src/demo/AndroidManifest.xml'
            java.srcDirs = ['src/demo/java']
            res.srcDirs = ['src/demo/res']

            jni.srcDirs = []
        }
    }

    productFlavors {
        paid {
            applicationId = "hu.myprojectpackage1"
        }
        demo {
            applicationId = "hu.myprojectpackage2"
        }
    }
}

dependencies {
    compile files('src/main/libs/sqliteassethelper-2.0.1.jar',
                  'src/main/libs/S3DXAndroidTools.jar',
                  'src/main/libs/roboguice-2.0.jar',
                  'src/main/libs/open-javageom.jar',
                  'src/main/libs/openawt.geom.jar',
                  'src/main/libs/libGoogleAnalyticsServices.jar',
                  'src/main/libs/javax.inject-1.jar',
                  'src/main/libs/guice-3.0-no_aop.jar',
                  'src/main/libs/commons-lang3-3.1.jar',
                  'src/main/libs/bugsense-3.6.jar')
    compile fileTree(dir: "$buildDir/native-libs", include: '*.jar')

    compile 'com.android.support:support-v4:21.0.+'

    compile project(":lib/SlidingLayer")

    compile project(':lib/BlutoothCommunicationHandler') 
    paidCompile project(':lib/Licencing')
}

其中一个库项目的Gradle构建脚本:

apply plugin: 'android-library'

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.2+'
    }
}
dependencies {
   compile "com.android.support:support-v4:19.0.+"
}

android {
    buildToolsVersion "19.1.0"
    compileSdkVersion 19

    defaultConfig {
        minSdkVersion 4
        targetSdkVersion 18
    }
    dexOptions {
        preDexLibraries = false
    }

    lintOptions {
        abortOnError false
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
        }
    }
}

相关ProGuard配置如下:

-libraryjars src/main/libs/android-support-v4.jar

-keep class android.** { *; }
-keep class android.support** { *; }

-dontnote
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-dontwarn org.openawt.**
-dontwarn android.support.**

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose

-assumenosideeffects class android.util.Log {
    public static *** e(...);
    public static *** w(...);
    public static *** wtf(...);
    public static *** d(...);
    public static *** v(...);
}
-keepattributes Signature
-keepattributes *Annotation*

如果您要使用Gradle,请将这些依赖项更改为Maven依赖项。然后使用android.packagingOptions来排除导致问题的文件。 - Jared Burrows
谢谢您的快速回复。请问您能否更深入地描述一下,在这种情况下如何实现它? - BertZ
这个现在的状态是什么? - Jared Burrows
1个回答

7

主项目 build.gradle

花些时间将这些本地的 jars 转换一下:

dependencies {
    compile files('src/main/libs/sqliteassethelper-2.0.1.jar',
                  'src/main/libs/S3DXAndroidTools.jar',
                  'src/main/libs/roboguice-2.0.jar',
                  'src/main/libs/open-javageom.jar',
                  'src/main/libs/openawt.geom.jar',
                  'src/main/libs/libGoogleAnalyticsServices.jar',
                  'src/main/libs/javax.inject-1.jar',
                  'src/main/libs/guice-3.0-no_aop.jar',
                  'src/main/libs/commons-lang3-3.1.jar',
                  'src/main/libs/bugsense-3.6.jar')
    compile fileTree(dir: "$buildDir/native-libs", include: '*.jar')

    compile 'com.android.support:support-v4:21.0.+'

    compile project(":lib/SlidingLayer")

    compile project(':lib/BlutoothCommunicationHandler') 
    paidCompile project(':lib/Licencing')
}

可以轻松管理的Maven依赖(我已经为您找到了大部分!):
dependencies {
    // compile fileTree(dir: 'libs', include: '*.jar') // all others
    compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
    compile file('src/main/libs/S3DXAndroidTools.jar')
    compile 'org.roboguice:roboguice:2.0' // latest is 3.0.1
    compile 'com.google.android.gms:play-services:6.1.71' // latest is 6.8.57 (issues)
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'com.bugsense.trace:bugsense:3.6'
    compile fileTree(dir: "$buildDir/native-libs", include: '*.jar')
    compile 'com.android.support:support-v4:21.0.3'
    compile project(":lib/SlidingLayer")
    compile project(':lib/BlutoothCommunicationHandler') 
    paidCompile project(':lib/Licencing')
}

之后,您应该可以使用android.packagingOptions:

    packagingOptions {
        exclude '.readme'
        exclude 'LICENSE.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/README.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/services/javax.annotation.processing.Processor'
    }

Library Project build.gradle

您的库项目需要进行更改,从:

dependencies {
   compile "com.android.support:support-v4:19.0.+"
}

to:

dependencies {
   compile 'com.android.support:support-v4:21.0.3'
}

你的主要问题是你在库项目和主项目中都有两个不同版本的com.android.support:support-v4

谢谢。我根据您的建议修改了我的代码,但错误仍然存在(重复的zip条目),您还有其他想法吗? - BertZ
@BertZ 你需要将那个“entry”添加到packagingOptions中。 - Jared Burrows
我将以下代码添加到gradle脚本中,它包含该条目,但对于重复的zip条目错误没有任何影响: - BertZ
我也尝试了你上次的建议,谢谢。我非常感激你的支持,但是错误还是一样的。 - BertZ
@BertZ 我也遇到了同样的错误。你解决了吗?谢谢。 - savepopulation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接