Pass app view to main dex list builder.
Bug: 149167169
Change-Id: I31aa679b69c1751fa20e3a1df1b4707e88231019
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 4b32cd3..243b37a 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -70,7 +70,7 @@
EnqueuerFactory.createForMainDexTracing(appView, subtypingInfo, graphConsumer);
Set<DexProgramClass> liveTypes = enqueuer.traceMainDex(mainDexRootSet, executor, timing);
// LiveTypes is the result.
- MainDexClasses mainDexClasses = new MainDexListBuilder(liveTypes, application).run();
+ MainDexClasses mainDexClasses = new MainDexListBuilder(liveTypes, appView).run();
List<String> result =
mainDexClasses.getClasses().stream()
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d04ad46..6275d39 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -452,7 +452,7 @@
EnqueuerFactory.createForMainDexTracing(appView, subtypingInfo)
.traceMainDex(mainDexRootSet, executorService, timing);
// Calculate the automatic main dex list according to legacy multidex constraints.
- mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, getDirectApp(appView)).run();
+ mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, appView).run();
appView.appInfo().unsetObsolete();
}
@@ -654,7 +654,7 @@
Set<DexProgramClass> mainDexBaseClasses =
enqueuer.traceMainDex(mainDexRootSet, executorService, timing);
// Calculate the automatic main dex list according to legacy multidex constraints.
- mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, getDirectApp(appView)).run();
+ mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, appView).run();
final MainDexClasses finalMainDexClasses = mainDexClasses;
processWhyAreYouKeepingAndCheckDiscarded(
@@ -1000,9 +1000,7 @@
if (lens != null) {
appView.setGraphLens(lens);
appViewWithLiveness.setAppInfo(
- appViewWithLiveness
- .appInfo()
- .rewrittenWithLens(appView.appInfo().app().asDirect(), lens));
+ appViewWithLiveness.appInfo().rewrittenWithLens(getDirectApp(appView), lens));
}
if (InternalOptions.assertionsEnabled()) {
// Register the dead proto types. These are needed to verify that no new missing types are
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
index fc34925..c122cd7 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -6,13 +6,13 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.DirectMappedDexApplication;
import com.android.tools.r8.utils.SetUtils;
import java.util.IdentityHashMap;
import java.util.Map;
@@ -28,9 +28,8 @@
public class MainDexListBuilder {
private final Set<DexType> roots;
- private final AppInfoWithClassHierarchy appInfo;
+ private final AppView<? extends AppInfoWithClassHierarchy> appView;
private final Map<DexType, Boolean> annotationTypeContainEnum;
- private final DirectMappedDexApplication dexApplication;
private final MainDexClasses.Builder mainDexClassesBuilder;
public static void checkForAssumedLibraryTypes(AppInfo appInfo) {
@@ -48,17 +47,21 @@
/**
* @param roots Classes which code may be executed before secondary dex files loading.
- * @param application the dex appplication.
+ * @param appView the dex appplication.
*/
- public MainDexListBuilder(Set<DexProgramClass> roots, DirectMappedDexApplication application) {
- this.dexApplication = application;
- this.appInfo = new AppInfoWithClassHierarchy(dexApplication);
+ public MainDexListBuilder(
+ Set<DexProgramClass> roots, AppView<? extends AppInfoWithClassHierarchy> appView) {
+ this.appView = appView;
// Only consider program classes for the root set.
this.roots = SetUtils.mapIdentityHashSet(roots, DexProgramClass::getType);
- mainDexClassesBuilder = MainDexClasses.builder(appInfo).addRoots(this.roots);
+ mainDexClassesBuilder = MainDexClasses.builder(appView.appInfo()).addRoots(this.roots);
annotationTypeContainEnum = new IdentityHashMap<>();
}
+ private AppInfoWithClassHierarchy appInfo() {
+ return appView.appInfo();
+ }
+
public MainDexClasses run() {
traceMainDexDirectDependencies();
traceRuntimeAnnotationsWithEnumForMainDex();
@@ -66,7 +69,7 @@
}
private void traceRuntimeAnnotationsWithEnumForMainDex() {
- for (DexProgramClass clazz : dexApplication.classes()) {
+ for (DexProgramClass clazz : appInfo().classes()) {
DexType dexType = clazz.type;
if (mainDexClassesBuilder.contains(dexType)) {
continue;
@@ -91,7 +94,7 @@
private boolean isAnnotationWithEnum(DexType dexType) {
Boolean value = annotationTypeContainEnum.get(dexType);
if (value == null) {
- DexClass clazz = appInfo.definitionFor(dexType);
+ DexClass clazz = appView.definitionFor(dexType);
if (clazz == null) {
// Information is missing lets be conservative.
value = true;
@@ -102,7 +105,7 @@
for (DexEncodedMethod method : clazz.virtualMethods()) {
DexProto proto = method.method.proto;
if (proto.parameters.isEmpty()) {
- DexType valueType = proto.returnType.toBaseType(appInfo.dexItemFactory());
+ DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
if (valueType.isClassType()) {
if (isEnum(valueType)) {
value = true;
@@ -122,16 +125,15 @@
private boolean isEnum(DexType valueType) {
return valueType.isClassType()
- && appInfo.isSubtype(valueType, appInfo.dexItemFactory().enumType);
+ && appInfo().isSubtype(valueType, appView.dexItemFactory().enumType);
}
private boolean isAnnotation(DexType valueType) {
- return appInfo.isSubtype(valueType, appInfo.dexItemFactory().annotationType);
+ return appInfo().isSubtype(valueType, appView.dexItemFactory().annotationType);
}
private void traceMainDexDirectDependencies() {
- new MainDexDirectReferenceTracer(appInfo, this::addDirectDependency)
- .run(roots);
+ new MainDexDirectReferenceTracer(appInfo(), this::addDirectDependency).run(roots);
}
private void addAnnotationsWithEnum(DexProgramClass clazz) {
@@ -141,7 +143,7 @@
for (DexEncodedMethod method : clazz.virtualMethods()) {
DexProto proto = method.method.proto;
if (proto.parameters.isEmpty()) {
- DexType valueType = proto.returnType.toBaseType(appInfo.dexItemFactory());
+ DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
if (isEnum(valueType)) {
addDirectDependency(valueType);
}
@@ -156,13 +158,13 @@
private void addDirectDependency(DexType type) {
// Consider only component type of arrays
- type = type.toBaseType(appInfo.dexItemFactory());
+ type = type.toBaseType(appView.dexItemFactory());
if (!type.isClassType() || mainDexClassesBuilder.contains(type)) {
return;
}
- DexClass clazz = appInfo.definitionFor(type);
+ DexClass clazz = appView.definitionFor(type);
// No library classes in main-dex.
if (clazz == null || clazz.isNotProgramClass()) {
return;