From 98428700225db72588375358dd3c747f0bef650a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Gjesse?= Date: Thu, 26 Oct 2017 12:27:38 +0200 Subject: 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 --- src/main/java/com/android/tools/r8/R8Command.java | 14 +++++++++++++- .../android/tools/r8/compatproguard/CompatProguard.java | 12 +++++++++--- .../r8/compatproguard/CompatProguardCommandBuilder.java | 5 +++-- .../ForceProguardCompatibilityTest.java | 2 +- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java index d24eb43c9..fef695eb8 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 @@ public class R8Command extends BaseCompilerCommand { private Optional treeShaking = Optional.empty(); private Optional discardedChecker = Optional.empty(); private Optional minification = Optional.empty(); + private boolean ignoreMissingClassesWhenNotShrinking = false; private boolean ignoreMissingClasses = false; private boolean forceProguardCompatibility = false; private Path proguardMapOutput = null; @@ -43,9 +44,12 @@ public class R8Command extends BaseCompilerCommand { 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 @@ public class R8Command extends BaseCompilerCommand { useMinification, ignoreMissingClasses, forceProguardCompatibility, + ignoreMissingClassesWhenNotShrinking, proguardMapOutput); } } @@ -297,6 +302,7 @@ public class R8Command extends BaseCompilerCommand { 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 @@ public class R8Command extends BaseCompilerCommand { boolean useMinification, boolean ignoreMissingClasses, boolean forceProguardCompatibility, + boolean ignoreMissingClassesWhenNotShrinking, Path proguardMapOutput) { super(inputApp, outputPath, outputMode, mode, minApiLevel, diagnosticsHandler, enableDesugaring); @@ -429,6 +436,7 @@ public class R8Command extends BaseCompilerCommand { this.useMinification = useMinification; this.ignoreMissingClasses = ignoreMissingClasses; this.forceProguardCompatibility = forceProguardCompatibility; + this.ignoreMissingClassesWhenNotShrinking = ignoreMissingClassesWhenNotShrinking; this.proguardMapOutput = proguardMapOutput; } @@ -442,6 +450,7 @@ public class R8Command extends BaseCompilerCommand { useMinification = false; ignoreMissingClasses = false; forceProguardCompatibility = false; + ignoreMissingClassesWhenNotShrinking = false; proguardMapOutput = null; } public boolean useTreeShaking() { @@ -479,6 +488,9 @@ public class R8Command extends BaseCompilerCommand { 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 4c49a6a1b..a6b45ae17 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 class CompatProguard { public final String output; public final int minApi; public final boolean forceProguardCompatibility; + public final boolean ignoreMissingClasses; public final boolean multiDex; public final List proguardConfig; CompatProguardOptions(List 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 @@ public class CompatProguard { String output = null; int minApi = 1; boolean forceProguardCompatibility = false; + boolean ignoreMissingClasses = false; boolean multiDex = false; boolean coreLibrary = false; @@ -62,6 +65,8 @@ public class CompatProguard { 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 @@ public class CompatProguard { builder.add(currentLine.toString()); } return new CompatProguardOptions(builder.build(), output, minApi, multiDex, - forceProguardCompatibility); + forceProguardCompatibility, ignoreMissingClasses); } } @@ -95,7 +100,8 @@ public class CompatProguard { // 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 71bc6eb0d..18ec474ac 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 @@ package com.android.tools.r8.compatproguard; 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 1519f6c8a..298876ff3 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 @@ public class ForceProguardCompatibilityTest extends TestBase { 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; -- cgit v1.2.3