Allow main-dex tracing through reflection on DEX inputs.
Change-Id: Ibd618dec98801df1aa5adcff8b74f96e131e0a41
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index f6a10a9..07569a7 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -223,7 +223,7 @@
@Override
InternalOptions getInternalOptions() {
InternalOptions internal = new InternalOptions(factory, reporter);
- internal.programConsumer = ClassFileConsumer.emptyConsumer();
+ internal.programConsumer = DexIndexedConsumer.emptyConsumer();
internal.mainDexKeepRules = mainDexKeepRules;
internal.mainDexListConsumer = mainDexListConsumer;
internal.mainDexKeptGraphConsumer = mainDexKeptGraphConsumer;
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index 85705d2..86776a3 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -154,7 +154,7 @@
features);
switch (allowedDiagnosticMessages) {
case ALL:
- compileResult.assertDiagnosticThatMatches(new IsAnything<>());
+ compileResult.getDiagnosticMessages().assertAllDiagnosticsMatch(new IsAnything<>());
break;
case ERROR:
compileResult.assertOnlyErrors();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
index c43b8ae..6ef399e 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.maindexlist;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
import static com.android.tools.r8.utils.FileUtils.ZIP_EXTENSION;
import static com.android.tools.r8.utils.FileUtils.withNativeFileSeparators;
@@ -21,7 +22,6 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestCompilerBuilder;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ThrowableConsumer;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ir.desugar.LambdaRewriter;
@@ -60,13 +60,29 @@
private static final String EXAMPLE_SRC_DIR = ToolHelper.EXAMPLES_DIR;
private static final String EXAMPLE_O_SRC_DIR = ToolHelper.EXAMPLES_ANDROID_O_DIR;
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withNoneRuntime().build();
+ @Parameters(name = "{0}, {1}")
+ public static List<Object[]> data() {
+ return buildParameters(getTestParameters().withNoneRuntime().build(), Backend.values());
}
- public MainDexTracingTest(TestParameters parameters) {
+ private final Backend backend;
+
+ public MainDexTracingTest(TestParameters parameters, Backend backend) {
parameters.assertNoneRuntime();
+ this.backend = backend;
+ }
+
+ private Path getInputJar(Path cfJar) throws Exception {
+ if (backend == Backend.CF) {
+ return cfJar;
+ }
+ return testForD8()
+ .setIntermediate(true)
+ .addProgramFiles(cfJar)
+ .setMinApi(AndroidApiLevel.K)
+ .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.K))
+ .compile()
+ .writeToZip();
}
@Test
@@ -309,7 +325,7 @@
throws Throwable {
Path out = temp.getRoot().toPath().resolve(testName + ZIP_EXTENSION);
- Path inputJar = Paths.get(buildDir, packageName + JAR_EXTENSION);
+ Path inputJar = getInputJar(Paths.get(buildDir, packageName + JAR_EXTENSION));
// Build main-dex list using GenerateMainDexList and test the output from run.
GenerateMainDexListCommand.Builder mdlCommandBuilder = GenerateMainDexListCommand.builder();
GenerateMainDexListCommand mdlCommand = mdlCommandBuilder
@@ -350,14 +366,22 @@
.addKeepRules("-keepattributes *Annotation*")
.addMainDexRuleFiles(mainDexRules)
.apply(configuration)
- .allowDiagnosticWarningMessages()
.assumeAllMethodsMayHaveSideEffects()
.setMinApi(minSdk)
.noMinification()
.noTreeShaking()
.setMainDexListConsumer(ToolHelper.consumeString(r8MainDexListOutput::set))
- .compile()
- .assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists."))
+ .allowDiagnosticMessages()
+ .compileWithExpectedDiagnostics(
+ diagnostics -> {
+ diagnostics.assertNoInfos().assertNoErrors();
+ if (backend == Backend.CF) {
+ diagnostics.assertWarningsMatch(
+ diagnosticMessage(equalTo("Resource 'META-INF/MANIFEST.MF' already exists.")));
+ } else {
+ diagnostics.assertNoWarnings();
+ }
+ })
.writeToZip(out);
List<String> r8MainDexList =
@@ -386,9 +410,16 @@
if (mainDexGeneratorMainDexList.size() <= i - nonLambdaOffset) {
fail("Main dex list generator is missing '" + reference + "'");
}
- checkSameMainDexEntry(reference, mainDexGeneratorMainDexList.get(i - nonLambdaOffset));
- checkSameMainDexEntry(
- reference, mainDexGeneratorMainDexListFromConsumer.get(i - nonLambdaOffset));
+ String fromList = mainDexGeneratorMainDexList.get(i - nonLambdaOffset);
+ String fromConsumer = mainDexGeneratorMainDexListFromConsumer.get(i - nonLambdaOffset);
+ if (isLambda(fromList)) {
+ assertEquals(Backend.DEX, backend);
+ assertEquals(fromList, fromConsumer);
+ nonLambdaOffset--;
+ } else {
+ checkSameMainDexEntry(reference, fromList);
+ checkSameMainDexEntry(reference, fromConsumer);
+ }
} else {
nonLambdaOffset++;
}