Update compat proguard to ignore missing classes when not shrinking

It seems that Proguard does not warn about missing classes when -dontshrink
is set. This change tries to mimic that behaviour for compat proguard.

Also add the explicit --ignore-missing-classes flag to compat proguard.

Bug: 68249935
Change-Id: I1134d368803b394cb7312e060afaf56cbd988ba8
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index d24eb43..fef695e 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -35,6 +35,7 @@
     private Optional<Boolean> treeShaking = Optional.empty();
     private Optional<Boolean> discardedChecker = Optional.empty();
     private Optional<Boolean> minification = Optional.empty();
+    private boolean ignoreMissingClassesWhenNotShrinking = false;
     private boolean ignoreMissingClasses = false;
     private boolean forceProguardCompatibility = false;
     private Path proguardMapOutput = null;
@@ -43,9 +44,12 @@
       super(CompilationMode.RELEASE);
     }
 
-    protected Builder(boolean ignoreDexInArchive, boolean forceProguardCompatibility) {
+    protected Builder(boolean ignoreDexInArchive, boolean forceProguardCompatibility,
+        boolean ignoreMissingClassesWhenNotShrinking, boolean ignoreMissingClasses) {
       super(CompilationMode.RELEASE, ignoreDexInArchive);
       this.forceProguardCompatibility = forceProguardCompatibility;
+      this.ignoreMissingClassesWhenNotShrinking = ignoreMissingClassesWhenNotShrinking;
+      this.ignoreMissingClasses = ignoreMissingClasses;
     }
 
     private Builder(AndroidApp app) {
@@ -256,6 +260,7 @@
           useMinification,
           ignoreMissingClasses,
           forceProguardCompatibility,
+          ignoreMissingClassesWhenNotShrinking,
           proguardMapOutput);
     }
   }
@@ -297,6 +302,7 @@
   private final boolean useMinification;
   private final boolean ignoreMissingClasses;
   private final boolean forceProguardCompatibility;
+  private final boolean ignoreMissingClassesWhenNotShrinking;
   private final Path proguardMapOutput;
 
   public static Builder builder() {
@@ -415,6 +421,7 @@
       boolean useMinification,
       boolean ignoreMissingClasses,
       boolean forceProguardCompatibility,
+      boolean ignoreMissingClassesWhenNotShrinking,
       Path proguardMapOutput) {
     super(inputApp, outputPath, outputMode, mode, minApiLevel, diagnosticsHandler,
         enableDesugaring);
@@ -429,6 +436,7 @@
     this.useMinification = useMinification;
     this.ignoreMissingClasses = ignoreMissingClasses;
     this.forceProguardCompatibility = forceProguardCompatibility;
+    this.ignoreMissingClassesWhenNotShrinking = ignoreMissingClassesWhenNotShrinking;
     this.proguardMapOutput = proguardMapOutput;
   }
 
@@ -442,6 +450,7 @@
     useMinification = false;
     ignoreMissingClasses = false;
     forceProguardCompatibility = false;
+    ignoreMissingClassesWhenNotShrinking = false;
     proguardMapOutput = null;
   }
   public boolean useTreeShaking() {
@@ -479,6 +488,9 @@
     assert !internal.ignoreMissingClasses;
     internal.ignoreMissingClasses = ignoreMissingClasses;
     internal.ignoreMissingClasses |= proguardConfiguration.isIgnoreWarnings();
+    internal.ignoreMissingClasses |=
+        ignoreMissingClassesWhenNotShrinking && !proguardConfiguration.isShrinking();
+
     assert !internal.verbose;
     internal.mainDexKeepRules = mainDexKeepRules;
     internal.minimalMainDex = internal.debug;
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index 4c49a6a..a6b45ae 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -33,14 +33,16 @@
     public final String output;
     public final int minApi;
     public final boolean forceProguardCompatibility;
+    public final boolean ignoreMissingClasses;
     public final boolean multiDex;
     public final List<String> proguardConfig;
 
     CompatProguardOptions(List<String> proguardConfig, String output, int minApi,
-        boolean multiDex, boolean forceProguardCompatibility) {
+        boolean multiDex, boolean forceProguardCompatibility, boolean ignoreMissingClasses) {
       this.output = output;
       this.minApi = minApi;
       this.forceProguardCompatibility = forceProguardCompatibility;
+      this.ignoreMissingClasses = ignoreMissingClasses;
       this.multiDex = multiDex;
       this.proguardConfig = proguardConfig;
     }
@@ -49,6 +51,7 @@
       String output = null;
       int minApi = 1;
       boolean forceProguardCompatibility = false;
+      boolean ignoreMissingClasses = false;
       boolean multiDex = false;
       boolean coreLibrary = false;
 
@@ -62,6 +65,8 @@
               minApi = Integer.valueOf(args[++i]);
             } else if (arg.equals("--force-proguard-compatibility")) {
               forceProguardCompatibility = true;
+            } else if (arg.equals("--ignore-missing-classes")) {
+              ignoreMissingClasses = true;
             } else if (arg.equals("--output")) {
               output = args[++i];
             } else if (arg.equals("--multi-dex")) {
@@ -82,7 +87,7 @@
         builder.add(currentLine.toString());
       }
       return new CompatProguardOptions(builder.build(), output, minApi, multiDex,
-          forceProguardCompatibility);
+          forceProguardCompatibility, ignoreMissingClasses);
     }
   }
 
@@ -95,7 +100,8 @@
     // Run R8 passing all the options from the command line as a Proguard configuration.
     CompatProguardOptions options = CompatProguardOptions.parse(args);
     R8Command.Builder builder =
-        new CompatProguardCommandBuilder(options.forceProguardCompatibility);
+        new CompatProguardCommandBuilder(
+            options.forceProguardCompatibility, options.ignoreMissingClasses);
     builder.setOutputPath(Paths.get(options.output))
         .addProguardConfiguration(options.proguardConfig)
         .setMinApiLevel(options.minApi);
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
index 71bc6eb..18ec474 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
@@ -7,8 +7,9 @@
 import com.android.tools.r8.R8Command;
 
 public class CompatProguardCommandBuilder extends R8Command.Builder {
-  public CompatProguardCommandBuilder(boolean forceProguardCompatibility) {
-    super(true, forceProguardCompatibility);
+  public CompatProguardCommandBuilder(boolean forceProguardCompatibility,
+      boolean ignoreMissingClasses) {
+    super(true, forceProguardCompatibility, true, ignoreMissingClasses);
     setEnableDesugaring(false);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 1519f6c..298876f 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -55,7 +55,7 @@
 
   private void runAnnotationsTest(boolean forceProguardCompatibility, boolean keepAnnotations) throws Exception {
     R8Command.Builder builder =
-        new CompatProguardCommandBuilder(forceProguardCompatibility);
+        new CompatProguardCommandBuilder(forceProguardCompatibility, false);
     // Add application classes including the annotation class.
     Class mainClass = TestMain.class;
     Class mentionedClassWithAnnotations = TestMain.MentionedClassWithAnnotation.class;