ProguardConfiguration: set Proguard-related default options automatically
Certain options (minification/shrinking/keeprules/attrs) have different
defaults with and without a Proguard config file.
Originally it has been decided automatically, based on the presence of
Proguard options.
This has been changed to an explicit decision in 5e8f1ba because of complications
from handling a ProguardConsumer. It has been suggested to restore the automatic
choice but the first attempt 30ebba3 broke some tests.
This CL restores the original, automatic choice.
Change-Id: Ic6d07e45cebc48ee58fd8a3a3754a4c1ec73011b
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index ad23c03..e93f147 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -218,7 +218,7 @@
ProguardConfiguration.Builder configurationBuilder;
if (proguardConfigs.isEmpty()) {
- configurationBuilder = ProguardConfiguration.builderInitializedWithDefaults(factory);
+ configurationBuilder = ProguardConfiguration.builder(factory);
} else {
ProguardConfigurationParser parser =
new ProguardConfigurationParser(factory, getDiagnosticsHandler());
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
index bdf7748..f8aa3e2 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -18,13 +18,13 @@
private final List<FilteredClassPath> injars = new ArrayList<>();
private final List<FilteredClassPath> libraryjars = new ArrayList<>();
- private PackageObfuscationMode packageObfuscationMode;
- private String packagePrefix;
+ private PackageObfuscationMode packageObfuscationMode = PackageObfuscationMode.NONE;
+ private String packagePrefix = "";
private boolean allowAccessModification;
private boolean ignoreWarnings;
- private boolean optimizing;
- private boolean obfuscating;
- private boolean shrinking;
+ private boolean optimizing = true;
+ private boolean obfuscating = true;
+ private boolean shrinking = true;
private boolean printUsage;
private Path printUsageFile;
private boolean printMapping;
@@ -49,37 +49,6 @@
private Builder(DexItemFactory dexItemFactory) {
this.dexItemFactory = dexItemFactory;
- resetProguardDefaults();
- }
-
- public void resetProguardDefaults() {
- injars.clear();
- libraryjars.clear();
- packageObfuscationMode = PackageObfuscationMode.NONE;
- packagePrefix = "";
- allowAccessModification = false;
- ignoreWarnings = false;
- optimizing = true;
- obfuscating = true;
- shrinking = true;
- printUsage = false;
- printUsageFile = null;
- printMapping = false;
- printMappingFile = null;
- applyMappingFile = null;
- verbose = false;
- renameSourceFileAttribute = null;
- keepAttributePatterns.clear();
- dontWarnPatterns = ProguardClassFilter.builder();
- rules.clear();
- printSeeds = false;
- seedFile = null;
- obfuscationDictionary = null;
- classObfuscationDictionary = null;
- packageObfuscationDictionary = null;
- useUniqueClassMemberNames = false;
- keepParameterNames = false;
- adaptClassStrings = ProguardClassFilter.builder();
}
public void addInjars(List<FilteredClassPath> injars) {
@@ -217,11 +186,16 @@
}
public ProguardConfiguration build() throws CompilationException {
- ProguardKeepAttributes keepAttributes;
+ boolean rulesWasEmpty = rules.isEmpty();
+ if (rulesWasEmpty) {
+ setObfuscating(false);
+ setShrinking(false);
+ addRule(ProguardKeepRule.defaultKeepAllRule());
+ }
- if (forceProguardCompatibility
- && !isObfuscating()
- && keepAttributePatterns.size() == 0) {
+ ProguardKeepAttributes keepAttributes;
+ if (keepAttributePatterns.isEmpty()
+ && (rulesWasEmpty || (forceProguardCompatibility && !isObfuscating()))) {
keepAttributes = ProguardKeepAttributes.fromPatterns(ProguardKeepAttributes.KEEP_ALL);
} else {
keepAttributes = ProguardKeepAttributes.fromPatterns(keepAttributePatterns);
@@ -358,15 +332,6 @@
return new Builder(dexItemFactory);
}
- public static Builder builderInitializedWithDefaults(DexItemFactory dexItemFactory) {
- Builder builder = new Builder(dexItemFactory);
- builder.setObfuscating(false);
- builder.setShrinking(false);
- builder.addKeepAttributePatterns(ProguardKeepAttributes.KEEP_ALL);
- builder.addRule(ProguardKeepRule.defaultKeepAllRule());
- return builder;
- }
-
public DexItemFactory getDexItemFactory() {
return dexItemFactory;
}
@@ -481,7 +446,7 @@
public static ProguardConfiguration defaultConfiguration(DexItemFactory dexItemFactory) {
try {
- return builderInitializedWithDefaults(dexItemFactory).build();
+ return builder(dexItemFactory).build();
} catch (CompilationException e) {
// Building a builder initialized with defaults will not throw CompilationException because
// DictionaryReader is called with empty lists.
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index c4af25c..6306f91 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -91,11 +91,9 @@
checkAnnotationContent(INPUT_PATH, result);
}
- /**
- * Check that when dontshrink and dontobfuscate is used the annotation is transmitted.
- */
+ /** Check that when dontshrink and dontobfuscate is used the annotation is transmitted. */
@Test
- public void testSourceDebugExtensionWithShriking1()
+ public void testSourceDebugExtensionWithShrinking1()
throws IOException, CompilationException, ExecutionException {
Path outputPath = tmpOutputDir.newFolder().toPath();
AndroidApp result = compileWithR8(INPUT_PATH, outputPath, DONT_SHRINK_DONT_OBFUSCATE_CONFIG);
@@ -125,7 +123,7 @@
}
/**
- * Check that the annotation is removed when shriking is enabled and that there is not
+ * Check that the annotation is removed when shrinking is enabled and that there is not
* keepattributes option.
*/
@Test
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
index 46991d6..046a14b 100644
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
@@ -31,8 +31,6 @@
compileToDexViaR8(
null,
pg -> {
- pg.resetProguardDefaults();
- pg.addRule(ProguardKeepRule.defaultKeepAllRule());
pg.setRenameSourceFileAttribute(TEST_FILE);
pg.addKeepAttributePatterns(ImmutableList.of("SourceFile", "LineNumberTable"));
},
diff --git a/src/test/java/com/android/tools/r8/utils/R8CommandTest.java b/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
index 2054b22..6dda185 100644
--- a/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
@@ -229,7 +229,7 @@
R8Command command = parse("@" + argsFile.toString());
assertEquals(CompilationMode.DEBUG, command.getMode());
assertFalse(command.useMinification());
- assertTrue(command.useTreeShaking());
+ assertFalse(command.useTreeShaking()); // We have no keep rules (proguard config file is empty).
assertEquals(1, ToolHelper.getApp(command).getDexProgramResources().size());
}