Remove minification predicate from root set.
Bug: 157012327
Change-Id: Icf7598e6ad30ac302d976bda1065cfae9f68fba6
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 24bbae5..07948a1 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -611,7 +611,7 @@
// Overwrite SourceFile if specified. This step should be done after IR conversion.
timing.begin("Rename SourceFile");
- new SourceFileRewriter(appView).run();
+ new SourceFileRewriter(appViewWithLiveness).run();
timing.end();
// Collect the already pruned types before creating a new app info without liveness.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
index 7272948..b1d8880 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
@@ -322,7 +322,8 @@
return null;
}
- if (appView.options().isMinifying() && appView.rootSet().mayBeMinified(holder, appView)) {
+ if (appView.enableWholeProgramOptimizations()
+ && appView.withLiveness().appInfo().isMinificationAllowed(holder)) {
if (invokedMethod == dexItemFactory.classMethods.getName) {
return new DexItemBasedValueString(holder, ClassNameComputationInfo.getInstance(NAME));
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
index d00100a..af2dee2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
@@ -354,7 +354,8 @@
continue;
}
boolean mayBeRenamed =
- appView.options().isMinifying() && appView.rootSet().mayBeMinified(holder.type, appView);
+ appView.enableWholeProgramOptimizations()
+ && appView.withLiveness().appInfo().isMinificationAllowed(holder.type);
// b/120138731: Filter out escaping uses. In such case, the result of this optimization will
// be stored somewhere, which can lead to a regression if the corresponding class is in a deep
// package hierarchy. For local cases, it is likely a one-time computation, but make sure the
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 2ee7485..3d27387 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -130,10 +130,10 @@
static class MinificationClassNamingStrategy extends BaseMinificationNamingStrategy
implements ClassNamingStrategy {
- final AppView<?> appView;
+ final AppView<AppInfoWithLiveness> appView;
final DexItemFactory factory;
- MinificationClassNamingStrategy(AppView<?> appView) {
+ MinificationClassNamingStrategy(AppView<AppInfoWithLiveness> appView) {
super(
appView.options().getProguardConfiguration().getClassObfuscationDictionary(),
appView.options().getProguardConfiguration().hasDontUseMixedCaseClassnames());
@@ -169,7 +169,7 @@
@Override
public DexString reservedDescriptor(DexType type) {
- if (appView.rootSet().mayNotBeMinified(type, appView)) {
+ if (!appView.appInfo().isMinificationAllowed(type)) {
return type.descriptor;
}
return null;
@@ -207,11 +207,11 @@
static class MinifierMemberNamingStrategy extends BaseMinificationNamingStrategy
implements MemberNamingStrategy {
- final AppView<?> appView;
+ final AppView<AppInfoWithLiveness> appView;
private final DexItemFactory factory;
private final boolean desugaredLibraryRenaming;
- public MinifierMemberNamingStrategy(AppView<?> appView) {
+ public MinifierMemberNamingStrategy(AppView<AppInfoWithLiveness> appView) {
super(appView.options().getProguardConfiguration().getObfuscationDictionary(), false);
this.appView = appView;
this.factory = appView.dexItemFactory();
@@ -254,7 +254,7 @@
if (!allowMemberRenaming(holder)
|| holder.accessFlags.isAnnotation()
|| method.accessFlags.isConstructor()
- || appView.rootSet().mayNotBeMinified(method.method, appView)) {
+ || !appView.appInfo().isMinificationAllowed(method.method)) {
return method.method.name;
}
if (desugaredLibraryRenaming
@@ -268,7 +268,7 @@
@Override
public DexString getReservedName(DexEncodedField field, DexClass holder) {
- if (holder.isLibraryClass() || appView.rootSet().mayNotBeMinified(field.field, appView)) {
+ if (holder.isLibraryClass() || !appView.appInfo().isMinificationAllowed(field.field)) {
return field.field.name;
}
return null;
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 57f63fa..ad27200 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -203,7 +203,7 @@
if (clazz == null || !appView.options().isMinifying()) {
notMappedReferences.add(type);
} else if (appView.options().isMinifying()
- && appView.rootSet().mayNotBeMinified(type, appView)) {
+ && !appView.appInfo().isMinificationAllowed(type)) {
notMappedReferences.add(type);
}
}
@@ -392,7 +392,9 @@
private final Set<String> mappedNames;
ApplyMappingClassNamingStrategy(
- AppView<?> appView, Map<DexType, DexString> mappings, Set<String> mappedNames) {
+ AppView<AppInfoWithLiveness> appView,
+ Map<DexType, DexString> mappings,
+ Set<String> mappedNames) {
super(appView);
this.mappings = mappings;
this.mappedNames = mappedNames;
@@ -402,7 +404,7 @@
public DexString next(
DexType type, char[] packagePrefix, InternalNamingState state, Predicate<String> isUsed) {
assert !mappings.containsKey(type);
- assert appView.rootSet().mayBeMinified(type, appView);
+ assert appView.appInfo().isMinificationAllowed(type);
return super.next(
type,
packagePrefix,
@@ -427,15 +429,12 @@
if (clazz.isNotProgramClass() && mappings.containsKey(type)) {
return mappings.get(type);
}
- if (clazz.isProgramClass() && appView.rootSet().mayBeMinified(type, appView)) {
- if (mappings.containsKey(type)) {
+ if (clazz.isProgramClass()) {
+ if (appView.appInfo().isMinificationAllowed(type)) {
return mappings.get(type);
}
- return null;
- } else if (clazz.isProgramClass()
- && !appView.rootSet().mayBeMinified(type, appView)
- && mappings.containsKey(type)) {
- // TODO(b/136694827): Report a warning here since the user may find this not intuitive.
+ // TODO(b/136694827): Report a warning here if in the mapping since the user may find this
+ // non intuitive.
}
return type.descriptor;
}
@@ -453,7 +452,7 @@
private final Reporter reporter;
public ApplyMappingMemberNamingStrategy(
- AppView<?> appView, Map<DexReference, MemberNaming> mappedNames) {
+ AppView<AppInfoWithLiveness> appView, Map<DexReference, MemberNaming> mappedNames) {
super(appView);
this.mappedNames = mappedNames;
this.factory = appView.dexItemFactory();
@@ -477,7 +476,7 @@
nextName = reservedName;
} else {
assert !mappedNames.containsKey(reference);
- assert appView.rootSet().mayBeMinified(reference, appView);
+ assert appView.appInfo().isMinificationAllowed(reference);
nextName = super.next(method, internalState, isAvailable);
}
assert nextName == reference.name || !method.isInitializer();
@@ -500,7 +499,7 @@
return reservedName;
}
assert !mappedNames.containsKey(reference);
- assert appView.rootSet().mayBeMinified(reference, appView);
+ assert appView.appInfo().isMinificationAllowed(reference);
return super.next(field, internalState, isAvailable);
}
diff --git a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
index a5ead29..1e57331 100644
--- a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.DexDebugEvent.SetFile;
import com.android.tools.r8.graph.DexDebugInfo;
import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.ProguardConfiguration;
import java.util.Arrays;
@@ -20,9 +21,9 @@
*/
public class SourceFileRewriter {
- private final AppView<?> appView;
+ private final AppView<AppInfoWithLiveness> appView;
- public SourceFileRewriter(AppView<?> appView) {
+ public SourceFileRewriter(AppView<AppInfoWithLiveness> appView) {
this.appView = appView;
}
@@ -45,7 +46,7 @@
// of ART.
if (!hasRenameSourceFileAttribute
&& proguardConfiguration.getKeepAttributes().sourceFile
- && appView.rootSet().mayNotBeMinified(clazz.type, appView)) {
+ && !appView.appInfo().isMinificationAllowed(clazz.type)) {
continue;
}
clazz.sourceFile = defaultRenaming;
diff --git a/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java b/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java
index 44efffc..db4613f 100644
--- a/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java
@@ -165,7 +165,7 @@
boolean wasSeen = methodPoolCollection.markIfNotSeen(holder, method.method);
if (wasSeen) {
// We can't do anything further because even renaming is not allowed due to the keep rule.
- if (appView.rootSet().mayNotBeMinified(method.method, appView)) {
+ if (!appView.appInfo().isMinificationAllowed(method.method)) {
return false;
}
// TODO(b/111118390): Renaming will enable more private instance methods to be publicized.
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 04ac91a..d3afad2 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -917,6 +917,11 @@
return this;
}
+ public boolean isMinificationAllowed(DexReference reference) {
+ return options().isMinificationEnabled()
+ && keepInfo.getInfo(reference, this).isMinificationAllowed(options());
+ }
+
public boolean isAccessModificationAllowed(DexReference reference) {
assert options().getProguardConfiguration().isAccessModificationAllowed();
return keepInfo.getInfo(reference, this).isAccessModificationAllowed(options());
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index 09a6587..ec9f101 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -29,12 +29,10 @@
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DirectMappedDexApplication;
-import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.ir.analysis.proto.GeneratedMessageLiteBuilderShrinker;
-import com.android.tools.r8.ir.optimize.enums.EnumUnboxingRewriter;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.shaking.AnnotationMatchResult.AnnotationsIgnoredMatchResult;
import com.android.tools.r8.shaking.AnnotationMatchResult.ConcreteAnnotationMatchResult;
@@ -1905,53 +1903,6 @@
noObfuscation.add(reference);
}
- public boolean mayBeMinified(DexReference reference, AppView<?> appView) {
- boolean minificationAllowed =
- appView.getKeepInfo().isMinificationAllowed(reference, appView, appView.options());
- // TODO: Remove this once consistency is established.
- // Assert consistency with existing root set info.
- // Split in to checks to make the direction clean in errors.
- // minify -> not-in-set
- assert !minificationAllowed
- || !noObfuscation.contains(getOriginal(reference, appView))
- // Compiler synthesized methods can be renamed regardless of keep rules.
- || isCompilerSynthesizedMethod(reference, appView);
- // !minify -> in-set
- assert minificationAllowed
- || noObfuscation.contains(getOriginal(reference, appView))
- || !appView.options().isMinificationEnabled();
- return minificationAllowed;
- }
-
- public boolean mayNotBeMinified(DexReference reference, AppView<?> appView) {
- return !mayBeMinified(reference, appView);
- }
-
- private boolean isCompilerSynthesizedMethod(DexReference reference, AppView<?> appView) {
- DexMethod method = reference.asDexMethod();
- if (method == null) {
- return false;
- }
- DexEncodedMethod definition = method.lookupOnClass(appView.definitionForHolder(method));
- return definition != null
- && (definition.isD8R8Synthesized()
- || definition
- .qualifiedName()
- .contains(EnumUnboxingRewriter.ENUM_UNBOXING_UTILITY_CLASS_NAME));
- }
-
- private DexReference getOriginal(DexReference reference, AppView<?> appView) {
- GraphLense lens = appView.graphLense();
- if (reference.isDexType()) {
- return lens.getOriginalType(reference.asDexType());
- }
- if (reference.isDexMethod()) {
- return lens.getOriginalMethodSignature(reference.asDexMethod());
- }
- assert reference.isDexField();
- return lens.getOriginalFieldSignature(reference.asDexField());
- }
-
public boolean verifyKeptFieldsAreAccessedAndLive(AppInfoWithLiveness appInfo) {
noShrinking.forEachField(
reference -> {
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 367092b..83f8ec0 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -47,7 +47,7 @@
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.naming.Range;
-import com.android.tools.r8.shaking.RootSetBuilder.RootSet;
+import com.android.tools.r8.shaking.KeepInfoCollection;
import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
import com.google.common.base.Suppliers;
import java.util.ArrayList;
@@ -448,7 +448,7 @@
if (appView.options().isGeneratingClassFiles()) {
return true;
}
- RootSet rootSet = appView.rootSet();
+ KeepInfoCollection keepInfo = appView.getKeepInfo();
boolean allSeenAreInstanceInitializers = true;
DexString originalName = null;
for (DexEncodedMethod method : methods) {
@@ -459,7 +459,7 @@
}
allSeenAreInstanceInitializers = false;
// If the method is pinned, we cannot minify it.
- if (rootSet.mayNotBeMinified(method.method, appView)) {
+ if (!keepInfo.isMinificationAllowed(method.method, appView, appView.options())) {
continue;
}
// With desugared library, call-backs names are reserved here.