Android:v7 支持 lib 27.1.0 的编译错误“程序类型已存在”android.support.v7.recyclerview.extensions.ListAdapter

Posted

技术标签:

【中文标题】Android:v7 支持 lib 27.1.0 的编译错误“程序类型已存在”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 【发布时间】:2018-08-08 20:50:21 【问题描述】:

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

任务 :app:transformDexArchiveWithDexMergerForRegularDebug 失败 D8用于合并dex。 程序类型已经存在:android.support.v7.recyclerview.extensions.ListAdapter

FAILURE:构建失败并出现异常。

出了什么问题: 任务 ':app:transformDexArchiveWithDexMergerForRegularDebug' 执行失败。 com.android.build.api.transform.TransformException:com.android.tools.r8.errors.CompilationError:程序类型已经存在:android.support.v7.recyclerview.extensions.ListAdapter

尝试: 使用 --info 或 --debug 选项运行以获得更多日志输出。

例外情况是: org.gradle.api.tasks.TaskExecutionException:任务':app:transformDexArchiveWithDexMergerForRegularDebug'的执行失败。 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70) 在 org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51) 在 org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62) 在 org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54) 在 org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60) 在 org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97) 在 org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87) 在 org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52) 在 org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 在 org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) 在 org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 在 org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) 在 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110) 在 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241) 在 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230) 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123) 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79) 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104) 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98) 在 org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:626) 在 org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:581) 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98) 在 org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) 在 org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) 在 org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) 引起:java.lang.RuntimeException:com.android.build.api.transform.TransformException:com.android.tools.r8.errors.CompilationError:程序类型已经存在:android.support.v7.recyclerview.extensions.ListAdapter 在 com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55) 在 com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:104) 在 com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:213) 在 org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) 在 org.gradle.api.internal.project.taskfactory.IncrementalTask​​Action.doExecute(IncrementalTask​​Action.java:46) 在 org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39) 在 org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:121) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199) 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:110) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92) ... 29 更多 引起:com.android.build.api.transform.TransformException:com.android.tools.r8.errors.CompilationError:程序类型已经存在:android.support.v7.recyclerview.extensions.ListAdapter 在 com.android.build.gradle.internal.transforms.DexMergerTransform.transform(DexMergerTransform.java:230) 在 com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:222) 在 com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:218) 在 com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) ... 41 更多 引起:com.android.tools.r8.errors.CompilationError:程序类型已经存在:android.support.v7.recyclerview.extensions.ListAdapter 在 com.android.tools.r8.utils.ProgramClassCollection.resolveClassConflictImpl(ProgramClassCollection.java:61) 在 com.android.tools.r8.utils.ProgramClassCollection.lambda$create$0(ProgramClassCollection.java:22) 在 com.android.tools.r8.utils.ProgramClassCollection.create(ProgramClassCollection.java:22) 在 com.android.tools.r8.graph.DexApplication$Builder.build(DexApplication.java:408) 在 com.android.tools.r8.dex.ApplicationReader.read(ApplicationReader.java:96) 在 com.android.tools.r8.D8.runForTesting(D8.java:179) 在 com.android.tools.r8.D8.runForTesting(D8.java:152) 在 com.android.tools.r8.D8.run(D8.java:71) 在 com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:73) 在 com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:97) 在 com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:35)

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

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

我也用过

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

想通了!原来 android.arch.paging:runtime-1.0.0-alpha4-1 依赖声明了ListAdapter。将分页库更新为alpha6后,问题得到解决。

编辑 出于某种原因,这个问题引起了很多关注!所以,我想我会把这条评论添加为“教一个人钓鱼”之类的时刻。问题:我怎么知道我的ListAdapters 来自哪里?答案?如果您使用的是 Android Studio / IntelliJ IDEA,请点击 ctrl+n 开始搜索类名。你会看到这个对话框:

请注意复选框!如果您没有检查,您将永远找到库包含的类。选中后,它将显示项目中每个类的出处。

【讨论】:

生活超级骗子!升级 arch 依赖项如何解决它?它不再声明类还是其他原因? @Raymond232 我只能假设 Google 决定重新排列哪些工件具有哪些类。

以上是关于Android:v7 支持 lib 27.1.0 的编译错误“程序类型已存在”android.support.v7.recyclerview.extensions.ListAdapter的主要内容,如果未能解决你的问题,请参考以下文章

android中libs目录下armeabi和armeabi-v7a的区别

重复条目:android / support / v7 / recyclerview / extensions / ListAdapter.class [复制]

Android 支持库 v7 缺少 appcompat

Gridview v7 对旧 api android.support.v7.widget.Gridlayout 的支持未能实例化

v7 支持库 ActionBar 的 Android Proguard 配置

android开发libs下的armeabi、armeabi-v7a、arm64-v8a等及导入so所踩过的坑