Report warnings in D8 and R8 for deprecated use of --main-dex-list.
Bug: 181858113
Change-Id: Icc2fdc2189ae18d4e7e25df9fa8f9d4ce6b43dff
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 30579d8..e6cc1f5 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -284,7 +284,7 @@
{
ApplicationReader applicationReader = new ApplicationReader(inputApp, options, timing);
DirectMappedDexApplication application = applicationReader.read(executorService).toDirect();
- MainDexInfo mainDexInfo = applicationReader.readMainDexClasses(application);
+ MainDexInfo mainDexInfo = applicationReader.readMainDexClassesForR8(application);
// Now that the dex-application is fully loaded, close any internal archive providers.
inputApp.closeInternalArchiveProviders();
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index 21de6ac..df1a88b 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -17,6 +17,7 @@
import com.android.tools.r8.ResourceException;
import com.android.tools.r8.StringResource;
import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.graph.ClassKind;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexClass;
@@ -29,6 +30,7 @@
import com.android.tools.r8.graph.JarClassFileReader;
import com.android.tools.r8.graph.LazyLoadedDexApplication;
import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.MainDexInfo;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
@@ -65,6 +67,9 @@
private final Timing timing;
private final AndroidApp inputApp;
+ private boolean hasReadProgramResourcesFromCf = false;
+ private boolean hasReadProgramResourcesFromDex = false;
+
public interface ProgramClassConflictResolver {
DexProgramClass resolveClassConflict(DexProgramClass a, DexProgramClass b);
}
@@ -151,7 +156,9 @@
// TODO: try and preload less classes.
readProguardMap(proguardMap, builder, executorService, futures);
ClassReader classReader = new ClassReader(executorService, futures);
- JarClassFileReader<DexProgramClass> jcf = classReader.readSources();
+ classReader.readSources();
+ hasReadProgramResourcesFromCf = classReader.hasReadProgramResourceFromCf;
+ hasReadProgramResourcesFromDex = classReader.hasReadProgramResourceFromDex;
ThreadUtils.awaitFutures(futures);
classReader.initializeLazyClassCollection(builder);
for (ProgramResourceProvider provider : inputApp.getProgramResourceProviders()) {
@@ -199,17 +206,35 @@
}
public MainDexInfo readMainDexClasses(DexApplication app) {
+ return readMainDexClasses(app, hasReadProgramResourcesFromCf);
+ }
+
+ public MainDexInfo readMainDexClassesForR8(DexApplication app) {
+ // Officially R8 only support reading CF program inputs, thus we always generate a deprecated
+ // diagnostic if main-dex list is used.
+ return readMainDexClasses(app, true);
+ }
+
+ private MainDexInfo readMainDexClasses(DexApplication app, boolean emitDeprecatedDiagnostics) {
MainDexInfo.Builder builder = MainDexInfo.none().builder();
if (inputApp.hasMainDexList()) {
for (StringResource resource : inputApp.getMainDexListResources()) {
+ if (emitDeprecatedDiagnostics) {
+ options.reporter.warning(new UnsupportedMainDexListUsageDiagnostic(resource.getOrigin()));
+ }
addToMainDexClasses(app, builder, MainDexListParser.parseList(resource, itemFactory));
}
- addToMainDexClasses(
- app,
- builder,
- inputApp.getMainDexClasses().stream()
- .map(clazz -> itemFactory.createType(DescriptorUtils.javaTypeToDescriptor(clazz)))
- .collect(Collectors.toList()));
+ if (!inputApp.getMainDexClasses().isEmpty()) {
+ if (emitDeprecatedDiagnostics) {
+ options.reporter.warning(new UnsupportedMainDexListUsageDiagnostic(Origin.unknown()));
+ }
+ addToMainDexClasses(
+ app,
+ builder,
+ inputApp.getMainDexClasses().stream()
+ .map(clazz -> itemFactory.createType(DescriptorUtils.javaTypeToDescriptor(clazz)))
+ .collect(Collectors.toList()));
+ }
}
return builder.buildList();
}
@@ -291,6 +316,13 @@
// Jar application reader to share across all class readers.
private final JarApplicationReader application = new JarApplicationReader(options);
+ // Flag of which input resource types have flowen into the program classes.
+ // Note that this is just at the level of the resources having been given.
+ // It is possible to have, e.g., an empty dex file, so no classes, but this will still be true
+ // as there was a dex resource.
+ private boolean hasReadProgramResourceFromCf = false;
+ private boolean hasReadProgramResourceFromDex = false;
+
ClassReader(ExecutorService executorService, List<Future<?>> futures) {
this.executorService = executorService;
this.futures = futures;
@@ -298,36 +330,42 @@
private void readDexSources(List<ProgramResource> dexSources, Queue<DexProgramClass> classes)
throws IOException, ResourceException {
- if (dexSources.size() > 0) {
- List<DexParser<DexProgramClass>> dexParsers = new ArrayList<>(dexSources.size());
- int computedMinApiLevel = options.minApiLevel;
- for (ProgramResource input : dexSources) {
- DexReader dexReader = new DexReader(input);
- if (options.passthroughDexCode) {
- computedMinApiLevel = validateOrComputeMinApiLevel(computedMinApiLevel, dexReader);
- }
- dexParsers.add(new DexParser<>(dexReader, PROGRAM, options));
+ if (dexSources.isEmpty()) {
+ return;
+ }
+ hasReadProgramResourceFromDex = true;
+ List<DexParser<DexProgramClass>> dexParsers = new ArrayList<>(dexSources.size());
+ int computedMinApiLevel = options.minApiLevel;
+ for (ProgramResource input : dexSources) {
+ DexReader dexReader = new DexReader(input);
+ if (options.passthroughDexCode) {
+ computedMinApiLevel = validateOrComputeMinApiLevel(computedMinApiLevel, dexReader);
}
+ dexParsers.add(new DexParser<>(dexReader, PROGRAM, options));
+ }
- options.minApiLevel = computedMinApiLevel;
+ options.minApiLevel = computedMinApiLevel;
+ for (DexParser<DexProgramClass> dexParser : dexParsers) {
+ dexParser.populateIndexTables();
+ }
+ // Read the DexCode items and DexProgramClass items in parallel.
+ if (!options.skipReadingDexCode) {
for (DexParser<DexProgramClass> dexParser : dexParsers) {
- dexParser.populateIndexTables();
- }
- // Read the DexCode items and DexProgramClass items in parallel.
- if (!options.skipReadingDexCode) {
- for (DexParser<DexProgramClass> dexParser : dexParsers) {
- futures.add(
- executorService.submit(
- () -> {
- dexParser.addClassDefsTo(classes::add); // Depends on Methods, Code items etc.
- }));
- }
+ futures.add(
+ executorService.submit(
+ () -> {
+ dexParser.addClassDefsTo(classes::add); // Depends on Methods, Code items etc.
+ }));
}
}
}
- private JarClassFileReader<DexProgramClass> readClassSources(
+ private void readClassSources(
List<ProgramResource> classSources, Queue<DexProgramClass> classes) {
+ if (classSources.isEmpty()) {
+ return;
+ }
+ hasReadProgramResourceFromCf = true;
JarClassFileReader<DexProgramClass> reader =
new JarClassFileReader<>(application, classes::add, PROGRAM);
// Read classes in parallel.
@@ -341,10 +379,9 @@
return null;
}));
}
- return reader;
}
- JarClassFileReader<DexProgramClass> readSources() throws IOException, ResourceException {
+ void readSources() throws IOException, ResourceException {
Collection<ProgramResource> resources = inputApp.computeAllProgramResources();
List<ProgramResource> dexResources = new ArrayList<>(resources.size());
List<ProgramResource> cfResources = new ArrayList<>(resources.size());
@@ -357,7 +394,7 @@
}
}
readDexSources(dexResources, programClasses);
- return readClassSources(cfResources, programClasses);
+ readClassSources(cfResources, programClasses);
}
private <T extends DexClass> ClassProvider<T> buildClassProvider(
diff --git a/src/main/java/com/android/tools/r8/errors/UnsupportedMainDexListUsageDiagnostic.java b/src/main/java/com/android/tools/r8/errors/UnsupportedMainDexListUsageDiagnostic.java
new file mode 100644
index 0000000..9bcbcba
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/UnsupportedMainDexListUsageDiagnostic.java
@@ -0,0 +1,40 @@
+// Copyright (c) 2021, 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.errors;
+
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+/**
+ * Diagnostic to issue warnings/errors for unsupported usage of main-dex list.
+ *
+ * <p>See b/181858113 for context.
+ */
+@Keep
+public class UnsupportedMainDexListUsageDiagnostic implements Diagnostic {
+ private final Origin origin;
+
+ public UnsupportedMainDexListUsageDiagnostic(Origin origin) {
+ this.origin = origin;
+ }
+
+ @Override
+ public Origin getOrigin() {
+ return origin;
+ }
+
+ @Override
+ public Position getPosition() {
+ return Position.UNKNOWN;
+ }
+
+ @Override
+ public String getDiagnosticMessage() {
+ return "Unsupported usage of main-dex list. "
+ + "The usage of main-dex-list content for the compilation of non-DEX inputs is deprecated. "
+ + "See issue https://issuetracker.google.com/181858113 for context.";
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
index 8e33480..8e5dd69 100644
--- a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
+++ b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
@@ -95,7 +95,17 @@
ProcessBuilder builder = new ProcessBuilder(command);
ProcessResult result = ToolHelper.runProcess(builder);
assertEquals(result.stderr + "\n" + result.stdout, 0, result.exitCode);
- Assert.assertTrue(result.stdout, result.stdout.isEmpty());
- Assert.assertTrue(result.stderr, result.stderr.isEmpty());
+ Assert.assertEquals("", filterOutMainDexListWarnings(result.stdout));
+ Assert.assertEquals("", result.stderr);
+ }
+
+ public static String filterOutMainDexListWarnings(String output) {
+ StringBuilder builder = new StringBuilder();
+ for (String line : output.split("\n")) {
+ if (!line.contains("Unsupported usage of main-dex list")) {
+ builder.append(line).append("\n");
+ }
+ }
+ return builder.toString();
}
}
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
index 0700a5f..03ba4b8 100644
--- a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
@@ -89,4 +89,9 @@
public GenerateMainDexListTestBuilder addDataEntryResources(DataEntryResource... resources) {
return addDataResources(Arrays.asList(resources));
}
+
+ public GenerateMainDexListTestBuilder setMainDexListOutputPath(Path output) {
+ builder.setMainDexListOutputPath(output);
+ return self();
+ }
}
diff --git a/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java b/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java
index ac3d89f..67753da 100644
--- a/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java
+++ b/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java
@@ -4,7 +4,6 @@
package com.android.tools.r8;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -82,7 +81,7 @@
ProcessBuilder builder = new ProcessBuilder(command);
ProcessResult result = ToolHelper.runProcess(builder);
assertEquals(result.stderr + "\n" + result.stdout, 0, result.exitCode);
- assertTrue(result.stdout, result.stdout.isEmpty());
- assertTrue(result.stderr, result.stderr.isEmpty());
+ assertEquals("", D8ApiBinaryCompatibilityTests.filterOutMainDexListWarnings(result.stdout));
+ assertEquals("", result.stderr);
}
}
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index e1d8658..0d90a34 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -229,7 +229,7 @@
return addMainDexRuleFiles(Arrays.asList(files));
}
- public T addMainDexClassRules(Class<?>... classes) {
+ public T addMainDexKeepClassRules(Class<?>... classes) {
for (Class<?> clazz : classes) {
addMainDexRules("-keep class " + clazz.getTypeName());
}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java
index 613cc0b..2aeacb8 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.classmerging.horizontal;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsNot.not;
@@ -13,9 +14,7 @@
import com.android.tools.r8.R8TestCompileResult;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.A;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.B;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.Main;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.nio.file.Path;
import org.junit.Test;
@@ -36,6 +35,8 @@
.build();
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
+ // Ensure the main-dex-rules variant of this test (PreventMergeMainDexTracingTest) is sufficient.
@Test
public void testR8() throws Exception {
testForR8(parameters.getBackend())
@@ -45,7 +46,13 @@
.addOptionsModification(options -> options.minimalMainDex = true)
.enableNeverClassInliningAnnotations()
.setMinApi(parameters.getApiLevel())
- .compile()
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)))
.apply(this::checkCompileResult)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("main dex");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java
index a97e6f5..de0bd57 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java
@@ -40,7 +40,7 @@
.addInnerClasses(getClass())
.addKeepMainRule(Main.class)
.addKeepClassAndMembersRules(Other.class)
- .addMainDexClassRules(Main.class)
+ .addMainDexKeepClassRules(Main.class)
.addOptionsModification(options -> options.minimalMainDex = true)
.enableNeverClassInliningAnnotations()
.enableNoHorizontalClassMergingAnnotations()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index 43f53ab..624e8a0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -11,6 +11,8 @@
import com.android.tools.r8.GenerateLintFiles;
import com.android.tools.r8.StringResource;
import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.ir.desugar.DesugaredLibraryConfiguration;
@@ -26,9 +28,22 @@
import java.util.List;
import org.junit.Assume;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+@RunWith(Parameterized.class)
public class LintFilesTest extends TestBase {
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ public LintFilesTest(TestParameters parameters) {
+ parameters.assertNoneRuntime();
+ }
+
private void checkFileContent(AndroidApiLevel minApiLevel, Path lintFile) throws Exception {
// Just do some light probing in the generated lint files.
List<String> methods = FileUtils.readAllLines(lintFile);
diff --git a/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java b/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java
index 7c8eafe..1d01be7 100644
--- a/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java
+++ b/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.dump;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -12,7 +13,6 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.StringUtils;
@@ -89,19 +89,32 @@
"pre-native-multidex only",
parameters.getApiLevel().isLessThanOrEqualTo(AndroidApiLevel.K));
Path dumpDir = temp.newFolder().toPath();
+ // Pre-compile to DEX and do main-dex list on DEX inputs only.
+ Path dexed =
+ testForD8()
+ .addInnerClasses(DumpMainDexInputsTest.class)
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .writeToZip();
+
testForD8()
+ .addProgramFiles(dexed)
.setMinApi(parameters.getApiLevel())
- .addInnerClasses(DumpMainDexInputsTest.class)
.addMainDexListFiles(
mainDexListForMainDexFile1AndMainDexFile2(), mainDexListForMainDexFile3())
.addMainDexListClasses(MainDexClass1.class, MainDexClass2.class, TestClass.class)
- .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
.addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
- .compile()
- .assertAllInfoMessagesMatch(containsString("Dumped compilation inputs to:"))
- .assertAllWarningMessagesMatch(
- containsString(
- "Dumping main dex list resources may have side effects due to I/O on Paths."))
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertNoErrors()
+ .assertInfosMatch(
+ diagnosticMessage(containsString("Dumped compilation inputs to:")))
+ .assertWarningsMatch(
+ diagnosticMessage(
+ containsString(
+ "Dumping main dex list resources may have side effects due to I/O"
+ + " on Paths."))))
.run(parameters.getRuntime(), TestClass.class)
.assertSuccessWithOutputLines("Hello, world");
verifyDumpDir(dumpDir, true);
@@ -117,7 +130,7 @@
.setMinApi(parameters.getApiLevel())
.addInnerClasses(DumpMainDexInputsTest.class)
.addMainDexRulesFiles(newMainDexRulesPath1(), newMainDexRulesPath2())
- .addMainDexListClasses(MainDexClass1.class, MainDexClass2.class, TestClass.class)
+ .addMainDexKeepClassRules(MainDexClass1.class, MainDexClass2.class, TestClass.class)
.addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
.compile()
.assertAllInfoMessagesMatch(containsString("Dumped compilation inputs to:"))
@@ -136,7 +149,7 @@
.setMinApi(parameters.getApiLevel())
.addInnerClasses(DumpMainDexInputsTest.class)
.addMainDexRuleFiles(newMainDexRulesPath1(), newMainDexRulesPath2())
- .addMainDexListClasses(MainDexClass1.class, MainDexClass2.class, TestClass.class)
+ .addMainDexKeepClassRules(MainDexClass1.class, MainDexClass2.class, TestClass.class)
.addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
.addKeepAllClassesRule()
.allowDiagnosticMessages()
@@ -168,9 +181,10 @@
assertTrue(Files.exists(unzipped.resolve("r8-version")));
assertTrue(Files.exists(unzipped.resolve("program.jar")));
assertTrue(Files.exists(unzipped.resolve("library.jar")));
- assertTrue(Files.exists(unzipped.resolve("main-dex-list.txt")));
if (checkMainDexList) {
- String mainDex = new String(Files.readAllBytes(unzipped.resolve("main-dex-list.txt")));
+ Path mainDexListFile = unzipped.resolve("main-dex-list.txt");
+ assertTrue(Files.exists(mainDexListFile));
+ String mainDex = new String(Files.readAllBytes(mainDexListFile));
List<String> mainDexLines =
Arrays.stream(mainDex.split("\n")).filter(s -> !s.isEmpty()).collect(toList());
assertEquals(6, mainDexLines.size());
@@ -186,7 +200,9 @@
.collect(toList());
assertEquals(expected, mainDexLines);
} else {
- String mainDexRules = new String(Files.readAllBytes(unzipped.resolve("main-dex-rules.txt")));
+ Path mainDexRulesFile = unzipped.resolve("main-dex-rules.txt");
+ assertTrue(Files.exists(mainDexRulesFile));
+ String mainDexRules = new String(Files.readAllBytes(mainDexRulesFile));
assertThat(mainDexRules, containsString(mainDexRulesForMainDexFile1AndMainDexFile2));
assertThat(mainDexRules, containsString(mainDexRulesForMainDexFile3));
}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
index 6cb7ab4..ad0cf84 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
@@ -79,13 +79,16 @@
});
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void testMainDexClasses() throws Exception {
assumeTrue(parameters.isDexRuntime());
assumeTrue(parameters.getDexRuntimeVersion().isDalvik());
runTest(
r8FullTestBuilder ->
- r8FullTestBuilder.addMainDexListClasses(I.class, Provider.class, Main.class),
+ r8FullTestBuilder
+ .addMainDexListClasses(I.class, Provider.class, Main.class)
+ .allowDiagnosticWarningMessages(),
this::inspect);
}
@@ -94,7 +97,7 @@
assumeTrue(parameters.isDexRuntime());
assumeTrue(parameters.getDexRuntimeVersion().isDalvik());
runTest(
- r8FullTestBuilder -> r8FullTestBuilder.addMainDexClassRules(Main.class, I.class),
+ r8FullTestBuilder -> r8FullTestBuilder.addMainDexKeepClassRules(Main.class, I.class),
this::inspect);
}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
index 5f21fee..3290031 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.maindexlist;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethod;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -15,6 +16,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -59,6 +61,7 @@
this.parameters = parameters;
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void test() throws Exception {
// The generated main dex list should contain Main (which is a root) and A (which is a direct
@@ -82,7 +85,13 @@
.enableNoHorizontalClassMergingAnnotations()
.setMinApi(parameters.getApiLevel())
.noMinification()
- .compile();
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
CodeInspector inspector = compileResult.inspector();
ClassSubject mainClassSubject = inspector.clazz(Main.class);
assertThat(mainClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
index 98ec426..013fdd3 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.maindexlist;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethod;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -16,6 +17,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -61,6 +63,7 @@
this.parameters = parameters;
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void test() throws Exception {
// The generated main dex list should contain Main (which is a root) and A (which is a direct
@@ -80,7 +83,13 @@
.enableNoHorizontalClassMergingAnnotations()
.enableNoHorizontalClassMergingAnnotations()
.setMinApi(parameters.getApiLevel())
- .compile();
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
CodeInspector inspector = compileResult.inspector();
ClassSubject mainClassSubject = inspector.clazz(Main.class);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
index f5971f9..bb3b81c 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.maindexlist;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethod;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -16,6 +17,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -61,6 +63,7 @@
this.parameters = parameters;
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void test() throws Exception {
// The generated main dex list should contain Main (which is a root) and A (which is a direct
@@ -84,7 +87,13 @@
.enableNoHorizontalClassMergingAnnotations()
.noMinification()
.setMinApi(parameters.getApiLevel())
- .compile();
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
CodeInspector inspector = compileResult.inspector();
ClassSubject mainClassSubject = inspector.clazz(Main.class);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
index c2c96ec..4d59d9b 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
@@ -65,6 +65,7 @@
this.parameters = parameters;
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void testMainDexList() throws Exception {
assertEquals(3, mainDexList.size());
@@ -73,7 +74,9 @@
assertTrue(mainDexReferences.contains(A.class.getTypeName()));
assertTrue(mainDexReferences.contains(B.class.getTypeName()));
assertTrue(mainDexReferences.contains(Main.class.getTypeName()));
- runTest(builder -> builder.addMainDexListClassReferences(mainDexList));
+ runTest(
+ builder ->
+ builder.addMainDexListClassReferences(mainDexList).allowDiagnosticWarningMessages());
}
@Test
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
index ec50d1e..480abb7 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
@@ -65,6 +65,7 @@
this.parameters = parameters;
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void testMainDexList() throws Exception {
assertEquals(3, mainDexList.size());
@@ -73,7 +74,9 @@
assertTrue(mainDexReferences.contains(A.class.getTypeName()));
assertTrue(mainDexReferences.contains(B.class.getTypeName()));
assertTrue(mainDexReferences.contains(Main.class.getTypeName()));
- runTest(builder -> builder.addMainDexListClassReferences(mainDexList));
+ runTest(
+ builder ->
+ builder.addMainDexListClassReferences(mainDexList).allowDiagnosticWarningMessages());
}
@Test
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java
index 09df9d4..731d0ec 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.maindexlist;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertFalse;
@@ -14,6 +15,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import org.junit.Test;
@@ -37,6 +39,7 @@
this.parameters = parameters;
}
+ // TODO(b/181858113): This test should be converted to a main-dex-rules test.
@Test
public void test() throws Exception {
R8TestCompileResult compileResult =
@@ -47,7 +50,13 @@
.collectMainDexClasses()
.enableNoHorizontalClassMergingAnnotations()
.setMinApi(parameters.getApiLevel())
- .compile();
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
CodeInspector inspector = compileResult.inspector();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java
index 8f5d997..e72cc3e 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.maindexlist;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -11,6 +12,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import org.junit.Test;
@@ -34,17 +36,24 @@
this.parameters = parameters;
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void test() throws Exception {
R8TestCompileResult compileResult =
testForR8(parameters.getBackend())
.addInnerClasses(getClass())
.addMainDexListClasses(A.class)
- .addMainDexClassRules(B.class)
+ .addMainDexKeepClassRules(B.class)
.collectMainDexClasses()
.noTreeShaking()
.setMinApi(parameters.getApiLevel())
- .compile();
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
CodeInspector inspector = compileResult.inspector();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java
index e2d7dd2..c10a7a6 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java
@@ -48,11 +48,12 @@
testMainDex(builder -> {}, Assert::assertNull);
}
+ // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@Test
public void testMainDexClassesList() throws Exception {
assumeTrue(parameters.getDexRuntimeVersion().isDalvik());
testMainDex(
- builder -> builder.addMainDexListClasses(Main.class),
+ builder -> builder.addMainDexListClasses(Main.class).allowDiagnosticWarningMessages(),
mainDexClasses -> assertEquals(ImmutableSet.of(Main.class.getTypeName()), mainDexClasses));
}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java
index 8252f4d..16dc8db 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java
@@ -3,6 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.maindexlist;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticOrigin;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
+import static org.hamcrest.CoreMatchers.allOf;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
@@ -11,11 +14,17 @@
import com.android.tools.r8.R8TestCompileResult;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestCompileResult;
+import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.nio.file.Files;
@@ -81,23 +90,67 @@
checkCompilationResult(compileResult);
}
+ @Test
+ public void testSupportedMainDexListD8() throws Exception {
+ assumeTrue(parameters.isDexRuntime());
+ // It remains a supported mode to first compile to DEX and then use tracing on the compiled
+ // output. Neither the compilation, the trace or the merge should issue any diagnostics.
+ Path dexed =
+ testForD8()
+ .addInnerClasses(MainDexWithSynthesizedClassesTest.class)
+ .setMinApi(parameters.getApiLevel())
+ .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages)
+ .writeToZip();
+
+ Path mainDexFile = temp.newFile("maindex.list").toPath();
+ testForMainDexListGenerator()
+ .addLibraryFiles(ToolHelper.getFirstSupportedAndroidJar(parameters.getApiLevel()))
+ .addProgramFiles(dexed)
+ .addMainDexRules("-keep class " + typeName(TestClass.class) + "{ *; }")
+ .setMainDexListOutputPath(mainDexFile)
+ .run();
+
+ D8TestCompileResult compileResult =
+ testForD8()
+ .addProgramFiles(dexed)
+ .addMainDexListFiles(mainDexFile)
+ .setMinApi(parameters.getApiLevel())
+ .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages);
+ checkCompilationResult(compileResult);
+ }
+
/**
* This test checks for maintained support of including synthetics from main-dex-list entries in
* the main-dex file. This test simulates that the tracing done at the class-file level has
* determined that TestClass and A are both traced. Thus the synthetic lambda from A will be
* included in the main-dex file.
*
- * <p>TODO(b/181858113): Remove once deprecated main-dex-list is removed.
+ * <p>TODO(b/181858113): Update to assert an error is raised once deprecated period is over.
*/
@Test
public void testDeprecatedSyntheticsFromMainDexListD8() throws Exception {
assumeTrue(parameters.isDexRuntime());
+ Path mainDexFile = temp.newFile("maindex.list").toPath();
+ FileUtils.writeTextFile(mainDexFile, binaryName(A.class) + ".class");
D8TestCompileResult compileResult =
testForD8()
.addInnerClasses(MainDexWithSynthesizedClassesTest.class)
- .addMainDexListClasses(TestClass.class, A.class)
+ .addMainDexListClasses(TestClass.class)
+ .addMainDexListFiles(mainDexFile)
.setMinApi(parameters.getApiLevel())
- .compile();
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ // The "classes" addition has no origin.
+ allOf(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+ diagnosticOrigin(Origin.unknown())),
+ // The "file" addition must have the file origin.
+ allOf(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+ diagnosticOrigin(new PathOrigin(mainDexFile)))));
checkCompilationResult(compileResult);
}
@@ -112,15 +165,31 @@
@Test
public void testDeprecatedSyntheticsFromMainDexListR8() throws Exception {
assumeTrue(parameters.isDexRuntime());
+ Path mainDexFile = temp.newFile("maindex.list").toPath();
+ FileUtils.writeTextFile(mainDexFile, binaryName(A.class) + ".class");
R8TestCompileResult compileResult =
testForR8(parameters.getBackend())
.addInnerClasses(MainDexWithSynthesizedClassesTest.class)
.setMinApi(parameters.getApiLevel())
.addOptionsModification(o -> o.minimalMainDex = true)
- .addMainDexListClasses(TestClass.class, A.class)
+ .addMainDexListClasses(TestClass.class)
+ .addMainDexListFiles(mainDexFile)
.noMinification()
.noTreeShaking()
- .compile();
+ .allowDiagnosticWarningMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ // The "classes" addition has no origin.
+ allOf(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+ diagnosticOrigin(Origin.unknown())),
+ // The "file" addition must have the file origin.
+ allOf(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+ diagnosticOrigin(new PathOrigin(mainDexFile)))));
checkCompilationResult(compileResult, compileResult.app);
}
@@ -128,7 +197,7 @@
checkCompilationResult(compileResult, compileResult.app);
}
- private void checkCompilationResult(TestCompileResult compileResult, AndroidApp app)
+ private void checkCompilationResult(TestCompileResult<?, ?> compileResult, AndroidApp app)
throws Exception {
if (parameters.getRuntime().asDex().getMinApiLevel().getLevel()
< nativeMultiDexLevel.getLevel()) {
diff --git a/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java b/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
index 22bad85..19e75b3 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
@@ -56,7 +56,7 @@
.addProgramClasses(testClasses)
.addKeepMainRule(mainClass)
// Include main dex rule for class Static.
- .addMainDexClassRules(Main.class, Static.class)
+ .addMainDexKeepClassRules(Main.class, Static.class)
.enableForceInliningAnnotations()
.setMinApi(parameters.getApiLevel())
.compile()
@@ -93,7 +93,7 @@
// Include explicit main dex entry for class Static.
.addMainDexListClasses(Main.class, Static.class)
// Include main dex rule for class Static2.
- .addMainDexClassRules(Static2.class)
+ .addMainDexKeepClassRules(Static2.class)
.addDontWarn(Static.class)
.allowDiagnosticWarningMessages()
.enableForceInliningAnnotations()
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java
index e374f2a..624bdfe 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java
@@ -46,7 +46,7 @@
testForR8(parameters.getBackend())
.addInnerClasses(getClass())
.addKeepMainRule(TestClass.class)
- .addMainDexClassRules(TestClass.class)
+ .addMainDexKeepClassRules(TestClass.class)
.apply(this::configureRepackaging)
.setMinApi(parameters.getApiLevel())
.compile()
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java
index 4fc28f5..81183f5 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.repackage;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.shaking.ProguardConfigurationParser.FLATTEN_PACKAGE_HIERARCHY;
import static com.android.tools.r8.shaking.ProguardConfigurationParser.REPACKAGE_CLASSES;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -13,6 +14,7 @@
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8TestCompileResult;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
@@ -22,6 +24,7 @@
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
+// TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
@RunWith(Parameterized.class)
public class RepackageWithMainDexListTest extends RepackageTestBase {
@@ -54,7 +57,13 @@
// Debug mode to enable minimal main dex.
.debug()
.setMinApi(parameters.getApiLevel())
- .compile()
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics ->
+ diagnostics
+ .assertOnlyWarnings()
+ .assertWarningsMatch(
+ diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)))
.apply(this::checkCompileResult)
.run(parameters.getRuntime(), TestClass.class)
.assertSuccessWithOutputLines("Hello world!");