Check that string literals refer to original types when minifying
Bug: 210825394
Bug: 210699098
Change-Id: I158ae11672eaa3ce03543b61da3130680b66ea6a
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index a775a72..4decfe8 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -13,14 +13,17 @@
import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.Code;
+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.DexString;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.DexValue.DexItemBasedValueString;
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.ProguardClassFilter;
+import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.List;
@@ -102,7 +105,23 @@
}
private DexString getRenamedStringLiteral(DexString originalLiteral) {
- DexString rewrittenString = lens.lookupDescriptorForJavaTypeName(originalLiteral.toString());
+ String descriptor =
+ DescriptorUtils.javaTypeToDescriptorIfValidJavaType(originalLiteral.toString());
+ if (descriptor == null) {
+ return originalLiteral;
+ }
+ DexType type = appView.dexItemFactory().createType(descriptor);
+ DexType originalType = appView.graphLens().getOriginalType(type);
+ if (originalType != type) {
+ // The type has changed to something clashing with the string.
+ return originalLiteral;
+ }
+ DexType rewrittenType = appView.graphLens().lookupType(type);
+ DexClass clazz = appView.appInfo().definitionForWithoutExistenceAssert(rewrittenType);
+ if (clazz == null || clazz.isNotProgramClass()) {
+ return originalLiteral;
+ }
+ DexString rewrittenString = lens.lookupClassDescriptor(rewrittenType);
return rewrittenString == null
? originalLiteral
: appView.dexItemFactory().createString(descriptorToJavaType(rewrittenString.toString()));
diff --git a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
index cc64864..bf18111 100644
--- a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
@@ -34,7 +34,7 @@
ClassRenaming classRenaming,
MethodRenaming methodRenaming,
FieldRenaming fieldRenaming) {
- super(appView.dexItemFactory(), classRenaming.classRenaming);
+ super(appView.dexItemFactory());
this.appView = appView;
this.packageRenaming = classRenaming.packageRenaming;
renaming.putAll(classRenaming.classRenaming);
diff --git a/src/main/java/com/android/tools/r8/naming/NamingLens.java b/src/main/java/com/android/tools/r8/naming/NamingLens.java
index b6e94ee..5b24eb9 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingLens.java
@@ -21,8 +21,6 @@
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.Sets;
import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
import java.util.Set;
/**
@@ -42,8 +40,6 @@
public abstract DexString lookupDescriptor(DexType type);
- public abstract DexString lookupDescriptorForJavaTypeName(String typeName);
-
public DexString lookupClassDescriptor(DexType type) {
assert type.isClassType();
return internalLookupClassDescriptor(type);
@@ -185,13 +181,9 @@
public abstract static class NonIdentityNamingLens extends NamingLens {
private final DexItemFactory dexItemFactory;
- private final Map<String, DexString> typeStringMapping;
- protected NonIdentityNamingLens(
- DexItemFactory dexItemFactory, Map<DexType, DexString> typeMapping) {
+ protected NonIdentityNamingLens(DexItemFactory dexItemFactory) {
this.dexItemFactory = dexItemFactory;
- typeStringMapping = new HashMap<>();
- typeMapping.forEach((k, v) -> typeStringMapping.put(k.toSourceString(), v));
}
protected DexItemFactory dexItemFactory() {
@@ -211,11 +203,6 @@
assert type.isClassType();
return lookupClassDescriptor(type);
}
-
- @Override
- public DexString lookupDescriptorForJavaTypeName(String typeName) {
- return typeStringMapping.get(typeName);
- }
}
private static final class IdentityLens extends NamingLens {
@@ -230,11 +217,6 @@
}
@Override
- public DexString lookupDescriptorForJavaTypeName(String typeName) {
- return null;
- }
-
- @Override
protected DexString internalLookupClassDescriptor(DexType type) {
return type.descriptor;
}
diff --git a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
index 04f235f..5ab9772 100644
--- a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
@@ -12,7 +12,6 @@
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.naming.NamingLens.NonIdentityNamingLens;
import com.android.tools.r8.utils.InternalOptions;
-import java.util.IdentityHashMap;
// Naming lens for rewriting type prefixes.
public class PrefixRewritingNamingLens extends NonIdentityNamingLens {
@@ -34,7 +33,7 @@
}
public PrefixRewritingNamingLens(NamingLens namingLens, AppView<?> appView) {
- super(appView.dexItemFactory(), new IdentityHashMap<>());
+ super(appView.dexItemFactory());
this.appView = appView;
this.namingLens = namingLens;
this.options = appView.options();
@@ -96,18 +95,6 @@
}
@Override
- public DexString lookupDescriptorForJavaTypeName(String typeName) {
- if (appView.rewritePrefix.shouldRewriteTypeName(typeName)) {
- DexType rewrittenType =
- appView.rewritePrefix.rewrittenType(dexItemFactory().createType(typeName), appView);
- if (rewrittenType != null) {
- return rewrittenType.descriptor;
- }
- }
- return namingLens.lookupDescriptorForJavaTypeName(typeName);
- }
-
- @Override
public String lookupPackageName(String packageName) {
// Used for resource shrinking.
// Desugared libraries do not have resources.
diff --git a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
index e809317..f2a4e8b 100644
--- a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
@@ -13,7 +13,6 @@
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.naming.NamingLens.NonIdentityNamingLens;
import com.android.tools.r8.utils.InternalOptions;
-import java.util.IdentityHashMap;
// Naming lens for rewriting java.lang.Record to the internal RecordTag type.
public class RecordRewritingNamingLens extends NonIdentityNamingLens {
@@ -34,7 +33,7 @@
}
public RecordRewritingNamingLens(NamingLens namingLens, AppView<?> appView) {
- super(appView.dexItemFactory(), new IdentityHashMap<>());
+ super(appView.dexItemFactory());
this.namingLens = namingLens;
factory = appView.dexItemFactory();
}
@@ -75,14 +74,6 @@
}
@Override
- public DexString lookupDescriptorForJavaTypeName(String typeName) {
- if (typeName.equals(factory.recordType.toSourceString())) {
- return factory.recordTagType.descriptor;
- }
- return namingLens.lookupDescriptorForJavaTypeName(typeName);
- }
-
- @Override
public String lookupPackageName(String packageName) {
return namingLens.lookupPackageName(packageName);
}
diff --git a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
index 3a5902a..7afb7e3 100644
--- a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
+++ b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
@@ -102,7 +102,7 @@
Map<DexType, DexString> typeMappings,
Map<String, String> packageMappings,
DexItemFactory factory) {
- super(factory, typeMappings);
+ super(factory);
this.typeMappings = typeMappings;
this.packageMappings = packageMappings;
}
diff --git a/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringWithRepackagingTest.java b/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringWithRepackagingTest.java
index 6bcb1a5..06557fa 100644
--- a/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringWithRepackagingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringWithRepackagingTest.java
@@ -36,8 +36,7 @@
.addKeepRules("-adaptclassstrings")
.addKeepClassRulesWithAllowObfuscation(Foo.class)
.run(parameters.getRuntime(), Main.class)
- // TODO(b/210699098): The class is renamed and so should the output
- .assertSuccessWithOutputLines(Foo.class.getName())
+ .assertSuccessWithOutputLines("a")
.inspect(inspector -> assertThat(inspector.clazz(Foo.class), isPresentAndRenamed()));
}
diff --git a/src/test/java/com/android/tools/r8/naming/adaptclassstrings/RepackageMinificationNameClashTest.java b/src/test/java/com/android/tools/r8/naming/adaptclassstrings/RepackageMinificationNameClashTest.java
index 00dc064..1f23283 100644
--- a/src/test/java/com/android/tools/r8/naming/adaptclassstrings/RepackageMinificationNameClashTest.java
+++ b/src/test/java/com/android/tools/r8/naming/adaptclassstrings/RepackageMinificationNameClashTest.java
@@ -34,8 +34,7 @@
.addKeepClassRulesWithAllowObfuscation(Foo.class)
.addKeepMainRule(Main.class)
.run(parameters.getRuntime(), Main.class)
- // TODO(b/210699098): Should be RepackageMinificationNameClashTest$Foo.
- .assertSuccessWithOutputLines("a");
+ .assertSuccessWithOutputLines("RepackageMinificationNameClashTest$Foo");
}
public static class Foo {}