使用Gradle构建APK时出现错误

5

使用Gradle构建APK时,控制台出现以下错误:

如果将minifyEnabled设置为false,则错误消失。看起来存在重复的包。

:app:collectDebugMultiDexComponents
:app:transformClassesWithMultidexlistForDebug
ProGuard, version 5.2.1
Reading program jar [<My_Android_Project>/app/build/intermediates/transforms/proguard/debug/jars/3/1f/main.jar]
Reading library jar [<My_Android_SDK>/build-tools/23.0.2/lib/shrinkedAndroid.jar]
Preparing output jar     [<My_Android_Project>/app/build/intermediates/multi-dex/debug/componentClasses.jar]
Copying resources from program jar [<My_Android_Project>/app/build/intermediates/transforms/proguard/debug/jars/3/1f/main.jar]
:app:transformClassesWithDexForDebug
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}
Error:Error converting bytecode to dex: 
Cause: java.lang.RuntimeException: Translation has been interrupted
Execution failed for task ':app:transformClassesWithDexForDebug'.

> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.
ExecException: Process 'command <My_JDK_PATH>/bin/java'' finished with non-zero exit value 2

build.gradle如下:

......
buildTypes {
    debug {
        minifyEnabled true
        zipAlignEnabled false
        shrinkResources false
        proguardFiles 'proguard_legacy.cfg'
        signingConfig signingConfigs.debug
    }
    release {
        minifyEnabled true
        zipAlignEnabled true
        shrinkResources true
        proguardFiles 'proguard_legacy.cfg'
        signingConfig signingConfigs.release
    }
}
.....

......    
def dagger_version = '2.0.2'
def okhttp_version = '3.2.0'
def butterknife_version = '7.0.0'
def retrofit_version = '2.0.1'
def rxandroid_version = '1.1.0'
def rxjava_version = '1.1.0'

dependencies {

compile project(':explorer_sdk')

//multidex
compile 'com.android.support:multidex:1.0.0'

//facebook
compile 'com.facebook.android:facebook-android-sdk:4.+'

//dependency independent:  dagger2/butterknife
compile "com.google.dagger:dagger:$dagger_version"
apt "com.google.dagger:dagger-compiler:$dagger_version"
compile "com.jakewharton:butterknife:$butterknife_version"

//rxjava/rxandroid
compile "io.reactivex:rxandroid:$rxandroid_version"
compile "io.reactivex:rxjava:$rxjava_version"

//retrofit2
compile "com.squareup.retrofit2:retrofit:$retrofit_version"
compile "com.squareup.retrofit2:adapter-rxjava:$retrofit_version"
compile "com.squareup.retrofit2:converter-gson:$retrofit_version"
compile "com.squareup.retrofit2:converter-jackson:$retrofit_version"
compile ("com.squareup.retrofit2:converter-simplexml:$retrofit_version") {
    exclude module: 'stax-api'
    exclude module: 'stax:stax'
    exclude module: 'xpp3:xpp3'
}

//picasso
compile 'com.squareup.picasso:picasso:2.5.2'

//support
compile 'com.android.support:cardview-v7:23.+'
compile 'com.android.support:recyclerview-v7:23.+'

//annotation
provided 'javax.annotation:jsr250-api:1.0'

compile files('libs/ant.jar')
compile files('libs/defake.jar')
compile files('libs/HwID_OpenSDK_V3.0.01.07-R9156.jar')
compile files('libs/libammsdk_2015.2.5.jar')
compile files('libs/mta-sdk-1.6.2.jar')
compile files('libs/mtll_sdk_v115_20160226133400.jar')
compile files('libs/open_sdk_v2.9.1.jar')
compile files('libs/passportSDK_V1.4.jar')
compile files('libs/weibosdk_V3.1.jar')
compile files('libs/weibosdkcore_V3.1.jar')

//line-sdk
compile files('libs/line-android-sdk-3.1.19.jar')
}
.....

顺便问一下,如何检查重复的软件包?


我在使用minifyEnabled为true时出现了完全相同的问题。你找到解决方案了吗? - Caleb Jones
还没有。也许是第三方库导致了这个问题。我猜测。 - RoFF
也许你可以检查一下为什么它实际上在抱怨 name already added: string{"a"}?你能搜索一下你的代码库,看看它是否存在于多个字符串文件或类似的地方吗? - Mostafa Berg
嘿,大家好。请检查下面的我的答案。 - RoFF
6个回答

