4 votes

com.Android.tools.r8.utils.AbortException zza a déjà un mappage

J'exécute des tests d'instrumentation et j'obtiens cette erreur de compilation :

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesAndResourcesWithR8ForDebugAndroidTest'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:151)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.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)
        ...

Si je regarde dans app/build/outputs/mappings/debug/mapping.txt Je vois que cette méthode est citée deux fois.

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. Bizarrement, cela ne se produit pas lors de la compilation d'une application de base. Je ne sais pas pourquoi R8 fait quelque chose avec le code de test.
  2. Est-ce un problème de R8 ou de Play Services ?
  3. Comment puis-je résoudre ce problème ? Un gradle clean + invalidate/restart n'a rien donné, pas plus que la suppression et la régénération manuelles du fichier mappings.txt.

11voto

MortenKJ Points 256

J'ai peut-être des réponses.

Concernant le point 1. Si vous compilez votre application avec minifyEnabled réglé sur true et que vous exécutez ensuite des tests d'instrumentation, votre application peut avoir des classes, des méthodes, etc. minifiées. Tous les tests doivent donc être recompilés avec R8 pour que tous les noms minifiés soient corrigés dans vos tests. Concrètement, vos tests sont compilés par R8 avec votre application dans le library-path et une configuration proguard qui dit -applymapping .

Concernant le point 2. C'est un problème de R8. Vous aurez peut-être un peu de chance en ajoutant ce qui suit au fichier build.gradle de votre projet :

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.
     }
}

Concernant le point 3. Si la correction du point 2. ne fonctionne pas, vous pouvez suivre le bogue suivant dans le bug-tracker de R8 : https://issuetracker.google.com/issues/122924648

Il peut également être possible de vivre sans instrumentation sur l'application minifiée jusqu'à ce que le problème soit résolu.

2voto

Boris Staykov Points 11

J'ai exactement la même erreur et les suggestions de @MortenKJ n'a pas fonctionné pour moi.

Ma solution de rechange n'est pas très satisfaisante, mais c'est la meilleure que je puisse faire pour le moment. Chaque fois que je veux exécuter des tests d'instrumentation, je configure minifyEnabled a false y minSdkVersion a 21 (pour cette version du sdk multidex est activé par défaut et il n'y a pas d'erreur que la limite de la méthode dex est atteinte).

Les tests d'instrumentation fonctionnent comme prévu maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X