diff options
author | Morten Krogh-Jespersen <mkroghj@google.com> | 2021-03-18 19:58:05 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-03-18 19:58:05 +0000 |
commit | 3487c654b66ea50b3cdef72ec41d88d42c52a73a (patch) | |
tree | 933ea1ab4fe0166b579bb8060e132204036cc409 | |
parent | 364b2c05baff2fe816dd90d52886581622413713 (diff) | |
parent | 946bea941c88af171167b184a4bbaa619fc229e5 (diff) | |
download | r8-3487c654b66ea50b3cdef72ec41d88d42c52a73a.tar.gz |
Add --pg-map-output and proguardMapConsumer to L8 command am: 946bea941c
Original change: undetermined
Change-Id: Ie8ca3dd57642bda547e950db8e0cb7c2130be63d
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.*"; |