L8+R8 API support

Bug:134732760
Change-Id: Iecd3d781d30fd93469f30a13773afd11fc6779ae
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index b760470..fecebda 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
 import java.util.ArrayList;
@@ -152,6 +153,8 @@
   @Keep
   public static class Builder extends BaseCompilerCommand.Builder<L8Command, Builder> {
 
+    private final List<Pair<List<String>, Origin>> proguardConfigs = new ArrayList<>();
+
     private Builder() {
       this(new DefaultL8DiagnosticsHandler());
     }
@@ -161,8 +164,8 @@
     }
 
     public boolean isShrinking() {
-      // TODO(b/134732760): Answers true if keep rules, even empty, are provided.
-      return false;
+      // Answers true if keep rules, even empty, are provided.
+      return !proguardConfigs.isEmpty();
     }
 
     @Override
@@ -175,6 +178,12 @@
       return CompilationMode.DEBUG;
     }
 
+    /** Add proguard configuration. */
+    public Builder addProguardConfiguration(List<String> lines, Origin origin) {
+      proguardConfigs.add(new Pair<>(lines, origin));
+      return this;
+    }
+
     @Override
     void validate() {
       Reporter reporter = getReporter();
@@ -214,17 +223,23 @@
       DesugaredLibrary desugaredLibrary = new DesugaredLibrary();
 
       if (isShrinking()) {
-        // TODO(b/134732760): Support R8 is incomplete.
         R8Command.Builder r8Builder =
             R8Command.builder()
                 .addProgramResourceProvider(desugaredLibrary)
                 .setMinApiLevel(getMinApiLevel())
+                // We disable minification in Core libraries since it breaks class initialization
+                // of the core library at runtime.
+                // TODO(b/134732760) Enable minification in Core libraries.
+                .setDisableMinification(true)
                 .setMode(getMode())
                 .setProgramConsumer(getProgramConsumer());
         for (ClassFileResourceProvider libraryResourceProvider :
             inputs.getLibraryResourceProviders()) {
           r8Builder.addLibraryResourceProvider(libraryResourceProvider);
         }
+        for (Pair<List<String>, Origin> proguardConfig : proguardConfigs) {
+          r8Builder.addProguardConfiguration(proguardConfig.getFirst(), proguardConfig.getSecond());
+        }
         r8Command = r8Builder.makeCommand();
       } else {
         D8Command.Builder d8Builder =
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/CoreLibDesugarTestBase.java b/src/test/java/com/android/tools/r8/desugar/corelib/CoreLibDesugarTestBase.java
index cd510a5..e7b3f92 100644
--- a/src/test/java/com/android/tools/r8/desugar/corelib/CoreLibDesugarTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/CoreLibDesugarTestBase.java
@@ -12,9 +12,11 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
+import java.util.Arrays;
 import java.util.List;
 
 public class CoreLibDesugarTestBase extends TestBase {
@@ -59,15 +61,19 @@
     // We wrap exceptions in a RuntimeException to call this from a lambda.
     try {
       Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
-      L8.run(
+      L8Command.Builder l8Builder =
           L8Command.builder()
               .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
               .addProgramFiles(ToolHelper.getDesugarJDKLibs())
               .addProgramFiles(additionalProgramFiles)
               .addSpecialLibraryConfiguration("default")
               .setMinApiLevel(apiLevel.getLevel())
-              .setOutput(desugaredLib, OutputMode.DexIndexed)
-              .build());
+              .setOutput(desugaredLib, OutputMode.DexIndexed);
+      if (shrink) {
+        l8Builder.addProguardConfiguration(
+            Arrays.asList(keepRules.split(System.lineSeparator())), Origin.unknown());
+      }
+      L8.run(l8Builder.build());
       return desugaredLib;
     } catch (Exception e) {
       throw new RuntimeException(e);