Android: v7 支持 lib 27.1.0 的编译错误 "Program type already present" android.support.v7.recyclerview.extensions.ListAdapter

Android: Compilation error with v7 support lib 27.1.0 "Program type already present" android.support.v7.recyclerview.extensions.ListAdapter

我认为 27.1.0 v7 支持库一定存在错误,just released。在更新我的项目以使用它后(从 26.1.0 开始),我不断收到此编译错误:

Task :app:transformDexArchiveWithDexMergerForRegularDebug FAILED D8 is used to merge dex. Program type already present: android.support.v7.recyclerview.extensions.ListAdapter

FAILURE: Build failed with an exception.

  • What went wrong: Execution failed for task ':app:transformDexArchiveWithDexMergerForRegularDebug'. com.android.build.api.transform.TransformException: com.android.tools.r8.errors.CompilationError: Program type already present: android.support.v7.recyclerview.extensions.ListAdapter

  • Try: Run with --info or --debug option to get more log output.

  • Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformDexArchiveWithDexMergerForRegularDebug'. 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 org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62) at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87) at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.run(DefaultTaskGraphExecuter.java:248) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access0(DefaultTaskPlanExecutor.java:79) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.execute(DefaultTaskPlanExecutor.java:104) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.execute(DefaultTaskPlanExecutor.java:98) at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:626) at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:581) 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.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: com.android.tools.r8.errors.CompilationError: Program type already present: android.support.v7.recyclerview.extensions.ListAdapter 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:213) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:46) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.run(ExecuteActionsTaskExecuter.java:121) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110) 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: com.android.tools.r8.errors.CompilationError: Program type already present: android.support.v7.recyclerview.extensions.ListAdapter at com.android.build.gradle.internal.transforms.DexMergerTransform.transform(DexMergerTransform.java:230) at com.android.build.gradle.internal.pipeline.TransformTask.call(TransformTask.java:222) at com.android.build.gradle.internal.pipeline.TransformTask.call(TransformTask.java:218) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) ... 41 more Caused by: com.android.tools.r8.errors.CompilationError: Program type already present: android.support.v7.recyclerview.extensions.ListAdapter at com.android.tools.r8.utils.ProgramClassCollection.resolveClassConflictImpl(ProgramClassCollection.java:61) at com.android.tools.r8.utils.ProgramClassCollection.lambda$create[=20=](ProgramClassCollection.java:22) at com.android.tools.r8.utils.ProgramClassCollection.create(ProgramClassCollection.java:22) at com.android.tools.r8.graph.DexApplication$Builder.build(DexApplication.java:408) at com.android.tools.r8.dex.ApplicationReader.read(ApplicationReader.java:96) at com.android.tools.r8.D8.runForTesting(D8.java:179) at com.android.tools.r8.D8.runForTesting(D8.java:152) at com.android.tools.r8.D8.run(D8.java:71) at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:73) at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:97) at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:35)

我查看了我的项目的依赖项(./gradlew :<module>:dependencies [其中 <module> 是我所有的模块])并验证我只有 一个 依赖项这应该是在拉动支持 ListAdapter class,就是这个:

implementation "com.android.support:recyclerview-v7:27.1.0"

我也用

configurations.all {
    resolutionStrategy {
        ...
        force "com.android.support:recyclerview-v7:27.1.0"
    }
}

我试过了cleaning/rebuilding。我试过使缓存无效并重新启动。我还尝试手动删除所有构建文件夹和 .gradle 文件夹。我也试过禁用 D8,但我的构建永远挂起。问题仍然存在。我什至没有使用 ListAdapter!

想通了!结果 android.arch.paging:runtime-1.0.0-alpha4-1 依赖项 also 声明了 ListAdapter。将分页库更新为alpha6后问题解决

编辑 出于某种原因,这个问题受到了很多关注!所以,我想我应该将此评论添加为 "teach a person to fish" 之类的时刻。问题是:我怎么知道我的 ListAdapter 是从哪里来的?答案?如果您使用的是 Android Studio / IntelliJ IDEA,请按 ctrl+n 开始搜索 class 名称。您会看到此对话框:

请注意复选框!如果您不检查它,您将 永远不会 找到图书馆包含的 class。选中它后,它将显示项目中每个 class 的出处。

只需更新我所有的依赖项、清理和重建项目就可以解决问题。我认为存在某种 dependency/library 冲突。过时的库可能会尝试使用旧版本的支持库,而您正尝试在其他地方使用较新的版本。