3

尝试在build.gradle中添加以下gradle选项。通过添加以下选项,您可以启用MultiDex支持和增量dex支持。

 ...
   defaultConfig {
      ...
      multiDexEnabled true // Enabling multidex support.
   }
    ...
   dexOptions {
     //you can speed up your builds by turning on incremental dexing
           incremental = true;
     //you can specify the heap size for the dex process
           javaMaxHeapSize "4g" 
   }

如果您的应用程序扩展了Application类,可以重写attachBaseContext()方法,并调用MultiDex.install(this)来启用多dex功能。

 @Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

同时,您可以在stackoverflow上查看以下相关问题链接:

错误:执行任务':app:transformClassesWithDexForDebug'失败。 > com.android.build.api.transform.TransformException:..非零退出值3

Android java.exe以非零退出值1完成

请参见使用超过65K个方法构建应用程序


2
如何检查哪个包已被复制?
将以下内容添加到您的 proguard_legacy.cfg 文件中。
 -dontobfuscate

这样做不会混淆您的代码,您将在日志中看到带有错误的类或对象的真实名称。

1

我花了相当多的时间查看了依赖树并删除了重复项。例如,我使用了FastScrollRecylerView库,因此我不需要编译com.android.support版本的reyclerview。

gradle app:dependencies

我还仔细地按照每个库的要求构建了我的proguard规则,搜索了常见配置等。虽然费了些力气但我最终解决了问题!


太棒了!这真的很有用! - RoFF

1
您正在使用名为proguard_legacy.cfg的自定义ProGuard设置文件进行混淆/缩小。
这个文件很可能包含一些规则,这些规则不再与DEX处理兼容。建议使用由Google提供并保证与DEX处理兼容的SDK默认ProGuard配置文件。
您可以完全关闭缩小(如您已经发现的那样minifyEnabled false),或者尝试使用提供的默认ProGuard配置。对于后者,请更改gradle文件中的此行:
proguardFiles 'proguard_legacy.cfg'

to

proguardFiles getDefaultProguardFile('proguard-android.txt')

SDK 中还有另一个配置文件名为 'proguard-android-optimize.txt',但它对二进制文件的更改方式比较激进,可能根本无法工作。

您可以通过将这些规则添加到新的 ProGuard 配置中,并在 gradle 文件中将其与默认规则一起列出,来增加更松散或更严格的规则,例如:

proguardFiles getDefaultProguardFile('proguard-android.txt'),'my_proguard_rules.pro'

第二个文件中的任何规则都将添加在第一个文件的规则顶部。(通常通过覆盖某些规则的行为。) 请注意:使用默认的ProGuard规则可能会以一种可能引入问题的方式更改您的代码(例如,方法或类被重命名或完全删除)。您的自定义配置文件中可能有特定的规则,涉及必须保持不变的内容。如果没有查看文件,则很难告诉如何调整ProGuard配置。同时,更改ProGuard规则也可能导致应用程序的某些与安全相关的属性发生变化,因此,如果您的项目具有安全相关考虑,则在更改后进行渗透/安全审查。

0

最后,我发现“compile "com.squareup.retrofit2:converter-jackson:$retrofit_version"”导致了构建错误。

通过“gradle app:dependencies”,我们可以看到converter-jackson依赖于fasterxml。因此,在proguard文件中添加以下内容,它就可以工作了!

-keep class com.fasterxml.** { *; }
-dontwarn com.fasterxml.**

我该如何找到确切的依赖包(我的意思是com.squareup.retrofit2:converter-jackson)?我只能一个一个排除依赖项。这花费了我好几个小时 :-(

如果有人知道更好的定位依赖包的方法,请告诉我。


你有没有找到更简单的方法来做这件事? - Josh Laird

-1
在您的 build.gradle 文件中,将 minifyEnabled false 设置为调试模式。

这解决了问题,但应用程序将不会被缩小。 - geNia
是的,但我无法使用 minifyEnabled true 进行发布构建。 - geNia

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