Only rename classpath and program with -applymapping
Bug: 133091438
Bug: 215318785
Change-Id: I286732576026cc49a3a9929e09847610b9cb85f1
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java
index c3e65b0..e08f2ed 100644
--- a/src/main/java/com/android/tools/r8/graph/DexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -126,13 +126,14 @@
return classesWithDeterministicOrder(new ArrayList<>(programClasses()));
}
- public static <T extends DexClass> List<T> classesWithDeterministicOrder(Collection<T> classes) {
+ public static <T extends ClassDefinition> List<T> classesWithDeterministicOrder(
+ Collection<T> classes) {
return classesWithDeterministicOrder(new ArrayList<>(classes));
}
- public static <T extends DexClass> List<T> classesWithDeterministicOrder(List<T> classes) {
+ public static <T extends ClassDefinition> List<T> classesWithDeterministicOrder(List<T> classes) {
// To keep the order deterministic, we sort the classes by their type, which is a unique key.
- classes.sort(Comparator.comparing(DexClass::getType));
+ classes.sort(Comparator.comparing(ClassDefinition::getType));
return classes;
}
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 ca54e1b..9a801b9 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -11,12 +11,13 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexClassAndField;
+import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.InnerClassAttribute;
+import com.android.tools.r8.graph.ProgramOrClasspathClass;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
@@ -35,7 +36,7 @@
private final AppView<AppInfoWithLiveness> appView;
private final ClassNamingStrategy classNamingStrategy;
- private final Iterable<? extends DexClass> classes;
+ private final Iterable<? extends ProgramOrClasspathClass> classes;
private final Set<String> usedTypeNames = Sets.newHashSet();
private final Map<DexType, DexString> renaming = Maps.newIdentityHashMap();
private final Map<String, Namespace> states = new HashMap<>();
@@ -48,7 +49,7 @@
ClassNameMinifier(
AppView<AppInfoWithLiveness> appView,
ClassNamingStrategy classNamingStrategy,
- Iterable<? extends DexClass> classes) {
+ Iterable<? extends ProgramOrClasspathClass> classes) {
this.appView = appView;
this.classNamingStrategy = classNamingStrategy;
this.classes = classes;
@@ -86,11 +87,11 @@
ClassRenaming computeRenaming(Timing timing) {
// Collect names we have to keep.
timing.begin("reserve");
- for (DexClass clazz : classes) {
- DexString descriptor = classNamingStrategy.reservedDescriptor(clazz.type);
+ for (ProgramOrClasspathClass clazz : classes) {
+ DexString descriptor = classNamingStrategy.reservedDescriptor(clazz.getType());
if (descriptor != null) {
- assert !renaming.containsKey(clazz.type);
- registerClassAsUsed(clazz.type, descriptor);
+ assert !renaming.containsKey(clazz.getType());
+ registerClassAsUsed(clazz.getType(), descriptor);
}
}
appView
@@ -100,24 +101,17 @@
timing.end();
timing.begin("rename-classes");
- for (DexClass clazz : classes) {
- if (!renaming.containsKey(clazz.type)) {
- DexString renamed = computeName(clazz.type);
- renaming.put(clazz.type, renamed);
- // If the class is a member class and it has used $ separator, its renamed name should have
- // the same separator (as long as inner-class attribute is honored).
- assert !keepInnerClassStructure
- || !clazz.isMemberClass()
- || !clazz.type.getInternalName().contains(String.valueOf(INNER_CLASS_SEPARATOR))
- || renamed.toString().contains(String.valueOf(INNER_CLASS_SEPARATOR))
- || classNamingStrategy.isRenamedByApplyMapping(clazz.type)
- : clazz.toSourceString() + " -> " + renamed;
+ for (ProgramOrClasspathClass clazz : classes) {
+ if (!renaming.containsKey(clazz.getType())) {
+ DexString renamed = computeName(clazz.getType());
+ renaming.put(clazz.getType(), renamed);
+ assert verifyMemberRenamingOfInnerClasses(clazz.asDexClass(), renamed);
}
}
timing.end();
timing.begin("rename-dangling-types");
- for (DexClass clazz : classes) {
+ for (ProgramOrClasspathClass clazz : classes) {
renameDanglingTypes(clazz);
}
timing.end();
@@ -125,6 +119,18 @@
return new ClassRenaming(Collections.unmodifiableMap(renaming), getPackageRenaming());
}
+ private boolean verifyMemberRenamingOfInnerClasses(DexClass clazz, DexString renamed) {
+ // If the class is a member class and it has used $ separator, its renamed name should have
+ // the same separator (as long as inner-class attribute is honored).
+ assert !keepInnerClassStructure
+ || !clazz.isMemberClass()
+ || !clazz.getType().getInternalName().contains(String.valueOf(INNER_CLASS_SEPARATOR))
+ || renamed.toString().contains(String.valueOf(INNER_CLASS_SEPARATOR))
+ || classNamingStrategy.isRenamedByApplyMapping(clazz.getType())
+ : clazz + " -> " + renamed;
+ return true;
+ }
+
private Map<String, String> getPackageRenaming() {
ImmutableMap.Builder<String, String> packageRenaming = ImmutableMap.builder();
for (Entry<String, Namespace> entry : states.entrySet()) {
@@ -137,16 +143,16 @@
return packageRenaming.build();
}
- private void renameDanglingTypes(DexClass clazz) {
- clazz.forEachMethod(this::renameDanglingTypesInMethod);
- clazz.forEachField(this::renameDanglingTypesInField);
+ private void renameDanglingTypes(ProgramOrClasspathClass clazz) {
+ clazz.forEachClassMethod(this::renameDanglingTypesInMethod);
+ clazz.forEachClassField(this::renameDanglingTypesInField);
}
- private void renameDanglingTypesInField(DexEncodedField field) {
+ private void renameDanglingTypesInField(DexClassAndField field) {
renameDanglingType(field.getReference().type);
}
- private void renameDanglingTypesInMethod(DexEncodedMethod method) {
+ private void renameDanglingTypesInMethod(DexClassAndMethod method) {
DexProto proto = method.getReference().proto;
renameDanglingType(proto.returnType);
for (DexType type : proto.parameters.values) {
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index 43cf17d..174614b 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -22,6 +22,7 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramField;
+import com.android.tools.r8.graph.ProgramOrClasspathClass;
import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.naming.ClassNameMinifier.ClassRenaming;
import com.android.tools.r8.naming.FieldNameMinifier.FieldRenaming;
@@ -78,7 +79,7 @@
private final SeedMapper seedMapper;
private final BiMap<DexType, DexString> mappedNames = HashBiMap.create();
// To keep the order deterministic, we sort the classes by their type, which is a unique key.
- private final Set<DexClass> mappedClasses = Sets.newIdentityHashSet();
+ private final Set<ProgramOrClasspathClass> mappedClasses = Sets.newIdentityHashSet();
private final Map<DexReference, MemberNaming> memberNames = Maps.newIdentityHashMap();
private final Map<DexMethod, DexString> defaultInterfaceMethodImplementationNames =
Maps.newIdentityHashMap();
@@ -193,14 +194,17 @@
DexClass clazz = appView.definitionFor(type);
// Keep track of classes that needs to get renamed.
- if (clazz != null && (classNaming != null || clazz.isProgramClass())) {
- mappedClasses.add(clazz);
+ if (clazz != null) {
+ if (clazz.isClasspathClass() && classNaming != null) {
+ mappedClasses.add(clazz.asClasspathClass());
+ } else if (clazz.isProgramClass()) {
+ mappedClasses.add(clazz.asProgramClass());
+ }
}
Map<DexReference, MemberNaming> nonPrivateMembers = new IdentityHashMap<>();
- if (classNaming != null) {
- // TODO(b/133091438) assert that !dexClass.isLibraryClass();
+ if (classNaming != null && (clazz == null || !clazz.isLibraryClass())) {
DexString mappedName = factory.createString(classNaming.renamedName);
checkAndAddMappedNames(type, mappedName, classNaming.position);
classNaming.forAllMemberNaming(
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
index ce65a85..df6fe4d 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.naming.applymapping;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
-import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
@@ -42,19 +41,16 @@
.compile()
.inspect(
inspector -> {
- // TODO(b/215318785): We should never rename on library path.
ClassSubject clazz = inspector.clazz(Main.class);
assertThat(clazz, isPresentAndNotRenamed());
FoundClassSubject foundClassSubject = clazz.asFoundClassSubject();
- assertEquals("a.a", foundClassSubject.getSuperClass().getOriginalName());
+ assertEquals(
+ typeName(LibraryClass.class),
+ foundClassSubject.getSuperClass().getOriginalName());
})
.addRunClasspathClasses(LibraryClass.class)
.run(parameters.getRuntime(), Main.class)
- // TODO(b/215318785): Running the program should work.
- .assertFailureWithErrorThatMatchesIf(
- parameters.isCfRuntime(), containsString("Could not find or load main class"))
- .assertFailureWithErrorThatThrowsIf(
- parameters.isDexRuntime(), ClassNotFoundException.class);
+ .assertSuccessWithOutputLines("LibraryClass::foo");
}
public static class LibraryClass {