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;