用gradle错误构建apk

要使用gradle构建apk,控制台中的错误如下:

如果make minifyEnabled = false,则错误消失。 看起来有重复的包。

:app:collectDebugMultiDexComponents :app:transformClassesWithMultidexlistForDebug ProGuard, version 5.2.1 Reading program jar [/app/build/intermediates/transforms/proguard/debug/jars/3/1f/main.jar] Reading library jar [/build-tools/23.0.2/lib/shrinkedAndroid.jar] Preparing output jar [/app/build/intermediates/multi-dex/debug/componentClasses.jar] Copying resources from program jar [/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 /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') } ..... 

那么,如何检查哪个包是重复的?

尝试在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)以启用multidex。

  @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方法构建应用程序

如何检查哪个包是重复的?

将以下内容添加到proguard_legacy.cfg文件中。

  -dontobfuscate 

这不会混淆您的代码,您将看到日志中包含错误的类或对象的真实名称。

我花了几个小时来检查依赖树,删除重复项。 例如,我使用FastScrollRecylerView库,因此我不需要编译reyclerview的com.android.support版本。

 gradle app:dependencies 

我还在每个库的基础上仔细构建了我的proguard规则,搜索常见的配置等等。我让它工作了!

您正在使用自定义ProGuard设置文件进行混淆/缩小,称为: proguard_legacy.cfg

该文件很可能包含一些不再与DEX处理兼容的规则。 建议使用由Google提供的SDK中的默认ProGuard配置文件,并保证使用DEX处理。

您可以在已经发现的情况下全部关闭缩小( minifyEnabled false ),或者您可以尝试使用提供的默认ProGuard配置。 对于后者,在gradle文件中更改此行:

 proguardFiles 'proguard_legacy.cfg' 

 proguardFiles getDefaultProguardFile('proguard-android.txt') 

SDK中有另一个配置文件,名为’ proguard-android-optimize.txt ‘,但是对于二进制文件的更改方式有点激进,所以它根本不起作用。

除了标准规则之外,您还可以添加更宽松或更严格的规则,方法是将这些规则添加到新的ProGuard配置中,并将其列在gradle文件中的默认规则旁边,例如:

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

第二个文件中的任何规则都将添加到第一个规则的顶部。 (通常通过覆盖某些规则的行为。)

请注意 :使用默认的ProGuard规则可能会以可能引入问题的方式更改您的代码(例如,方法或类被重命名或完全删除)。 您的自定义配置文件中可以有关于必须保持不变的特定规则。 如果不查看文件,很难说如何调整ProGuard配置。

您的应用程序的某些与安全相关的属性也可能随更改ProGuard规则而发生变化,因此如果您的项目有与安全相关的注意事项,则在更改后对应用程序进行渗透/安全审查。

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

使用“gradle app:dependencies”,我们可以看到converter-jackson依赖于fastxml。 所以添加以下proguard文件,它的工作原理!

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

我如何find确切的依赖包(我的意思是com.squareup.retrofit2:converter-jackson)? 我只是逐个排除依赖项。 我花了几个小时:-(

如果有人有更好的方法来查找依赖包,请告诉我。

build.gradle文件minifyEnabled false以进行调试。