Allow merging j$ files for Google3
Bug:134732760
Change-Id: I958215f746bd77acf22ea62e98a919c3568b7cf2
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index d593119..6905dbf 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -395,7 +395,8 @@
assert !internal.isMinifying();
assert !internal.passthroughDexCode;
internal.passthroughDexCode = true;
- assert internal.neverMergePrefixes.contains("j$.");
+ // TODO(b/138278440): Forbid to merge j$ classes in a Google3 compliant way.
+ // assert internal.neverMergePrefixes.contains("j$.");
// Assert some of R8 optimizations are disabled.
assert !internal.enableDynamicTypeOptimization;
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 2347076..bcbeac1 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -161,7 +161,8 @@
// Flag to toggle if DEX code objects should pass-through without IR processing.
public boolean passthroughDexCode = false;
// By default dissalow merging dex files resulting from Java 8 library desugaring.
- public Set<String> neverMergePrefixes = ImmutableSet.of("j$.");
+ // TODO(b/138278440): Forbid to merge j$ classes in a Google3 compliant way.
+ public Set<String> neverMergePrefixes = ImmutableSet.of();
public boolean libraryInterfacesMayHaveStaticInitialization = false;
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/MergingJ$Test.java b/src/test/java/com/android/tools/r8/desugar/corelib/MergingJ$Test.java
new file mode 100644
index 0000000..36561cb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/MergingJ$Test.java
@@ -0,0 +1,75 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.corelib;
+
+import static junit.framework.TestCase.assertNotNull;
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.L8;
+import com.android.tools.r8.L8Command;
+import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.desugar.corelib.corelibjdktests.Jdk11CoreLibTestBase;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.nio.file.Path;
+import org.junit.Test;
+
+public class MergingJ$Test extends Jdk11CoreLibTestBase {
+
+ @Test
+ public void testMergingJ$() throws Exception {
+ Path mergerInputPart1 = buildSplitDesugaredLibraryPart1();
+ Path mergerInputPart2 = buildSplitDesugaredLibraryPart2();
+ CodeInspector codeInspectorOutput = null;
+ try {
+ codeInspectorOutput =
+ testForD8().addProgramFiles(mergerInputPart1, mergerInputPart2).compile().inspector();
+ } catch (Exception e) {
+ if (e.getCause().getMessage().contains("Merging dex file containing classes with prefix")) {
+ // TODO(b/138278440): Forbid to merge j$ classes in a Google3 compliant way.
+ // In Google 3 the Dex merger is used to merge the Bazel desugared core library.
+ // The Dex merger has to be able to merge multiple classes with the prefix j$ for this case.
+ // The following should therefore not raise:
+ // "Merging dex file containing classes with prefix j$. is not allowed."
+ fail();
+ }
+ throw e;
+ }
+ CodeInspector codeInspectorSplit1 = new CodeInspector(mergerInputPart1);
+ CodeInspector codeInspectorSplit2 = new CodeInspector(mergerInputPart2);
+ assertNotNull(codeInspectorOutput);
+ assertTrue(codeInspectorOutput.allClasses().size() > codeInspectorSplit1.allClasses().size());
+ assertTrue(codeInspectorOutput.allClasses().size() > codeInspectorSplit2.allClasses().size());
+ }
+
+ private Path buildSplitDesugaredLibraryPart1() throws Exception {
+ Path output = temp.newFolder().toPath().resolve("merger-input.zip");
+ L8.run(
+ L8Command.builder()
+ .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addProgramFiles(ToolHelper.getDesugarJDKLibs())
+ .addSpecialLibraryConfiguration("default")
+ .setMinApiLevel(AndroidApiLevel.B.getLevel())
+ .setOutput(output, OutputMode.DexIndexed)
+ .build());
+ return output;
+ }
+
+ private Path buildSplitDesugaredLibraryPart2() throws Exception {
+ Path output = temp.newFolder().toPath().resolve("merger-input-split.zip");
+ L8.run(
+ L8Command.builder()
+ .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addProgramFiles(JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES)
+ .addClasspathFiles(ToolHelper.getDesugarJDKLibs())
+ .addSpecialLibraryConfiguration("default")
+ .setMinApiLevel(AndroidApiLevel.B.getLevel())
+ .setOutput(output, OutputMode.DexIndexed)
+ .build());
+ return output;
+ }
+}