aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMorten Krogh-Jespersen <mkroghj@google.com>2021-03-18 19:58:05 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-03-18 19:58:05 +0000
commit3487c654b66ea50b3cdef72ec41d88d42c52a73a (patch)
tree933ea1ab4fe0166b579bb8060e132204036cc409
parent364b2c05baff2fe816dd90d52886581622413713 (diff)
parent946bea941c88af171167b184a4bbaa619fc229e5 (diff)
downloadr8-3487c654b66ea50b3cdef72ec41d88d42c52a73a.tar.gz
Add --pg-map-output and proguardMapConsumer to L8 command am: 946bea941c
Original change: undetermined Change-Id: Ie8ca3dd57642bda547e950db8e0cb7c2130be63d
-rw-r--r--src/main/java/com/android/tools/r8/BaseCompilerCommand.java28
-rw-r--r--src/main/java/com/android/tools/r8/L8Command.java35
-rw-r--r--src/main/java/com/android/tools/r8/L8CommandParser.java15
-rw-r--r--src/main/java/com/android/tools/r8/R8Command.java10
-rw-r--r--src/test/java/com/android/tools/r8/L8CommandTest.java51
5 files changed, 127 insertions, 12 deletions
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index f0cb3e81d..555713b1c 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -206,6 +206,7 @@ public abstract class BaseCompilerCommand extends BaseCommand {
private BiPredicate<String, Long> dexClassChecksumFilter = (name, checksum) -> true;
private List<AssertionsConfiguration> assertionsConfiguration = new ArrayList<>();
private List<Consumer<Inspector>> outputInspections = new ArrayList<>();
+ protected StringConsumer proguardMapConsumer = null;
abstract CompilationMode defaultCompilationMode();
@@ -278,6 +279,33 @@ public abstract class BaseCompilerCommand extends BaseCommand {
}
/**
+ * Set an output destination to which proguard-map content should be written.
+ *
+ * <p>This is a short-hand for setting a {@link StringConsumer.FileConsumer} using {@link
+ * #setProguardMapConsumer}. Note that any subsequent call to this method or {@link
+ * #setProguardMapConsumer} will override the previous setting.
+ *
+ * @param proguardMapOutput File-system path to write output at.
+ */
+ B setProguardMapOutputPath(Path proguardMapOutput) {
+ assert proguardMapOutput != null;
+ return setProguardMapConsumer(new StringConsumer.FileConsumer(proguardMapOutput));
+ }
+
+ /**
+ * Set a consumer for receiving the proguard-map content.
+ *
+ * <p>Note that any subsequent call to this method or {@link #setProguardMapOutputPath} will
+ * override the previous setting.
+ *
+ * @param proguardMapConsumer Consumer to receive the content once produced.
+ */
+ B setProguardMapConsumer(StringConsumer proguardMapConsumer) {
+ this.proguardMapConsumer = proguardMapConsumer;
+ return self();
+ }
+
+ /**
* Get the main dex list consumer that will receive the final complete main dex list.
*/
public StringConsumer getMainDexListConsumer() {
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 4c235d96d..1fc768905 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -253,6 +253,33 @@ public final class L8Command extends BaseCompilerCommand {
return self();
}
+ /**
+ * Set an output destination to which proguard-map content should be written.
+ *
+ * <p>This is a short-hand for setting a {@link StringConsumer.FileConsumer} using {@link
+ * #setProguardMapConsumer}. Note that any subsequent call to this method or {@link
+ * #setProguardMapConsumer} will override the previous setting.
+ *
+ * @param proguardMapOutput File-system path to write output at.
+ */
+ @Override
+ public L8Command.Builder setProguardMapOutputPath(Path proguardMapOutput) {
+ return super.setProguardMapOutputPath(proguardMapOutput);
+ }
+
+ /**
+ * Set a consumer for receiving the proguard-map content.
+ *
+ * <p>Note that any subsequent call to this method or {@link #setProguardMapOutputPath} will
+ * override the previous setting.
+ *
+ * @param proguardMapConsumer Consumer to receive the content once produced.
+ */
+ @Override
+ public L8Command.Builder setProguardMapConsumer(StringConsumer proguardMapConsumer) {
+ return super.setProguardMapConsumer(proguardMapConsumer);
+ }
+
@Override
void validate() {
if (isPrintHelp()) {
@@ -273,6 +300,9 @@ public final class L8Command extends BaseCompilerCommand {
if (isShrinking() && getProgramConsumer() instanceof ClassFileConsumer) {
reporter.error("L8 does not support shrinking when generating class files");
}
+ if (!isShrinking() && proguardMapConsumer != null) {
+ reporter.error("L8 does not support defining a map consumer when not shrinking");
+ }
super.validate();
}
@@ -294,7 +324,7 @@ public final class L8Command extends BaseCompilerCommand {
D8Command d8Command = null;
AndroidApp inputs = getAppBuilder().build();
- ProgramConsumer l8CfConsumer = null;
+ ProgramConsumer l8CfConsumer;
if (isShrinking()) {
l8CfConsumer = new InMemoryJarContent();
R8Command.Builder r8Builder =
@@ -314,6 +344,9 @@ public final class L8Command extends BaseCompilerCommand {
for (Pair<List<String>, Origin> proguardConfig : proguardConfigStrings) {
r8Builder.addProguardConfiguration(proguardConfig.getFirst(), proguardConfig.getSecond());
}
+ if (proguardMapConsumer != null) {
+ r8Builder.setProguardMapConsumer(proguardMapConsumer);
+ }
r8Builder.addProguardConfiguration(
libraryConfiguration.getExtraKeepRules(), Origin.unknown());
// TODO(b/180903899): Remove rule when -dontwarn sun.misc.Unsafe is part of config.
diff --git a/src/main/java/com/android/tools/r8/L8CommandParser.java b/src/main/java/com/android/tools/r8/L8CommandParser.java
index 3dac9dca1..402e59a3f 100644
--- a/src/main/java/com/android/tools/r8/L8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/L8CommandParser.java
@@ -18,8 +18,15 @@ import java.util.Set;
public class L8CommandParser extends BaseCompilerCommandParser<L8Command, L8Command.Builder> {
- private static final Set<String> OPTIONS_WITH_PARAMETER = ImmutableSet.of(
- "--output", "--lib", MIN_API_FLAG, "--desugared-lib", THREAD_COUNT_FLAG, "--pg-conf");
+ private static final Set<String> OPTIONS_WITH_PARAMETER =
+ ImmutableSet.of(
+ "--output",
+ "--lib",
+ MIN_API_FLAG,
+ "--desugared-lib",
+ THREAD_COUNT_FLAG,
+ "--pg-conf",
+ "--pg-map-output");
public static void main(String[] args) throws CompilationFailedException {
L8Command command = parse(args, Origin.root()).build();
@@ -50,6 +57,8 @@ public class L8CommandParser extends BaseCompilerCommandParser<L8Command, L8Comm
+ AndroidApiLevel.getDefault().getLevel()
+ ".",
" --pg-conf <file> # Proguard configuration <file>.",
+ " --pg-map-output <file> # Output the resulting name and line mapping to"
+ + " <file>.",
" --desugared-lib <file> # Specify desugared library configuration.",
" # <file> is a desugared library configuration"
+ " (json)."),
@@ -149,6 +158,8 @@ public class L8CommandParser extends BaseCompilerCommandParser<L8Command, L8Comm
addLibraryArgument(builder, origin, nextArg);
} else if (arg.equals("--pg-conf")) {
builder.addProguardConfigurationFiles(Paths.get(nextArg));
+ } else if (arg.equals("--pg-map-output")) {
+ builder.setProguardMapOutputPath(Paths.get(nextArg));
} else if (arg.equals("--desugared-lib")) {
builder.addDesugaredLibraryConfiguration(StringResource.fromFile(Paths.get(nextArg)));
} else if (arg.equals("--classfile")) {
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 9663d3f15..2b3f988f4 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -102,7 +102,6 @@ public final class R8Command extends BaseCompilerCommand {
private boolean disableVerticalClassMerging = false;
private boolean forceProguardCompatibility = false;
private Optional<Boolean> includeDataResources = Optional.empty();
- private StringConsumer proguardMapConsumer = null;
private StringConsumer proguardUsageConsumer = null;
private StringConsumer proguardSeedsConsumer = null;
private StringConsumer proguardConfigurationConsumer = null;
@@ -237,10 +236,9 @@ public final class R8Command extends BaseCompilerCommand {
*
* @param proguardMapOutput File-system path to write output at.
*/
+ @Override
public Builder setProguardMapOutputPath(Path proguardMapOutput) {
- assert proguardMapOutput != null;
- this.proguardMapConsumer = new StringConsumer.FileConsumer(proguardMapOutput);
- return self();
+ return super.setProguardMapOutputPath(proguardMapOutput);
}
/**
@@ -251,9 +249,9 @@ public final class R8Command extends BaseCompilerCommand {
*
* @param proguardMapConsumer Consumer to receive the content once produced.
*/
+ @Override
public Builder setProguardMapConsumer(StringConsumer proguardMapConsumer) {
- this.proguardMapConsumer = proguardMapConsumer;
- return self();
+ return super.setProguardMapConsumer(proguardMapConsumer);
}
/**
diff --git a/src/test/java/com/android/tools/r8/L8CommandTest.java b/src/test/java/com/android/tools/r8/L8CommandTest.java
index b7e215467..96338d34e 100644
--- a/src/test/java/com/android/tools/r8/L8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/L8CommandTest.java
@@ -15,19 +15,19 @@ import static org.junit.Assert.fail;
import com.android.tools.r8.AssertionsConfiguration.AssertionTransformation;
import com.android.tools.r8.AssertionsConfiguration.AssertionTransformationScope;
-import com.android.tools.r8.dex.Marker;
+import com.android.tools.r8.StringConsumer.FileConsumer;
import com.android.tools.r8.dex.Marker.Tool;
import com.android.tools.r8.origin.EmbeddedOrigin;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ThreadUtils;
import com.google.common.collect.ImmutableList;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
@@ -117,7 +117,6 @@ public class L8CommandTest extends CommandTestBase<L8Command> {
"--output",
output.toString());
L8.run(l8Command);
- Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
assertMarkersMatch(
ExtractMarker.extractMarkerFromDexFile(output),
ImmutableList.of(markerTool(Tool.L8), markerTool(Tool.D8)));
@@ -156,6 +155,29 @@ public class L8CommandTest extends CommandTestBase<L8Command> {
}
@Test
+ public void testFlagPgConfWithConsumer() throws Exception {
+ TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
+ Path pgconf = temp.newFolder().toPath().resolve("pg.conf");
+ Path pgMap = temp.newFolder().toPath().resolve("pg-map.txt");
+ FileUtils.writeTextFile(pgconf, "");
+ L8Command parsedCommand =
+ parse(
+ diagnostics,
+ "--desugared-lib",
+ ToolHelper.DESUGAR_LIB_JSON_FOR_TESTING.toString(),
+ "--pg-conf",
+ pgconf.toString(),
+ "--pg-map-output",
+ pgMap.toString());
+ assertNotNull(parsedCommand.getR8Command());
+ InternalOptions internalOptions = parsedCommand.getR8Command().getInternalOptions();
+ assertNotNull(internalOptions);
+ assertTrue(internalOptions.proguardMapConsumer instanceof StringConsumer.FileConsumer);
+ FileConsumer proguardMapConsumer = (FileConsumer) internalOptions.proguardMapConsumer;
+ assertEquals(pgMap, proguardMapConsumer.getOutputPath());
+ }
+
+ @Test
public void testFlagPgConfWithClassFile() throws Exception {
TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
try {
@@ -227,6 +249,29 @@ public class L8CommandTest extends CommandTestBase<L8Command> {
prepareBuilder(handler).setProgramConsumer(ClassFileConsumer.emptyConsumer()).build());
}
+ @Test(expected = CompilationFailedException.class)
+ public void proguardMapConsumerNotShrinking() throws Throwable {
+ DiagnosticsChecker.checkErrorsContains(
+ "L8 does not support defining a map consumer when not shrinking",
+ (handler) ->
+ prepareBuilder(handler)
+ .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
+ .setProguardMapConsumer(StringConsumer.emptyConsumer())
+ .build());
+ }
+
+ @Test(expected = CompilationFailedException.class)
+ public void proguardMapOutputNotShrinking() throws Throwable {
+ Path pgMapOut = temp.newFile("pg-out.txt").toPath();
+ DiagnosticsChecker.checkErrorsContains(
+ "L8 does not support defining a map consumer when not shrinking",
+ (handler) ->
+ prepareBuilder(handler)
+ .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
+ .setProguardMapOutputPath(pgMapOut)
+ .build());
+ }
+
private void addProguardConfigurationString(
DiagnosticsHandler diagnostics, ProgramConsumer programConsumer) throws Throwable {
String keepRule = "-keep class java.time.*";