Android-Proguard重复的zip输入错误-Android支持库 [英] Android - Proguard duplicate zip entry error - Android Support Library

查看:98
本文介绍了Android-Proguard重复的zip输入错误-Android支持库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在使用 android库项目 android应用中使用 Proguard . 我的核心android项目取决于两个android库项目.核心项目和库项目依赖于 android支持库(在我的情况下:android-support-v4.jar). 当我尝试使用ProGuard对其进行混淆时,总是会出现以下错误(如果在Gradle脚本中禁用了Proguarg,则编译可以正常进行.):

I am trying to use Proguard in an android application which uses android library projects. My core android project depends on two android library projects. The core and the library projects have dependencies on android support library (in my case: android-support-v4.jar). When I try to obfuscate it with ProGuard, then I always get the following error (If the Proguarg is disabled in the Gradle script, then the compilation works fine.):

: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构建脚本:

The Gradle build script for my core project:

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构建脚本:

The Gradle build script for one of the library projects:

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配置的(相关部分)是:

The (relevant part of) ProGuard config is:

-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*

推荐答案

主项目build.gradle:

花一些时间转换这些本地jar:

Main Project build.gradle:

Take some time to convert these local 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依赖关系(我试图为您找到大多数依赖关系!):

To Maven Dependencies that can be managed easily(I tried to find most of them for you!):

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:

After that, you should be able to use 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'
    }

图书馆项目build.gradle

您的图书馆项目需要从以下位置进行更改:

Library Project build.gradle

Your library project needs to be changed from:

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

收件人:

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

您的主要问题是您有两个不同的com.android.support:support-v4,一个在您的库项目中,另一个在您的主项目中.

Your main issue was that you had two different com.android.support:support-v4, one in your library project and one in your main project.

这篇关于Android-Proguard重复的zip输入错误-Android支持库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