com.android.tools.r8.utils.AbortException zza 已经有一个 mappin

com.android.tools.r8.utils.AbortException zza already has a mappin

我正在 运行 仪器测试并遇到此编译错误:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesAndResourcesWithR8ForDebugAndroidTest'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.accept(ExecuteActionsTaskExecuter.java:151)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.accept(ExecuteActionsTaskExecuter.java:148)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:191)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:141)
        ...
Caused by: java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
        at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:108)
        at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
        at org.gradle.api.internal.project.taskfactory.IncrementalTaskInputsTaskAction.doExecute(IncrementalTaskInputsTaskAction.java:46)
        ...
Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
        at com.android.tools.r8.utils.z.a(:55)
        at com.android.tools.r8.R8.runForTesting(:3)
        at com.android.tools.r8.R8.run(:3)
        at com.android.builder.dexing.R8Tool.runR8(r8Tool.kt:195)

Caused by: com.android.tools.r8.utils.AbortException: Error: offset: 0, line: 16559, column: 1, 'void zza(com.google.android.gms.common.internal.BaseGmsClient,int,android.os.IInterface)' already has a mapping
        at com.android.tools.r8.utils.Reporter.a(:21)
        at com.android.tools.r8.naming.SeedMapper$a.build(:1)
        ...

如果我查看 app/build/outputs/mappings/debug/mapping.txt,我会看到该方法列出了两次。

com.google.android.gms.common.internal.BaseGmsClient -> com.google.android.gms.common.internal.BaseGmsClient:
    ...
    344:344:void zza(com.google.android.gms.common.internal.BaseGmsClient,int,android.os.IInterface) -> zza
    ...
    350:350:void zza(com.google.android.gms.common.internal.BaseGmsClient,int,android.os.IInterface) -> zza
  1. 奇怪的是,基本的应用程序编译没有发生。不确定为什么 R8 使用测试代码做任何事情。
  2. 这是 R8 问题还是 Play 服务问题?
  3. 我该如何解决这个问题。 gradle clean + invalidate/restart 没有做任何事情,也没有手动删除和重新生成 mappings.txt 文件。

我可能会有一些答案。

关于 1. 如果您在将 minifyEnabled 设置为 true 并在之后进行 运行 仪器测试的情况下编译您的应用程序,您的应用程序可能会缩小 类、方法等。因此,所有测试都需要使用 R8 重新编译,以更正所有缩小的名称你的测试。具体来说,你的测试正在由 R8 编译,你的应用程序在 library-path 上,proguard 配置说 -applymapping .

关于 2。 这是一个 R8 问题。通过将以下内容添加到您的项目级别 build.gradle 文件中,您可能会很幸运:

buildscript {

    repositories {
        maven {
            url 'http://storage.googleapis.com/r8-releases/raw'
        }
    }

    dependencies {
        classpath 'com.android.tools:r8:1.5.45'          // Must be before the Gradle Plugin for Android.
        classpath 'com.android.tools.build:gradle:X.Y.Z' // Your current AGP version.
     }
}

关于 3。 如果 2. 中的修复不起作用,您可以按照 R8 bug-tracker 中的以下错误进行操作: https://issuetracker.google.com/issues/122924648

在问题解决之前,也可以在缩小的应用程序上不使用工具。

我遇到了完全相同的错误, 的建议对我不起作用。

我的解决方法不是很令人满意,但这是我现在能做的最好的。每当我想 运行 仪器测试时,我将 minifyEnabled 设置为 false 并将 minSdkVersion 设置为 21 (对于此 sdk 版本 multidex 启用默认并且没有达到dex方法限制的错误。

仪器测试 运行 现在符合预期。