【Debug】Execution failed for task ':app:transformClassesWithMultidexlistForDebug'

編譯時報錯:

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

參考:
https://blog.csdn.net/mxiaoyem/article/details/81666686
https://blog.csdn.net/stupid56862/article/details/81130589

使用如下命令詳細篩查:

gradlew  assembleDebug  --stacktrace

日誌如下:

D:\Android\MyApplication\MyExample>gradlew  assembleDebug  --stacktrace
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

> Configure project :app 
Could not find google-services.json while looking in [src/nullnull/debug, src/debug/nullnull, src/nullnull, src/debug, src/nullnullDebug]
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
Could not find google-services.json while looking in [src/nullnull/release, src/release/nullnull, src/nullnull, src/release, src/nullnullRelease]
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)

Download https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle/26.1.2/lint-gradle-26.1.2.pom
Download https://dl.google.com/dl/android/maven2/com/android/tools/external/com-intellij/intellij-core/26.1.2/intellij-core-26.1.2.pom
.
.
.
Download https://dl.google.com/dl/android/maven2/com/android/tools/external/com-intellij/intellij-core/26.1.2/intellij-core-26.1.2.jar
Download https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint/26.1.2/lint-26.1.2.jar
Download https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-api/26.1.2/lint-api-26.1.2.jar
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-all/2.4.12/groovy-all-2.4.12.jar

> Task :app:processDebugGoogleServices 
Parsing json file: D:\Android\MyApplication\***\***\app\google-services.json


FAILURE: Build failed with an exception.

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

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

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at 
.
.
.
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.RuntimeException: com.android.build.api.transform.TransformException: Error while generating the main dex list.
        at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:104)
        at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:212)
.
.
.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
        ... 29 more
Caused by: com.android.build.api.transform.TransformException: Error while generating the main dex list.
        at com.android.build.gradle.internal.transforms.D8MainDexListTransform.transform(D8MainDexListTransform.kt:127)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:221)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:217)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
        ... 41 more
Caused by: com.android.builder.multidex.D8MainDexList$MainDexListException: com.android.tools.r8.errors.CompilationError: Program type already present: com.apkfuns.logutils.BuildConfig
        at com.android.builder.multidex.D8MainDexList.generate(D8MainDexList.java:87)
        at com.android.build.gradle.internal.transforms.D8MainDexListTransform.transform(D8MainDexListTransform.kt:114)
        ... 44 more
Caused by: com.android.tools.r8.errors.CompilationError: Program type already present: com.apkfuns.logutils.BuildConfig
        at com.android.tools.r8.utils.ProgramClassCollection.resolveClassConflictImpl(ProgramClassCollection.java:64)
        at com.android.tools.r8.utils.ProgramClassCollection.lambda$create$0(ProgramClassCollection.java:25)
        at com.android.tools.r8.utils.ProgramClassCollection.create(ProgramClassCollection.java:24)
        at com.android.tools.r8.graph.LazyLoadedDexApplication$Builder.build(LazyLoadedDexApplication.java:121)
        at com.android.tools.r8.dex.ApplicationReader.read(ApplicationReader.java:122)
        at com.android.tools.r8.dex.ApplicationReader.read(ApplicationReader.java:86)
        at com.android.tools.r8.GenerateMainDexList.run(GenerateMainDexList.java:40)
        at com.android.tools.r8.GenerateMainDexList.run(GenerateMainDexList.java:110)
        at com.android.builder.multidex.D8MainDexList.generate(D8MainDexList.java:83)
        ... 45 more

發現如下錯誤信息:

Program type already present

分析與排查:

這多半是由於依賴包重複導致的衝突,把衝突包重複的依賴剔除就可以了。

Android項目目前很多是由Gradle遠程依賴,建議通過查看依賴樹來排查問題 。

例如我的 Android 工程主 Module 名稱爲 app 。我想查看依賴樹,進入項目根目錄,執行命令:

gradlew app:dependencies

Terminal中會打印出很多文字,如:

我們把這個依賴樹分成如下幾個區域:

其中黃色框框中的“com.stripe:stripe-android:10.2.1”是我在項目中直接依賴的;

紅色框框中的design庫和annotations庫等則是stripe庫中的依賴,是項目中的二級依賴;

綠色框框中的很多庫則是上述二級依賴的子依賴,即項目的三級依賴;

藍色框框爲四級依賴;

以此類推,隨着項目的增大,依賴樹可達很多層級,層級越多,出現本篇文章中的問題的可能性就越大。

因此大多數情況下的衝突是因爲,依賴庫所依賴的其他庫版本衝突。

我們現在以常用的recycle人view依賴庫爲例,簡要介紹解決依賴衝突的方式:

implementation 'com.android.support:recyclerview-v7:26.1.0
|    +--- com.android.support:support-annotations:26.1.0 (*)
|    +--- com.android.support:support-compat:26.1.0 (*)
|    \--- com.android.support:support-core-ui:26.1.0 (*)

 

解決方案:

1. 刪除自己重複添加的依賴

如果是自己添加了多個重複的依賴包,刪除即可

 

2. exclude: 剔除依賴

recyclerview 不想要依賴 com.android.support:support-annotations:26.1.0 可以如下操作:

implementation ('com.android.support:recyclerview-v7:26.1.0'){
    exclude group: 'com.android.support', module: 'support-annotations'  // 根據組織名 + 構建名剔除
    // 你也可以分別通過  group 和 module 剔除 對應的模塊。
}

執行後的依賴樹結果爲:

+--- com.android.support:recyclerview-v7:26.1.0
|    +--- com.android.support:support-compat:26.1.0 (*)
|    \--- com.android.support:support-core-ui:26.1.0 (*)

 

3. force: 強制指定依賴版本

例如,我想要所有 com.android.support:support-annotations:26.1.0 的依賴版本爲 27.1.1 怎麼辦呢 ?
在只需要在 build.gradle 中加上 force true 即可 :

implementation("com.android.support:support-annotations:27.1.1"){
    force true
}

執行後依賴樹:

+--- com.android.support:recyclerview-v7:26.1.0
|    +--- com.android.support:support-annotations:26.1.0 -> 27.1.1
|    +--- com.android.support:support-compat:26.1.0 (*)
|    \--- com.android.support:support-core-ui:26.1.0 (*)

可以看到多了 -> 27.1.1 . 也就是原依賴版本爲 26.1.0 ,在工程中修改依賴爲 27.1.1 。

 

4. transitive: 依賴傳遞特性

transitive : 依賴傳遞特性,使用的時候,通常設置爲 false 。即關閉依賴傳遞

例如項目中不希望 recyclerview 使用它所依賴的庫,只需要在 build.gradle 中加上 transitive false 即可:

implementation ('com.android.support:recyclerview-v7:26.1.0'){
    transitive  false
}

執行後查看依賴樹的結果,recyclerview 的依賴都消失了。

+--- com.android.support:recyclerview-v7:26.1.0

當然這是一個危險的操作,因爲缺少依賴,你可能無法正常編譯。最好確認你項目中已經依賴了你所剔除在外的庫。

上述操作等同於:

implementation('com.android.support:recyclerview-v7:26.1.0') {
    exclude group : 'com.android.support'
}

因爲 recyclerview 依賴的三個庫組織名都是 com.android.support。

最後說明一下:解決衝突用的最多是 force 和 exclude 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章