Disable minification if -addconfigurationdebugging is set.
Otherwise, item-based string can be introduced if there are reflection
with potential identifiers. Not removing them results in compilation
failures. It is better not to add them in the beginning, and to that
end, disable minification if that option is turned on.
Bug: 133167042, 73707846
Change-Id: I9f0de589dc852cdc5cf925a6a6d26db5da114489
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index b48ea11..e3caf03 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -677,13 +677,7 @@
// Perform minification.
NamingLens namingLens;
- if (options.configurationDebugging) {
- if (options.getProguardConfiguration().hasApplyMappingFile() || options.isMinifying()) {
- options.reporter.info(new StringDiagnostic(
- "Build is not being obfuscated due to the use of -addconfigurationdebugging"));
- }
- namingLens = NamingLens.getIdentityLens();
- } else if (options.getProguardConfiguration().hasApplyMappingFile()) {
+ if (options.getProguardConfiguration().hasApplyMappingFile()) {
SeedMapper seedMapper =
SeedMapper.seedMapperFromFile(
options.reporter, options.getProguardConfiguration().getApplyMappingFile());
@@ -697,6 +691,7 @@
namingLens = new Minifier(appView.withLiveness(), desugaredCallSites).run(timing);
timing.end();
} else {
+ // Rewrite signature annotations for applications that are not minified.
if (appView.appInfo().hasLiveness()) {
// TODO(b/124726014): Rewrite signature annotations in lens rewriting instead of here?
new GenericSignatureRewriter(appView.withLiveness()).run(appView.appInfo().classes());
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 9d0adec..bfad990 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -167,6 +167,10 @@
this.applyMappingFile = file;
}
+ public boolean hasApplyMappingFile() {
+ return applyMappingFile != null;
+ }
+
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
@@ -276,6 +280,10 @@
this.configurationDebugging = configurationDebugging;
}
+ boolean isConfigurationDebugging() {
+ return configurationDebugging;
+ }
+
public void setDontUseMixedCaseClassnames(boolean dontUseMixedCaseClassnames) {
this.dontUseMixedCaseClassnames = dontUseMixedCaseClassnames;
}
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index ae25876..6401537 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -131,6 +131,20 @@
configurationBuilder.getKeepParameterNamesOptionOrigin(),
configurationBuilder.getKeepParameterNamesOptionPosition()));
}
+ if (configurationBuilder.isConfigurationDebugging()) {
+ String suffix = "due to the use of -addconfigurationdebugging";
+ if (configurationBuilder.isObfuscating()) {
+ reporter.info(
+ new StringDiagnostic("Build is not being obfuscated " + suffix));
+ configurationBuilder.disableObfuscation();
+ }
+ if (configurationBuilder.hasApplyMappingFile()) {
+ reporter.info(
+ new StringDiagnostic(
+ "Applying the obfuscation map (-applymapping) is disabled " + suffix));
+ configurationBuilder.setApplyMappingFile(null);
+ }
+ }
}
/**
diff --git a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java
new file mode 100644
index 0000000..725fe66
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java
@@ -0,0 +1,53 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.shaking.addconfigurationdebugging;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.StringUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class B133167042 extends TestBase {
+
+ static class TestClass {
+ public static void main(String... args) {
+ boolean onAndroid = false;
+ try {
+ // Intentional typo not to set `onAndroid`.
+ Class.forName("android.os.Bui1d");
+ onAndroid = true;
+ } catch (ClassNotFoundException e) {
+ // Intentionally empty
+ }
+ System.out.println(onAndroid);
+ }
+ }
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimes().build();
+ }
+
+ private final TestParameters parameters;
+
+ public B133167042(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void test() throws Exception {
+ testForR8(parameters.getBackend())
+ .addProgramClasses(TestClass.class)
+ .addKeepMainRule(TestClass.class)
+ .addKeepRules("-addconfigurationdebugging")
+ .setMinApi(parameters.getRuntime())
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(StringUtils.lines("false"));
+ }
+}