Revert "Load all library and program classes when running R8"
This reverts commit b3f9e6a55091618444ea4b1ab3774c82f7edfcde.
This causes test failures.
Change-Id: Ie71974bd7bcd3358d94dc2daa02e613323c4f5de
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 012c4a4..e4f1c8c 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -7,7 +7,6 @@
package com.android.tools.r8.graph;
import com.android.tools.r8.ProgramResourceProvider;
-import com.android.tools.r8.graph.LazyLoadedDexApplication.AllClasses;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.utils.ProgramClassCollection;
import com.android.tools.r8.utils.Timing;
@@ -22,11 +21,9 @@
public class DirectMappedDexApplication extends DexApplication {
- private final AllClasses allClasses;
private final ImmutableMap<DexType, DexLibraryClass> libraryClasses;
private DirectMappedDexApplication(ClassNameMapper proguardMap,
- AllClasses allClasses,
ProgramClassCollection programClasses,
ImmutableList<ProgramResourceProvider> programResourceProviders,
ImmutableMap<DexType, DexLibraryClass> libraryClasses,
@@ -35,7 +32,6 @@
Timing timing) {
super(proguardMap, programClasses, programResourceProviders, mainDexList, deadCode,
dexItemFactory, highestSortingString, timing);
- this.allClasses = allClasses;
this.libraryClasses = libraryClasses;
}
@@ -96,21 +92,17 @@
public static class Builder extends DexApplication.Builder<Builder> {
- private final AllClasses allClasses;
private final List<DexLibraryClass> libraryClasses = new ArrayList<>();
Builder(LazyLoadedDexApplication application) {
super(application);
// As a side-effect, this will force-load all classes.
- this.allClasses = application.loadAllClasses();
- Map<DexType, DexClass> allClasses = this.allClasses.getClasses();
- // TODO(120884788): This filter will only add library classes which are not program classes.
+ Map<DexType, DexClass> allClasses = application.getFullClassMap();
Iterables.filter(allClasses.values(), DexLibraryClass.class).forEach(libraryClasses::add);
}
private Builder(DirectMappedDexApplication application) {
super(application);
- this.allClasses = application.allClasses;
this.libraryClasses.addAll(application.libraryClasses.values());
}
@@ -124,7 +116,6 @@
// Rebuild the map. This will fail if keys are not unique.
return new DirectMappedDexApplication(
proguardMap,
- allClasses,
ProgramClassCollection.create(
programClasses, ProgramClassCollection::resolveClassConflictImpl),
ImmutableList.copyOf(programResourceProviders),
diff --git a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
index 6dea825..b648e41 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -55,67 +55,31 @@
return clazz;
}
- static class AllClasses {
- private Map<DexType, DexClass> libraryClasses;
- private Map<DexType, DexClass> classpathClasses;
- private Map<DexType, DexClass> programClasses;
- private Map<DexType, DexClass> classes;
+ private Map<DexType, DexClass> forceLoadAllClasses() {
+ Map<DexType, DexClass> loaded = new IdentityHashMap<>();
- AllClasses(
- LibraryClassCollection libraryClasses,
- ClasspathClassCollection classpathClasses,
- ProgramClassCollection programClasses) {
- load(libraryClasses, classpathClasses, programClasses);
+ // Program classes are supposed to be loaded, but force-loading them is no-op.
+ programClasses.forceLoad(type -> true);
+ programClasses.getAllClasses().forEach(clazz -> loaded.put(clazz.type, clazz));
- // Collect loaded classes in the precedence order program classes, class path classes and
- // library classes.
- // TODO(b/120884788): Change this.
- classes = new IdentityHashMap<>();
- classes.putAll(this.programClasses);
- if (classpathClasses != null) {
- classpathClasses.getAllClasses().forEach(clazz -> classes.putIfAbsent(clazz.type, clazz));
- }
- if (libraryClasses != null) {
- libraryClasses.getAllClasses().forEach(clazz -> classes.putIfAbsent(clazz.type, clazz));
- }
+ if (classpathClasses != null) {
+ classpathClasses.forceLoad(type -> !loaded.containsKey(type));
+ classpathClasses.getAllClasses().forEach(clazz -> loaded.putIfAbsent(clazz.type, clazz));
}
- public Map<DexType, DexClass> getLibraryClasses() {
- return libraryClasses;
+ if (libraryClasses != null) {
+ libraryClasses.forceLoad(type -> !loaded.containsKey(type));
+ libraryClasses.getAllClasses().forEach(clazz -> loaded.putIfAbsent(clazz.type, clazz));
}
- public Map<DexType, DexClass> getClasspathClasses() {
- return classpathClasses;
- }
-
- public Map<DexType, DexClass> getClasses() {
- return classes;
- }
-
- private void load(
- LibraryClassCollection libraryClasses,
- ClasspathClassCollection classpathClasses,
- ProgramClassCollection programClasses) {
- if (libraryClasses != null) {
- libraryClasses.forceLoad(type -> true);
- this.libraryClasses = libraryClasses.getAllClassesInMap();
- }
- if (classpathClasses != null) {
- classpathClasses.forceLoad(type -> true);
- this.classpathClasses = classpathClasses.getAllClassesInMap();
- }
- assert programClasses != null;
- // Program classes are supposed to be loaded, but force-loading them is no-op.
- programClasses.forceLoad(type -> true);
- this.programClasses = programClasses.getAllClassesInMap();
- }
+ return loaded;
}
/**
* Force load all classes and return type -> class map containing all the classes.
*/
- public AllClasses loadAllClasses() {
- return new AllClasses(libraryClasses, classpathClasses, programClasses);
+ public Map<DexType, DexClass> getFullClassMap() {
+ return forceLoadAllClasses();
}
public static class Builder extends DexApplication.Builder<Builder> {
diff --git a/src/main/java/com/android/tools/r8/utils/ClassMap.java b/src/main/java/com/android/tools/r8/utils/ClassMap.java
index 33c1bf3..0ebfb9d 100644
--- a/src/main/java/com/android/tools/r8/utils/ClassMap.java
+++ b/src/main/java/com/android/tools/r8/utils/ClassMap.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.ClassKind;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Iterator;
@@ -135,18 +134,6 @@
return loadedClasses;
}
- public Map<DexType, DexClass> getAllClassesInMap() {
- if (classProvider.get() != null) {
- throw new Unreachable("Getting all classes from not fully loaded collection.");
- }
- ImmutableMap.Builder<DexType, DexClass> builder = ImmutableMap.builder();
- // This is fully loaded, so the class map will no longer change.
- for (Map.Entry<DexType, Supplier<T>> entry : classes.entrySet()) {
- builder.put(entry.getKey(), entry.getValue().get());
- }
- return builder.build();
- }
-
public Iterable<DexType> getAllTypes() {
return classes.keySet();
}