編譯時報錯:
* 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