Execution failed for task ':app:transformClassesWithDexForRelease'.经验总结

Execution failed for task’:app:transformClassesWithMultidexlistForRelease’和 ‘com.android.build.api.transform.TransformException: Error while generating the main dex list.’.爬坑记录

这种编译问题说实话,解决起来如果运气好找几篇博客照着解决方案做尝试就可以解决过去,但说坑起来,也真能坑死一个人,本人就深有体会,几乎谷歌翻阅尝试了所有的方案,也没能成功的编译成功打出一个包,最后折腾了快一天的时间,经过各种尝试才从这个巨坑无比的bug里面爬出来,AS的坑要是坑起来那是真坑,连个的准确的错误原因和相关文件或者位置提示都没有,全靠各种猜和删减rebulide尝试了,可怜的Android开发者,感觉被代码和bug虐的感觉真不爽,真的抓狂,真的渴望Android Studio能再智能一点。。。 谷歌的大咖们,能听到有人在骂街吗?

上周五公司项目集成了谷歌应用商店接入商品订阅的api,当时没有打包,只是测试功能,但周一来了后,发现Facebook登陆时总是提示key不对无效,所以想新打个包测试下,结果在打包时提示失败,爆出了一个错误:

* What went wrong:
Execution failed for task ':app:transformClassesWithMultidexlistForRelease'.
> com.android.build.api.transform.TransformException: Error while generating the main dex list.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 48s

原本我看到这个错误时并没有太在意,因为我印象里面曾经遇到过类似的编译问题,而且找到了很好的方法来应对,当时视之为解决编译问题的秘密武器还,对,还写过博客,就是这篇来着:关于TaskExecutionException: Execution failed for task ‘:app:transformJackWithJackForDebug’最权威有效的解决方案
仔细一看和我之前遇到的一个比较经典的编译异常真的非常相似,我马上打开了这篇笔记找命令语句去,打开Android studio的Terminal,敲入一个命令:

gradlew compileDebugSources --stacktrace -info

然后就开始等它编译完后开始爬楼,希望能找到错误原因和位置的准确提示,结果,爬楼翻了好几遍,就是没有找到错误提示,我曾经解决编译问题的绝招竟然失效了,要不是真的看到事实,我真的不会相信,没办法,以前的经验不能解决现在的问题,只好复制异常信息关键字到Chrom浏览器里面开始搜索了,期待神奇的谷歌浏览器能带我解决这个问题。
果然不出所料,谷歌一搜就出了一大堆这个错误的解决方案的博客和问答,有stack overflow上的问答,有博客园,csdn,简书上相关的博客,于是开始逐个打开阅读,尝试,然而,照着做了好多都没有真正解决我的问题,还有一个是这样写的,后来我照着做了非但没有解决问题,反而最后发现他这样写是一种误导,这里放个截图:
Execution failed for task ':app:transformClassesWithDexForRelease'.经验总结_第1张图片
他前面的解决方案是对的,这样的编译异常必须有那些操作,但唯独红色箭头指着的依赖,我照着添加后编译通不过,反而出现了别的奇怪的问题:

Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> More than one file was found with OS independent path 'androidsupportmultidexversion.txt'

还有博客提供的解决方案是这样的,修改studio的配置文件的参数:

在build.gradle文件中 (Module: app):

compile 'com.android.support:multidex:1.0.1'

    ...

    dexOptions {
            javaMaxHeapSize "4g"
        }

    ...

    defaultConfig {
            multiDexEnabled true
    }
另外,将以下内容放在gradle.properties文件中:

org.gradle.jvmargs=-Xmx4096m -XX\:MaxPermSize\=512m -XX\:+HeapDumpOnOutOfMemoryError -Dfile.encoding\=UTF-8

//这里应该提一下,这些数字是基于笔记本电脑配置(MacBook Pro有16 GB RAM),所以请编辑这些时根据你的电脑实际配置情况。

这个方案我也试了下,也没有解决我的问题,但是当我后来编译问题解决后再试验这段代码发现编译也没有报错,也就是说这段代码会有他自己的用处估计,但我还没研究透,如果再遇到这个编译问题时候可以留做一方面备用解决问题的备用方案。

然后还照着一些博友提供的修改build.gradle的方法改自己的gradle文件,虽然没有解决了我编译的问题当时,而且我编译成功后将这些注释后再测试依然可以成功的编译通过并出包,但这些配置还是有用的,也许相同的这个问题我这里不需要这几行gradle的代码可以编译过去,但你的就不行,所以也贴出来在这里作为备用解决方案和经验积累存储,以防万一:
找到app目录下的build.gradle文件:
//下面这个是一个正确的build.gradle代码的配置代码:

android {
    ...

    defaultConfig {
         ...
        multiDexEnabled true
         ...
    }
    dependencies {
        //noinspection GradleCompatible
        implementation 'com.android.support:multidex:1.0.3'  // 多dex配置

    }

    signingConfigs {
        release {
            keyAlias 'xxx'
            keyPassword 'xxx'
            storeFile file('C:/Users/xxx.jks')
            storePassword 'xxx'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            //下面这句可以在debug的时候也走release的签名,如果走一些必须要发布版才能测试的功能可以把下面的注释打开
            signingConfig signingConfigs.release
            //下面是debug模式
//            signingConfig signingConfigs.debug
//            minifyEnabled false
//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    buildscript {
        repositories {
            maven { url "https://jitpack.io" }
            maven { url "https://maven.google.com"   } // Google's Maven repository
        }

    }

    repositories {
        google()
        maven { url "https://jitpack.io" }
    }

//下面注释的着几项,是网上的博客推荐的解决这个异常的主要方案,除了上面的multiDexEnabled true和implementation 'com.android.support:multidex:1.0.3'依赖
//    lintOptions {
//        checkReleaseBuilds false
//        abortOnError false
//    }
//    dexOptions {
//        javaMaxHeapSize "6g"
//    }
//    configurations.all {
//        resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
//    }

}

反正我照着博客都没解决了问题,后来又看了一篇博客,是关于这个问题的很多解决方案的总结:这里贴下网址*

“http://go.wosoni.com/b-motsqtorvrqstvv-cejigjehlhgijlldcll.html”

*
最后我的解决办法是尝试移除一些依赖再编译尝试,然后发现有两个依赖会导致编译问题的发生:

//    implementation 'com.android.billingclient:billing:1.0'  //谷歌应用内结算支付会用到的
//    implementation 'androidx.multidex:multidex:2.0.0'       //stack overflow上一个开发者朋友的推荐解决Execution failed for task ':app:transformClassesWithMultidexlistForRelease方案依赖

当我把他们注释后再测试的时候发现编译可以了,打包也没问题了,下面这个间接的异常也没有出现

* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> More than one file was found with OS independent path 'androidsupportmultidexversion.txt'

看来就是依赖的问题导致的编译过不去,除了尝试移除依赖编译尝试还需要检查你的依赖里面有没有重复的依赖之类的,网上还有很多博客会建议尝试修改依赖的版本号,升高或者降低,这种类似于兼容性的问题最无聊了,丝毫的经验价值谈不上,就是兼容性的问题,特别烦。
好了好不容易从这个坑里爬出来了,虽然解决了现在的问题,但感觉这个看起来似乎很简单的问题在有时候解决起来真的不简单,任凭尝试过所有能找到的解决方案都不适合自己的这个异常的,这个时候最无助也最恶心,还好找到了适合自己的解决方案可以爬出坑来了,心里有好多阴影感觉~,哈哈

你可能感兴趣的:(android)