Naming strategy in L8
- j$ types are minified normally, but package is preserved.
- java types have their package preserved, and are either kept (types
and fixed suffix synthetic such as companion class) or minified with
a non colliding naming scheme "j$a", "j$b", etc.
Bug: 222647019
Change-Id: Id050dde8ba9820f296c69e8cbc5ecd0c4cf790d4
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 0fafbac..7367257 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -200,6 +200,10 @@
return topLevelFlags.getRequiredCompilationAPILevel();
}
+ public boolean requiresTypeRewriting() {
+ return !getRewriteType().isEmpty() || !getRewriteDerivedTypeOnly().isEmpty();
+ }
+
private int getLeadingVersionNumber() {
if (leadingVersionNumberCache != -1) {
return leadingVersionNumberCache;
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index 1ba7556..2177ea3 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -53,7 +53,9 @@
ClassNameMinifier classNameMinifier =
new ClassNameMinifier(
appView,
- new MinificationClassNamingStrategy(appView),
+ appView.options().synthesizedClassPrefix.isEmpty()
+ ? new MinificationClassNamingStrategy(appView)
+ : new L8MinificationClassNamingStrategy(appView),
// Use deterministic class order to make sure renaming is deterministic.
appView.appInfo().classesWithDeterministicOrder());
ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing);
@@ -122,6 +124,11 @@
String nextName(char[] packagePrefix, InternalNamingState state) {
StringBuilder nextName = new StringBuilder();
nextName.append(packagePrefix);
+ nextName.append(nextString(packagePrefix, state));
+ return nextName.toString();
+ }
+
+ String nextString(char[] packagePrefix, InternalNamingState state) {
String nextString;
do {
if (state.getDictionaryIndex() < obfuscationDictionary.size()) {
@@ -133,8 +140,36 @@
} while (obfuscationDictionaryForLookup.contains(nextString));
}
} while (RESERVED_NAMES.contains(nextString));
- nextName.append(nextString);
- return nextName.toString();
+ return nextString;
+ }
+ }
+
+ static class L8MinificationClassNamingStrategy extends MinificationClassNamingStrategy {
+
+ private final String prefix;
+
+ L8MinificationClassNamingStrategy(AppView<AppInfoWithLiveness> appView) {
+ super(appView);
+ String synthesizedClassPrefix = appView.options().synthesizedClassPrefix;
+ prefix = synthesizedClassPrefix.substring(0, synthesizedClassPrefix.length() - 1);
+ }
+
+ private boolean startsWithPrefix(char[] packagePrefix) {
+ if (packagePrefix.length < prefix.length() + 1) {
+ return false;
+ }
+ for (int i = 0; i < prefix.length(); i++) {
+ if (prefix.charAt(i) != packagePrefix[i + 1]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ String nextString(char[] packagePrefix, InternalNamingState state) {
+ String nextString = super.nextString(packagePrefix, state);
+ return startsWithPrefix(packagePrefix) ? nextString : prefix + nextString;
}
}
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 309e92a5..4360d10 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -969,9 +969,9 @@
MachineDesugaredLibrarySpecification.empty();
public TypeRewriter getTypeRewriter() {
- return machineDesugaredLibrarySpecification.getRewriteType().isEmpty()
- ? TypeRewriter.empty()
- : new MachineDesugarPrefixRewritingMapper(machineDesugaredLibrarySpecification);
+ return machineDesugaredLibrarySpecification.requiresTypeRewriting()
+ ? new MachineDesugarPrefixRewritingMapper(machineDesugaredLibrarySpecification)
+ : TypeRewriter.empty();
}
public boolean relocatorCompilation = false;