Enable new repackaging by default
Bug: 165783399
Change-Id: Id9aae345dc0ef3ab31607585d33a606f684864cd
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 9bee3f3..8cd402f 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -807,11 +807,9 @@
appView.setGraphLens(memberRebindingLens);
// Perform repackaging.
- if (options.isRepackagingEnabled() && options.testing.enableExperimentalRepackaging) {
+ if (options.isRepackagingEnabled()) {
DirectMappedDexApplication.Builder appBuilder =
appView.appInfo().app().asDirect().builder();
- // TODO(b/165783399): We need to deal with non-rebound member references in the writer,
- // possibly by adding a member rebinding lens on top of the repackaging lens.
RepackagingLens lens =
new Repackaging(appView.withLiveness()).run(appBuilder, executorService, timing);
if (lens != null) {
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index 40713b8..e7ca5b5 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -21,7 +21,6 @@
import com.android.tools.r8.shaking.ProguardPackageNameList;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.Timing;
import com.google.common.collect.ImmutableMap;
@@ -40,7 +39,6 @@
private final ClassNamingStrategy classNamingStrategy;
private final PackageNamingStrategy packageNamingStrategy;
private final Iterable<? extends DexClass> classes;
- private final PackageObfuscationMode packageObfuscationMode;
private final boolean isAccessModificationAllowed;
private final Set<String> noObfuscationPrefixes = Sets.newHashSet();
private final Set<String> usedPackagePrefixes = Sets.newHashSet();
@@ -63,27 +61,16 @@
this.packageNamingStrategy = packageNamingStrategy;
this.classes = classes;
InternalOptions options = appView.options();
- this.packageObfuscationMode =
- options.testing.enableExperimentalRepackaging
- ? PackageObfuscationMode.NONE
- : options.getProguardConfiguration().getPackageObfuscationMode();
this.isAccessModificationAllowed =
options.getProguardConfiguration().isAccessModificationAllowed();
this.keepInnerClassStructure = options.keepInnerClassStructure();
// Initialize top-level naming state.
- if (options.testing.enableExperimentalRepackaging) {
- topLevelState = new Namespace("");
- String newPackageDescriptor =
- StringUtils.replaceAll(options.getProguardConfiguration().getPackagePrefix(), ".", "/");
- if (!newPackageDescriptor.isEmpty()) {
- registerPackagePrefixesAsUsed(newPackageDescriptor, false);
- }
- } else {
- topLevelState =
- new Namespace(
- getPackageBinaryNameFromJavaType(
- options.getProguardConfiguration().getPackagePrefix()));
+ topLevelState = new Namespace("");
+ String newPackageDescriptor =
+ StringUtils.replaceAll(options.getProguardConfiguration().getPackagePrefix(), ".", "/");
+ if (!newPackageDescriptor.isEmpty()) {
+ registerPackagePrefixesAsUsed(newPackageDescriptor, false);
}
states.put("", topLevelState);
@@ -284,25 +271,7 @@
if (noObfuscationPrefixes.contains(packageName) || keepPackageNames.matches(type)) {
return states.computeIfAbsent(packageName, Namespace::new);
}
- Namespace state = topLevelState;
- switch (packageObfuscationMode) {
- case NONE:
- // For general obfuscation, rename all the involved package prefixes.
- state = getStateForPackagePrefix(packageName);
- break;
- case REPACKAGE:
- // For repackaging, all classes are repackaged to a single package.
- state = topLevelState;
- break;
- case FLATTEN:
- // For flattening, all packages are repackaged to a single package.
- state = states.computeIfAbsent(packageName, k -> {
- String renamedPackagePrefix = topLevelState.nextPackagePrefix();
- return new Namespace(renamedPackagePrefix);
- });
- break;
- }
- return state;
+ return getStateForPackagePrefix(packageName);
}
private Namespace getStateForPackagePrefix(String prefix) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 091325a..a429fb1 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1253,7 +1253,6 @@
public boolean alwaysUsePessimisticRegisterAllocation = false;
public boolean enableCheckCastAndInstanceOfRemoval = true;
public boolean enableDeadSwitchCaseElimination = true;
- public boolean enableExperimentalRepackaging = false;
public boolean enableInvokeSuperToInvokeVirtualRewriting = true;
public boolean enableSwitchToIfRewriting = true;
public boolean enableEnumUnboxingDebugLogs = false;
diff --git a/src/test/examples/naming101/a/b/c.java b/src/test/examples/naming101/a/b/c.java
index b399bda..04dc965 100644
--- a/src/test/examples/naming101/a/b/c.java
+++ b/src/test/examples/naming101/a/b/c.java
@@ -4,5 +4,5 @@
package naming101.a.b;
public class c {
- static boolean flag = true;
+ public static boolean flag = true;
}
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index a29c664..ddf20ef 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -140,7 +140,7 @@
assertThat(testClass, isPresent());
// Test the totally unused method.
- MethodSubject staticMethod = testClass.method("void", "unused", ImmutableList.of());
+ MethodSubject staticMethod = testClass.uniqueMethodWithName("unused");
assertThat(staticMethod, isPresent());
assertEquals(minify, staticMethod.isRenamed());
if (shrinker.isR8()) {
@@ -150,7 +150,7 @@
}
// Test an indirectly referred method.
- staticMethod = testClass.method("java.lang.String", "staticMethod", ImmutableList.of());
+ staticMethod = testClass.uniqueMethodWithName("staticMethod");
assertThat(staticMethod, isPresent());
assertEquals(minify, staticMethod.isRenamed());
boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
@@ -191,7 +191,7 @@
assertThat(testClass, isPresent());
// Test the totally unused method.
- MethodSubject staticMethod = testClass.method("void", "unused", ImmutableList.of());
+ MethodSubject staticMethod = testClass.uniqueMethodWithName("unused");
assertThat(staticMethod, isPresent());
assertEquals(minify, staticMethod.isRenamed());
if (shrinker.isR8()) {
@@ -201,7 +201,7 @@
}
// Test an indirectly referred method.
- staticMethod = testClass.method("java.lang.String", "staticMethod", ImmutableList.of());
+ staticMethod = testClass.uniqueMethodWithName("staticMethod");
assertThat(staticMethod, isPresent());
assertEquals(minify, staticMethod.isRenamed());
boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
@@ -254,11 +254,11 @@
assertThat(testClass, isPresent());
// Test the totally unused method.
- MethodSubject staticMethod = testClass.method("void", "unused", ImmutableList.of());
+ MethodSubject staticMethod = testClass.uniqueMethodWithName("unused");
assertThat(staticMethod, not(isPresent()));
// Test an indirectly referred method.
- staticMethod = testClass.method("java.lang.String", "staticMethod", ImmutableList.of());
+ staticMethod = testClass.uniqueMethodWithName("staticMethod");
assertThat(staticMethod, isPresent());
assertEquals(minify, staticMethod.isRenamed());
boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
diff --git a/src/test/java/com/android/tools/r8/proguard/configuration/RepackagingCompatibilityTest.java b/src/test/java/com/android/tools/r8/proguard/configuration/RepackagingCompatibilityTest.java
index 8d62a04..b078b2f 100644
--- a/src/test/java/com/android/tools/r8/proguard/configuration/RepackagingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/configuration/RepackagingCompatibilityTest.java
@@ -62,7 +62,7 @@
@Test
public void testProguard() throws Exception {
- runTest(testForProguard(), "Proguard");
+ runTest(testForProguard().addKeepRules("-dontwarn " + getClass().getTypeName()), "Proguard");
}
private void runTest(TestShrinkerBuilder<?, ?, ?, ?, ?> builder, String shrinker)
@@ -125,11 +125,11 @@
throw new Unreachable();
}
}
-}
-class RepackagingCompatabilityTestClass {
+ public static class RepackagingCompatabilityTestClass {
- public static void main(String[] args) {
- System.out.println("Hello world!");
+ public static void main(String[] args) {
+ System.out.println("Hello world!");
+ }
}
}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
index b9d3c40..2bfe216 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
@@ -66,28 +66,25 @@
private final boolean allowAccessModification;
- @Parameters(name = "{3}, allow access modification: {0}, experimental: {1}, kind: {2}")
+ @Parameters(name = "{3}, allow access modification: {0}, kind: {1}")
public static List<Object[]> data() {
return buildParameters(
BooleanUtils.values(),
- BooleanUtils.values(),
ImmutableList.of(FLATTEN_PACKAGE_HIERARCHY, REPACKAGE_CLASSES),
getTestParameters().withAllRuntimesAndApiLevels().build());
}
public RepackageTest(
boolean allowAccessModification,
- boolean enableExperimentalRepackaging,
String flattenPackageHierarchyOrRepackageClasses,
TestParameters parameters) {
- super(enableExperimentalRepackaging, flattenPackageHierarchyOrRepackageClasses, parameters);
+ super(flattenPackageHierarchyOrRepackageClasses, parameters);
this.allowAccessModification = allowAccessModification;
}
@Test
public void testJvm() throws Exception {
assumeFalse(allowAccessModification);
- assumeFalse(isExperimentalRepackaging());
assumeTrue(isFlattenPackageHierarchy());
assumeTrue(parameters.isCfRuntime());
testForJvm()
@@ -134,11 +131,7 @@
* eligible for repackaging (or it needs to stay in its original package).
*/
private void forEachClass(BiConsumer<Class<?>, Boolean> consumer) {
- // TODO(b/165783399): This should be renamed to markAlwaysEligible() and always pass `true` to
- // the consumer, since these classes should be repackaged independent of
- // -allowaccessmodification.
- Consumer<Class<?>> markShouldAlwaysBeEligible =
- clazz -> consumer.accept(clazz, allowAccessModification || isExperimentalRepackaging());
+ Consumer<Class<?>> markShouldAlwaysBeEligible = clazz -> consumer.accept(clazz, true);
Consumer<Class<?>> markEligibleWithAllowAccessModification =
clazz -> consumer.accept(clazz, allowAccessModification);
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java b/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java
index 3e2f695..9a1ad72 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java
@@ -6,7 +6,6 @@
import static com.android.tools.r8.shaking.ProguardConfigurationParser.FLATTEN_PACKAGE_HIERARCHY;
import static com.android.tools.r8.shaking.ProguardConfigurationParser.REPACKAGE_CLASSES;
-import static org.junit.Assert.assertFalse;
import com.android.tools.r8.R8TestBuilder;
import com.android.tools.r8.TestBase;
@@ -24,7 +23,6 @@
public abstract class RepackageTestBase extends TestBase {
- private final boolean enableExperimentalRepackaging;
private final String flattenPackageHierarchyOrRepackageClasses;
protected final TestParameters parameters;
@@ -36,15 +34,8 @@
}
public RepackageTestBase(
- String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) {
- this(true, flattenPackageHierarchyOrRepackageClasses, parameters);
- }
-
- public RepackageTestBase(
- boolean enableExperimentalRepackaging,
String flattenPackageHierarchyOrRepackageClasses,
TestParameters parameters) {
- this.enableExperimentalRepackaging = enableExperimentalRepackaging;
this.flattenPackageHierarchyOrRepackageClasses = flattenPackageHierarchyOrRepackageClasses;
this.parameters = parameters;
}
@@ -140,18 +131,8 @@
}
protected void configureRepackaging(R8TestBuilder<?> testBuilder) {
- testBuilder
- .addKeepRules(
- "-" + flattenPackageHierarchyOrRepackageClasses + " \"" + getRepackagePackage() + "\"")
- .addOptionsModification(
- options -> {
- assertFalse(options.testing.enableExperimentalRepackaging);
- options.testing.enableExperimentalRepackaging = enableExperimentalRepackaging;
- });
- }
-
- protected boolean isExperimentalRepackaging() {
- return enableExperimentalRepackaging;
+ testBuilder.addKeepRules(
+ "-" + flattenPackageHierarchyOrRepackageClasses + " \"" + getRepackagePackage() + "\"");
}
protected boolean isFlattenPackageHierarchy() {