Fixed
Status Update
Comments
sg...@google.com <sg...@google.com> #2
Thank you very much for the report. Internally we hit the error when applying the -applymapping map
appView.setGraphLense(
new ProguardMapApplier(appView.withLiveness(), seedMapper).run(timing));
application = application.asDirect().rewrittenWithLense(appView.getGraphLense()); <<< line 359 in R8 1.3
./gradlew clean assembleDebug assembleAndroidTest -PagpVersion=3.3.0 -Pandroid.enableR8=true --stacktrace
Execution failed for task ':transformClassesAndResourcesWithR8ForDebugAndroidTest'.
> Multiple entries with same key: com.google.firebase.iid.R=com.google.firebase.iid.R(library class) and com.google.firebase.iid.R=com.google.firebase.iid.R(library class)
* 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 ':transformClassesAndResourcesWithR8ForDebugAndroidTest'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:119)
at org.gradle.api.internal.tasks.execution.ResolvePreviousStateExecuter.execute(ResolvePreviousStateExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:94)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:56)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
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.IllegalArgumentException: Multiple entries with same key: com.google.firebase.iid.R=com.google.firebase.iid.R(library class) and com.google.firebase.iid.R=com.google.firebase.iid.R(library class)
at com.android.tools.r8.com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:190)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:109)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:95)
at com.android.tools.r8.com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:373)
at com.android.tools.r8.graph.DirectMappedDexApplication$Builder.build(DirectMappedDexApplication.java:122)
at com.android.tools.r8.graph.DirectMappedDexApplication.rewrittenWithLense(DirectMappedDexApplication.java:75)
at com.android.tools.r8.R8.run(R8.java:359)
at com.android.tools.r8.R8.run(R8.java:229)
at com.android.tools.r8.R8.lambda$runForTesting$1(R8.java:220)
at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:60)
at com.android.tools.r8.utils.ExceptionUtils.withR8CompilationHandler(ExceptionUtils.java:48)
at com.android.tools.r8.R8.runForTesting(R8.java:216)
at com.android.tools.r8.R8.run(R8.java:129)
at com.android.builder.dexing.R8Tool.runR8(r8Tool.kt:184)
at com.android.build.gradle.internal.transforms.R8Transform.transform(R8Transform.kt:236)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:284)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:273)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:258)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:145)
at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:49)
at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:33)
at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:43)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:29)
at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:134)
at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$3(CacheStep.java:83)
at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82)
at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:36)
at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33)
at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38)
at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:91)
... 32 more
appView.setGraphLense(
new ProguardMapApplier(appView.withLiveness(), seedMapper).run(timing));
application = application.asDirect().rewrittenWithLense(appView.getGraphLense()); <<< line 359 in R8 1.3
./gradlew clean assembleDebug assembleAndroidTest -PagpVersion=3.3.0 -Pandroid.enableR8=true --stacktrace
Execution failed for task ':transformClassesAndResourcesWithR8ForDebugAndroidTest'.
> Multiple entries with same key: com.google.firebase.iid.R=com.google.firebase.iid.R(library class) and com.google.firebase.iid.R=com.google.firebase.iid.R(library class)
* 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 ':transformClassesAndResourcesWithR8ForDebugAndroidTest'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:119)
at org.gradle.api.internal.tasks.execution.ResolvePreviousStateExecuter.execute(ResolvePreviousStateExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:94)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:56)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
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.IllegalArgumentException: Multiple entries with same key: com.google.firebase.iid.R=com.google.firebase.iid.R(library class) and com.google.firebase.iid.R=com.google.firebase.iid.R(library class)
at com.android.tools.r8.com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:190)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:109)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:95)
at com.android.tools.r8.com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:373)
at com.android.tools.r8.graph.DirectMappedDexApplication$Builder.build(DirectMappedDexApplication.java:122)
at com.android.tools.r8.graph.DirectMappedDexApplication.rewrittenWithLense(DirectMappedDexApplication.java:75)
at com.android.tools.r8.R8.run(R8.java:359)
at com.android.tools.r8.R8.run(R8.java:229)
at com.android.tools.r8.R8.lambda$runForTesting$1(R8.java:220)
at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:60)
at com.android.tools.r8.utils.ExceptionUtils.withR8CompilationHandler(ExceptionUtils.java:48)
at com.android.tools.r8.R8.runForTesting(R8.java:216)
at com.android.tools.r8.R8.run(R8.java:129)
at com.android.builder.dexing.R8Tool.runR8(r8Tool.kt:184)
at com.android.build.gradle.internal.transforms.R8Transform.transform(R8Transform.kt:236)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:284)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:273)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:258)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:145)
at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:49)
at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:33)
at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:43)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:29)
at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:134)
at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$3(CacheStep.java:83)
at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82)
at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:36)
at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33)
at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38)
at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:91)
... 32 more
js...@google.com <js...@google.com> #3
Thanks for the report with the reproduction! I'm impressed how simple it is. :)
With --debug, I caught how r8 is invoked, see attached `how_r8_is_invoked.txt`. From there, I mimicked main-dex.conf and test.conf for Proguard configuration. Then, I can reproduce the same issue in a local setting:
$ java -jar build/libs/r8.jar --version
R8 1.5.0-dev
build engineering
$ java -jar build/libs/r8.jar --no-desugaring --no-tree-shaking --no-minification --output build/classes.dex.zip --pg-conf /usr/local/google/home/jsjeon/Downloads/r8_bug/test.conf --main-dex-rules /usr/local/google/home/jsjeon/Downloads/r8_bug/main-dex.conf
Compilation failed with an internal error.
java.lang.IllegalArgumentException: Multiple entries with same key: com.google.firebase.iid.R=com.google.firebase.iid.R(library class) and com.google.firebase.iid.R=com.google.firebase.iid.R(library class)
at com.android.tools.r8.com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:190)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:109)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:95)
at com.android.tools.r8.com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:373)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:503)
at com.android.tools.r8.graph.DirectMappedDexApplication$Builder.build(DirectMappedDexApplication.java:131)
at com.android.tools.r8.graph.DirectMappedDexApplication.rewrittenWithLense(DirectMappedDexApplication.java:79)
at com.android.tools.r8.R8.run(R8.java:403)
at com.android.tools.r8.R8.run(R8.java:243)
at com.android.tools.r8.R8.lambda$run$5(R8.java:708)
at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:62)
at com.android.tools.r8.utils.ExceptionUtils.withR8CompilationHandler(ExceptionUtils.java:50)
at com.android.tools.r8.R8.run(R8.java:707)
at com.android.tools.r8.R8.lambda$main$6(R8.java:724)
at com.android.tools.r8.utils.ExceptionUtils.withMainProgramHandler(ExceptionUtils.java:91)
at com.android.tools.r8.R8.main(R8.java:724)
at com.android.tools.r8.SwissArmyKnife.runDefault(SwissArmyKnife.java:86)
at com.android.tools.r8.SwissArmyKnife.main(SwissArmyKnife.java:80)
With --debug, I caught how r8 is invoked, see attached `how_r8_is_invoked.txt`. From there, I mimicked main-dex.conf and test.conf for Proguard configuration. Then, I can reproduce the same issue in a local setting:
$ java -jar build/libs/r8.jar --version
R8 1.5.0-dev
build engineering
$ java -jar build/libs/r8.jar --no-desugaring --no-tree-shaking --no-minification --output build/classes.dex.zip --pg-conf /usr/local/google/home/jsjeon/Downloads/r8_bug/test.conf --main-dex-rules /usr/local/google/home/jsjeon/Downloads/r8_bug/main-dex.conf
Compilation failed with an internal error.
java.lang.IllegalArgumentException: Multiple entries with same key: com.google.firebase.iid.R=com.google.firebase.iid.R(library class) and com.google.firebase.iid.R=com.google.firebase.iid.R(library class)
at com.android.tools.r8.com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:190)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:109)
at com.android.tools.r8.com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:95)
at com.android.tools.r8.com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:373)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:503)
at com.android.tools.r8.graph.DirectMappedDexApplication$Builder.build(DirectMappedDexApplication.java:131)
at com.android.tools.r8.graph.DirectMappedDexApplication.rewrittenWithLense(DirectMappedDexApplication.java:79)
at com.android.tools.r8.R8.run(R8.java:403)
at com.android.tools.r8.R8.run(R8.java:243)
at com.android.tools.r8.R8.lambda$run$5(R8.java:708)
at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:62)
at com.android.tools.r8.utils.ExceptionUtils.withR8CompilationHandler(ExceptionUtils.java:50)
at com.android.tools.r8.R8.run(R8.java:707)
at com.android.tools.r8.R8.lambda$main$6(R8.java:724)
at com.android.tools.r8.utils.ExceptionUtils.withMainProgramHandler(ExceptionUtils.java:91)
at com.android.tools.r8.R8.main(R8.java:724)
at com.android.tools.r8.SwissArmyKnife.runDefault(SwissArmyKnife.java:86)
at com.android.tools.r8.SwissArmyKnife.main(SwissArmyKnife.java:80)
js...@google.com <js...@google.com> #4
And I can confirm that, commenting out -applymapping line in the test.conf or commenting out the map applier in R8 got the build finished without an issue.
js...@google.com <js...@google.com> #5
In the R8-generated mapping,
com.google.firebase.iid.zzp -> com.google.firebase.iid.R:
com.google.android.gms.tasks.TaskCompletionSource zzaw -> d
com.google.firebase.iid.FirebaseInstanceId zzat -> a
java.lang.String zzau -> b
java.lang.String zzav -> c
java.lang.String zzax -> e
void onComplete(com.google.android.gms.tasks.Task) -> a
And during the test apk building, -applymapping changes
/usr/local/google/home/jsjeon/.gradle/caches/transforms-2/files-2.1/4336b94d1254fe58953af512f7f32c99/jars/classes.jar:com/google/firebase/iid/zzp.class
to ...iid.R.class and there is another one:
/usr/local/google/home/jsjeon/Downloads/r8_bug/build/intermediates/app_classes/debug/bundleDebugClasses/classes.jar:com/google/firebase/iid/R.class
com.google.firebase.iid.zzp -> com.google.firebase.iid.R:
com.google.android.gms.tasks.TaskCompletionSource zzaw -> d
com.google.firebase.iid.FirebaseInstanceId zzat -> a
java.lang.String zzau -> b
java.lang.String zzav -> c
java.lang.String zzax -> e
void onComplete(com.google.android.gms.tasks.Task) -> a
And during the test apk building, -applymapping changes
/usr/local/google/home/jsjeon/.gradle/caches/transforms-2/files-2.1/4336b94d1254fe58953af512f7f32c99/jars/classes.jar:com/google/firebase/iid/zzp.class
to ...iid.R.class and there is another one:
/usr/local/google/home/jsjeon/Downloads/r8_bug/build/intermediates/app_classes/debug/bundleDebugClasses/classes.jar:com/google/firebase/iid/R.class
ap...@google.com <ap...@google.com> #6
Project: r8
Branch: master
commit b5cbb4c89a524b527e457862b3c676374ec2e4e3
Author: Jinseong Jeon <jsjeon@google.com>
Date: Mon Jan 21 23:52:04 2019
Avoid using 'R' as a renamed class name.
Bug: 123092153, 122937067
Change-Id: I8ca0813e51bda22ce306a848317b1f6c1eb80bdf
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
A src/test/java/com/android/tools/r8/naming/AvoidRTest.java
https://r8-review.googlesource.com/33240
Branch: master
commit b5cbb4c89a524b527e457862b3c676374ec2e4e3
Author: Jinseong Jeon <jsjeon@google.com>
Date: Mon Jan 21 23:52:04 2019
Avoid using 'R' as a renamed class name.
Bug: 123092153, 122937067
Change-Id: I8ca0813e51bda22ce306a848317b1f6c1eb80bdf
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
A src/test/java/com/android/tools/r8/naming/AvoidRTest.java
ap...@google.com <ap...@google.com> #7
Project: r8
Branch: d8-1.4
commit 28b10fe1b3bf398e789354c3f364237808ad59d7
Author: Jinseong Jeon <jsjeon@google.com>
Date: Tue Jan 22 13:10:17 2019
Version 1.4.28
Cherry pick: Avoid using 'R' as a renamed class name.
CL:https://r8-review.googlesource.com/c/r8/+/33240
Bug: 123092153, 122937067
Change-Id: I0e775a7a50cddcf985031bf3c103f3f8faa3d106
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
A src/test/java/com/android/tools/r8/naming/AvoidRTest.java
https://r8-review.googlesource.com/33275
Branch: d8-1.4
commit 28b10fe1b3bf398e789354c3f364237808ad59d7
Author: Jinseong Jeon <jsjeon@google.com>
Date: Tue Jan 22 13:10:17 2019
Version 1.4.28
Cherry pick: Avoid using 'R' as a renamed class name.
CL:
Bug: 123092153, 122937067
Change-Id: I0e775a7a50cddcf985031bf3c103f3f8faa3d106
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
A src/test/java/com/android/tools/r8/naming/AvoidRTest.java
ap...@google.com <ap...@google.com> #8
Project: r8
Branch: d8-1.3
commit 8ed020f753f70e02a686a19d68244c49100f75ba
Author: Jinseong Jeon <jsjeon@google.com>
Date: Tue Jan 22 13:27:11 2019
Version 1.3.53
Cherry-pick: Avoid using 'R' as a renamed class name.
CL:https://r8-review.googlesource.com/c/r8/+/33240
along with lots of test infra updates.
Also, update AvoidRTest a bit since 1.3 branch still has a default keep
rule behavior.
Bug: 123092153, 122937067
Change-Id: I64e448a4561e7e073d70e1132a8fe5f13cf67266
M src/main/java/com/android/tools/r8/R8Command.java
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
M src/main/java/com/android/tools/r8/utils/InternalOptions.java
M src/test/java/com/android/tools/r8/D8TestCompileResult.java
M src/test/java/com/android/tools/r8/D8TestRunResult.java
M src/test/java/com/android/tools/r8/DXTestCompileResult.java
M src/test/java/com/android/tools/r8/DXTestRunResult.java
M src/test/java/com/android/tools/r8/JvmTestBuilder.java
A src/test/java/com/android/tools/r8/JvmTestRunResult.java
M src/test/java/com/android/tools/r8/ProguardTestBuilder.java
M src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
M src/test/java/com/android/tools/r8/ProguardTestRunResult.java
M src/test/java/com/android/tools/r8/R8TestBuilder.java
M src/test/java/com/android/tools/r8/R8TestCompileResult.java
M src/test/java/com/android/tools/r8/R8TestRunResult.java
M src/test/java/com/android/tools/r8/TestBase.java
A src/test/java/com/android/tools/r8/TestBaseBuilder.java
A src/test/java/com/android/tools/r8/TestBaseResult.java
M src/test/java/com/android/tools/r8/TestBuilder.java
M src/test/java/com/android/tools/r8/TestCompileResult.java
M src/test/java/com/android/tools/r8/TestCompilerBuilder.java
M src/test/java/com/android/tools/r8/TestRunResult.java
M src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
M src/test/java/com/android/tools/r8/ToolHelper.java
A src/test/java/com/android/tools/r8/naming/AvoidRTest.java
M src/test/java/com/android/tools/r8/shaking/fields/FieldsTestBase.java
https://r8-review.googlesource.com/33276
Branch: d8-1.3
commit 8ed020f753f70e02a686a19d68244c49100f75ba
Author: Jinseong Jeon <jsjeon@google.com>
Date: Tue Jan 22 13:27:11 2019
Version 1.3.53
Cherry-pick: Avoid using 'R' as a renamed class name.
CL:
along with lots of test infra updates.
Also, update AvoidRTest a bit since 1.3 branch still has a default keep
rule behavior.
Bug: 123092153, 122937067
Change-Id: I64e448a4561e7e073d70e1132a8fe5f13cf67266
M src/main/java/com/android/tools/r8/R8Command.java
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
M src/main/java/com/android/tools/r8/utils/InternalOptions.java
M src/test/java/com/android/tools/r8/D8TestCompileResult.java
M src/test/java/com/android/tools/r8/D8TestRunResult.java
M src/test/java/com/android/tools/r8/DXTestCompileResult.java
M src/test/java/com/android/tools/r8/DXTestRunResult.java
M src/test/java/com/android/tools/r8/JvmTestBuilder.java
A src/test/java/com/android/tools/r8/JvmTestRunResult.java
M src/test/java/com/android/tools/r8/ProguardTestBuilder.java
M src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
M src/test/java/com/android/tools/r8/ProguardTestRunResult.java
M src/test/java/com/android/tools/r8/R8TestBuilder.java
M src/test/java/com/android/tools/r8/R8TestCompileResult.java
M src/test/java/com/android/tools/r8/R8TestRunResult.java
M src/test/java/com/android/tools/r8/TestBase.java
A src/test/java/com/android/tools/r8/TestBaseBuilder.java
A src/test/java/com/android/tools/r8/TestBaseResult.java
M src/test/java/com/android/tools/r8/TestBuilder.java
M src/test/java/com/android/tools/r8/TestCompileResult.java
M src/test/java/com/android/tools/r8/TestCompilerBuilder.java
M src/test/java/com/android/tools/r8/TestRunResult.java
M src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
M src/test/java/com/android/tools/r8/ToolHelper.java
A src/test/java/com/android/tools/r8/naming/AvoidRTest.java
M src/test/java/com/android/tools/r8/shaking/fields/FieldsTestBase.java
js...@google.com <js...@google.com> #9
A workaround at comment #6 is cherry-picked to 1.3 and 1.4 branch. Those would be available as part of AS 3.3.1, AS 3.4 beta03, and AS 3.5 canary 03 or 04.
Meanwhile, with the repro at comment #1 , I can confirm it avoids such conflict:
$ cat build.gradle
buildscript {
repositories {
maven {
url 'http://storage.googleapis.com/r8-releases/raw '
}
maven {
url 'https://kotlin.bintray.com/kotlinx/ '
}
google()
jcenter()
}
dependencies {
classpath 'com.android.tools:r8:1.3.53' // Must be before the Gradle Plugin for Android.
def agpVersion = project.properties['agpVersion'] ?: "3.3.0"
classpath "com.android.tools.build:gradle:$agpVersion"
}
}
... // remaining portion is same
$ ./gradlew assembleAndroidTest
...
BUILD SUCCESSFUL in 7s
------
I filed an internal issue to track how to handle name clash during test apk generation in general.
Meanwhile, with the repro at
$ cat build.gradle
buildscript {
repositories {
maven {
url '
}
maven {
url '
}
google()
jcenter()
}
dependencies {
classpath 'com.android.tools:r8:1.3.53' // Must be before the Gradle Plugin for Android.
def agpVersion = project.properties['agpVersion'] ?: "3.3.0"
classpath "com.android.tools.build:gradle:$agpVersion"
}
}
... // remaining portion is same
$ ./gradlew assembleAndroidTest
...
BUILD SUCCESSFUL in 7s
------
I filed an internal issue to track how to handle name clash during test apk generation in general.
Description
Affected AGP versions: `3.3.0`, `3.4.0-beta01` and `3.5.0-alpha01`.
Use case:
In order to make sure my application works as expected after Obfuscation and Shrinking, I run instrumentation tests against a variant with `minifyEnabled true`.
*Steps to reproduce:*
1. Create a project
2. Add the dependency: `implementation "com.google.firebase:firebase-iid:17.0.4"`
3. Set `minifyEnabled true` for the variant used as "testBuildType"
*Expected result:*
Build succeeds
*Actual result:*
```
Execution failed for task ':transformClassesAndResourcesWithR8ForDebugAndroidTest'.
> Multiple entries with same key: com.google.firebase.iid.R=com.google.firebase.iid.R(library class) and com.google.firebase.iid.R=com.google.firebase.iid.R(library class)
```
*Instructions for the attached example project:*
```
$ ./gradlew clean assembleDebug assembleAndroidTest -PagpVersion=3.3.0 -Pandroid.enableR8=true # fails with R8
$ ./gradlew clean assembleDebug assembleAndroidTest -PagpVersion=3.3.0 -Pandroid.enableR8=false # succeeds with Proguard
```