Add usage of main-dex rules to D8 API test.
Bug: 176880642
Change-Id: Ibd6c56da0ca933b4b65309fd58768f9a3ce52bc6
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
index 642a4ab..27dbc0f 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
@@ -71,6 +71,7 @@
List<Path> libraries = new ArrayList<>(1);
List<Path> classpath = new ArrayList<>(args.length);
List<Path> mainDexList = new ArrayList<>(1);
+ List<Path> mainDexRules = new ArrayList<>(1);
List<Path> inputs = new ArrayList<>(args.length);
for (int i = 0; i < args.length; i++) {
if (args[i].equals("--lib")) {
@@ -79,6 +80,8 @@
classpath.add(Paths.get(args[++i]));
} else if (args[i].equals("--main-dex-list")) {
mainDexList.add(Paths.get(args[++i]));
+ } else if (args[i].equals("--main-dex-rules")) {
+ mainDexRules.add(Paths.get(args[++i]));
} else if (isArchive(args[i]) || isClassFile(args[i])) {
inputs.add(Paths.get(args[i]));
}
@@ -98,6 +101,9 @@
if (mainDexList.isEmpty()) {
throw new RuntimeException("Must supply main-dex-list inputs");
}
+ if (mainDexRules.isEmpty()) {
+ throw new RuntimeException("Must supply main-dex-rules inputs");
+ }
useProgramFileList(CompilationMode.DEBUG, minApiLevel, libraries, classpath, inputs);
useProgramFileList(CompilationMode.RELEASE, minApiLevel, libraries, classpath, inputs);
@@ -106,6 +112,8 @@
useLibraryAndClasspathProvider(minApiLevel, libraries, classpath, inputs);
useMainDexListFiles(minApiLevel, libraries, classpath, inputs, mainDexList);
useMainDexClasses(minApiLevel, libraries, classpath, inputs, mainDexList);
+ useMainDexRulesFiles(minApiLevel, libraries, classpath, inputs, mainDexRules);
+ useMainDexRules(minApiLevel, libraries, classpath, inputs, mainDexRules);
useAssertionConfig(minApiLevel, libraries, classpath, inputs);
useVArgVariants(minApiLevel, libraries, classpath, inputs, mainDexList);
incrementalCompileAndMerge(minApiLevel, libraries, classpath, inputs);
@@ -283,6 +291,53 @@
}
}
+ private static void useMainDexRulesFiles(
+ int minApiLevel,
+ Collection<Path> libraries,
+ Collection<Path> classpath,
+ Collection<Path> inputs,
+ Collection<Path> mainDexRules) {
+ try {
+ D8.run(
+ D8Command.builder(handler)
+ .setMinApiLevel(minApiLevel)
+ .setProgramConsumer(new EnsureOutputConsumer())
+ .addLibraryFiles(libraries)
+ .addClasspathFiles(classpath)
+ .addProgramFiles(inputs)
+ .addMainDexRulesFiles(mainDexRules)
+ .build());
+ } catch (CompilationFailedException e) {
+ throw new RuntimeException("Unexpected compilation exceptions", e);
+ }
+ }
+
+ private static void useMainDexRules(
+ int minApiLevel,
+ Collection<Path> libraries,
+ Collection<Path> classpath,
+ Collection<Path> inputs,
+ Collection<Path> mainDexRulesFiles) {
+ try {
+ D8Command.Builder builder =
+ D8Command.builder(handler)
+ .setMinApiLevel(minApiLevel)
+ .setProgramConsumer(new EnsureOutputConsumer())
+ .addLibraryFiles(libraries)
+ .addClasspathFiles(classpath)
+ .addProgramFiles(inputs);
+ for (Path mainDexRulesFile : mainDexRulesFiles) {
+ builder.addMainDexRules(
+ Files.readAllLines(mainDexRulesFile), new PathOrigin(mainDexRulesFile));
+ }
+ D8.run(builder.build());
+ } catch (CompilationFailedException e) {
+ throw new RuntimeException("Unexpected compilation exceptions", e);
+ } catch (IOException e) {
+ throw new RuntimeException("Unexpected IO exception", e);
+ }
+ }
+
private static void useAssertionConfig(
int minApiLevel,
Collection<Path> libraries,
diff --git a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
index 2c53667..8e33480 100644
--- a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
+++ b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
@@ -58,6 +58,9 @@
Path mainDexList = temp.getRoot().toPath().resolve("maindexlist.txt");
FileUtils.writeTextFile(mainDexList, "desugaringwithmissingclasstest1/Main.class");
+ Path mainDexRules = temp.getRoot().toPath().resolve("maindex.rules");
+ FileUtils.writeTextFile(mainDexRules, "# empty file");
+
// It is important to place the api usage sample jar after the current classpath because we want
// to find D8/R8 classes before the ones in the jar, otherwise renamed classes and fields cannot
// be found.
@@ -67,7 +70,8 @@
.addAll(
ImmutableList.of(
ToolHelper.getJavaExecutable(),
- "-cp", classPath,
+ "-cp",
+ classPath,
main,
// Compiler arguments.
"--output",
@@ -76,9 +80,11 @@
Integer.toString(minApiLevel),
"--main-dex-list",
mainDexList.toString(),
+ "--main-dex-rules",
+ mainDexRules.toString(),
"--lib",
- ToolHelper.getAndroidJar(
- AndroidApiLevel.getAndroidApiLevel(minApiLevel)).toString(),
+ ToolHelper.getAndroidJar(AndroidApiLevel.getAndroidApiLevel(minApiLevel))
+ .toString(),
"--classpath",
lib1.toString(),
"--classpath",
diff --git a/tests/r8_api_usage_sample.jar b/tests/r8_api_usage_sample.jar
index c50e110..65070f5 100644
--- a/tests/r8_api_usage_sample.jar
+++ b/tests/r8_api_usage_sample.jar
Binary files differ