Remove various D8 related usages of DexApplication.
Bug: 149167169
Change-Id: I94fa455f16b0868f3af1a46e14507142a3940ec7
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 8def7ae..1deaf0f 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -17,6 +17,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
+import com.android.tools.r8.graph.LazyLoadedDexApplication;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis;
import com.android.tools.r8.inspector.internal.InspectorImpl;
@@ -158,6 +159,16 @@
});
}
+ private static AppView<AppInfo> readApp(
+ AndroidApp inputApp, InternalOptions options, ExecutorService executor, Timing timing)
+ throws IOException {
+ PrefixRewritingMapper rewritePrefix =
+ options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
+ LazyLoadedDexApplication app = new ApplicationReader(inputApp, options, timing).read(executor);
+ AppInfo appInfo = AppInfo.createInitialAppInfo(app);
+ return AppView.createForD8(appInfo, rewritePrefix);
+ }
+
private static void run(AndroidApp inputApp, InternalOptions options, ExecutorService executor)
throws IOException {
Timing timing = Timing.create("D8", options);
@@ -165,10 +176,7 @@
// Disable global optimizations.
options.disableGlobalOptimizations();
- DexApplication app = new ApplicationReader(inputApp, options, timing).read(executor);
- PrefixRewritingMapper rewritePrefix =
- options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
- AppInfo appInfo = AppInfo.createInitialAppInfo(app);
+ AppView<AppInfo> appView = readApp(inputApp, options, executor, timing);
final CfgPrinter printer = options.printCfg ? new CfgPrinter() : null;
@@ -177,9 +185,9 @@
// enabling code.
ClassInitializerAssertionEnablingAnalysis analysis =
new ClassInitializerAssertionEnablingAnalysis(
- appInfo.dexItemFactory(), OptimizationFeedbackSimple.getInstance());
+ appView.dexItemFactory(), OptimizationFeedbackSimple.getInstance());
ThreadUtils.processItems(
- appInfo.classes(),
+ appView.appInfo().classes(),
clazz -> {
ProgramMethod classInitializer = clazz.getProgramClassInitializer();
if (classInitializer != null) {
@@ -189,14 +197,11 @@
executor);
}
- AppView<?> appView = AppView.createForD8(appInfo, rewritePrefix);
-
if (options.testing.enableD8ResourcesPassThrough) {
appView.setAppServices(AppServices.builder(appView).build());
}
- IRConverter converter = new IRConverter(appView, timing, printer);
- app = converter.convert(app, executor);
+ new IRConverter(appView, timing, printer).convert(appView, executor);
if (options.printCfg) {
if (options.printCfgFile == null || options.printCfgFile.isEmpty()) {
@@ -223,7 +228,7 @@
// if there were class file inputs.
boolean hasClassResources = false;
boolean hasDexResources = false;
- for (DexProgramClass dexProgramClass : app.classes()) {
+ for (DexProgramClass dexProgramClass : appView.appInfo().classes()) {
if (dexProgramClass.originatesFromClassResource()) {
hasClassResources = true;
if (hasDexResources) {
@@ -237,16 +242,16 @@
}
}
Marker marker = options.getMarker(Tool.D8);
- Set<Marker> markers = new HashSet<>(app.dexItemFactory.extractMarkers());
+ Set<Marker> markers = new HashSet<>(appView.dexItemFactory().extractMarkers());
if (marker != null && hasClassResources) {
markers.add(marker);
}
Marker.checkCompatibleDesugaredLibrary(markers, options.reporter);
- InspectorImpl.runInspections(options.outputInspections, app);
+ InspectorImpl.runInspections(options.outputInspections, appView.appInfo().classes());
if (options.isGeneratingClassFiles()) {
new CfApplicationWriter(
- app,
+ appView.appInfo().app(),
appView,
options,
marker,
@@ -256,7 +261,6 @@
.write(options.getClassFileConsumer());
} else {
NamingLens namingLens;
- DexApplication finalApp = app;
if (!hasDexResources || !hasClassResources || !appView.rewritePrefix.isRewriting()) {
// All inputs are either dex or cf, or there is nothing to rewrite.
namingLens =
@@ -271,11 +275,14 @@
// desugared library only on cf inputs. We cannot easily rewrite part of the program
// without iterating again the IR. We fall-back to writing one app with rewriting and
// merging it with the other app in rewriteNonDexInputs.
- finalApp = rewriteNonDexInputs(appView, inputApp, options, executor, timing, app);
+ DexApplication app =
+ rewriteNonDexInputs(
+ appView, inputApp, options, executor, timing, appView.appInfo().app());
+ appView.setAppInfo(new AppInfo(app, appView.appInfo().getSyntheticItems().commit(app)));
namingLens = NamingLens.getIdentityLens();
}
new ApplicationWriter(
- finalApp,
+ appView.appInfo().app(),
appView,
options,
marker == null ? null : ImmutableList.copyOf(markers),
@@ -353,17 +360,12 @@
return finalDexApp.build();
}
- static DexApplication optimize(
- DexApplication application,
- AppInfo appInfo,
- InternalOptions options,
- Timing timing,
- ExecutorService executor)
+ static void optimize(
+ AppView<AppInfo> appView, InternalOptions options, Timing timing, ExecutorService executor)
throws IOException, ExecutionException {
final CfgPrinter printer = options.printCfg ? new CfgPrinter() : null;
- IRConverter converter = new IRConverter(appInfo, timing, printer);
- application = converter.convert(application, executor);
+ new IRConverter(appView, timing, printer).convert(appView, executor);
if (options.printCfg) {
if (options.printCfgFile == null || options.printCfgFile.isEmpty()) {
@@ -376,7 +378,6 @@
}
}
}
- return application;
}
static class ConvertedCfFiles implements DexIndexedConsumer, ProgramResourceProvider {
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index 8e6c389..49ab77b 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.dex.ApplicationWriter;
import com.android.tools.r8.dex.Marker;
import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.GraphLens;
@@ -90,15 +91,15 @@
null,
executor,
new DexFileMergerHelper(inputOrdering)::keepFirstProgramClassConflictResolver);
- AppInfo appInfo = AppInfo.createInitialAppInfo(app);
- app = D8.optimize(app, appInfo, options, timing, executor);
+ AppView<AppInfo> appView = AppView.createForD8(AppInfo.createInitialAppInfo(app));
+ D8.optimize(appView, options, timing, executor);
- List<Marker> markers = app.dexItemFactory.extractMarkers();
+ List<Marker> markers = appView.dexItemFactory().extractMarkers();
assert !options.hasMethodsFilter();
ApplicationWriter writer =
new ApplicationWriter(
- app,
+ appView.appInfo().app(),
null,
options,
markers,
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
index b7ece81..7203f8e 100644
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.dex.ApplicationWriter;
import com.android.tools.r8.dex.Marker;
import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.GraphLens;
@@ -87,7 +88,8 @@
// Run d8 optimize to ensure jumbo strings are handled.
AppInfo appInfo = AppInfo.createInitialAppInfo(featureApp);
- featureApp = D8.optimize(featureApp, appInfo, options, timing, executor);
+ AppView<AppInfo> appView = AppView.createForD8(appInfo);
+ D8.optimize(appView, options, timing, executor);
// We create a specific consumer for each split.
Path outputDir = Paths.get(output).resolve(entry.getKey());
if (!Files.exists(outputDir)) {
@@ -97,7 +99,7 @@
try {
new ApplicationWriter(
- featureApp,
+ appView.appInfo().app(),
null,
options,
markers,
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java
index 99a87d3..d9e4013 100644
--- a/src/main/java/com/android/tools/r8/L8.java
+++ b/src/main/java/com/android/tools/r8/L8.java
@@ -119,29 +119,19 @@
// on it.
options.enableLoadStoreOptimization = false;
- LazyLoadedDexApplication lazyApp =
- new ApplicationReader(inputApp, options, timing).read(executor);
-
- PrefixRewritingMapper rewritePrefix =
- options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
-
- DexApplication app = new L8TreePruner(options).prune(lazyApp, rewritePrefix);
- AppInfo appInfo = AppInfo.createInitialAppInfo(app);
-
- AppView<?> appView = AppView.createForL8(appInfo, rewritePrefix);
- IRConverter converter = new IRConverter(appView, timing);
+ AppView<AppInfo> appView = readApp(inputApp, options, executor, timing);
if (!options.testing.disableL8AnnotationRemoval) {
AnnotationRemover.clearAnnotations(appView);
}
- app = converter.convert(app, executor);
- assert appView.appInfo() == appInfo;
+
+ new IRConverter(appView, timing).convert(appView, executor);
NamingLens namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView);
- new GenericSignatureRewriter(appView, namingLens).run(appInfo.classes(), executor);
+ new GenericSignatureRewriter(appView, namingLens).run(appView.appInfo().classes(), executor);
new CfApplicationWriter(
- app,
+ appView.appInfo().app(),
appView,
options,
options.getMarker(Tool.L8),
@@ -161,6 +151,19 @@
}
}
+ private static AppView<AppInfo> readApp(
+ AndroidApp inputApp, InternalOptions options, ExecutorService executor, Timing timing)
+ throws IOException {
+ LazyLoadedDexApplication lazyApp =
+ new ApplicationReader(inputApp, options, timing).read(executor);
+
+ PrefixRewritingMapper rewritePrefix =
+ options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
+
+ DexApplication app = new L8TreePruner(options).prune(lazyApp, rewritePrefix);
+ return AppView.createForL8(AppInfo.createInitialAppInfo(app), rewritePrefix);
+ }
+
private static void run(String[] args) throws CompilationFailedException {
L8Command command = L8Command.parse(args, CommandLineOrigin.INSTANCE).build();
if (command.isPrintHelp()) {
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 38e1556..e49bedf 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -209,7 +209,6 @@
static void writeApplication(
ExecutorService executorService,
- DexApplication application,
AppView<?> appView,
GraphLens graphLens,
InitClassLens initClassLens,
@@ -217,7 +216,7 @@
InternalOptions options,
ProguardMapSupplier proguardMapSupplier)
throws ExecutionException {
- InspectorImpl.runInspections(options.outputInspections, application);
+ InspectorImpl.runInspections(options.outputInspections, appView.appInfo().classes());
try {
Marker marker = options.getMarker(Tool.R8);
assert marker != null;
@@ -227,11 +226,17 @@
markers.remove(marker);
if (options.isGeneratingClassFiles()) {
new CfApplicationWriter(
- application, appView, options, marker, graphLens, namingLens, proguardMapSupplier)
+ appView.appInfo().app(),
+ appView,
+ options,
+ marker,
+ graphLens,
+ namingLens,
+ proguardMapSupplier)
.write(options.getClassFileConsumer());
} else {
new ApplicationWriter(
- application,
+ appView.appInfo().app(),
appView,
options,
// Ensure that the marker for this compilation is the first in the list.
@@ -905,7 +910,6 @@
// Generate the resulting application resources.
writeApplication(
executorService,
- appView.appInfo().app(),
appView,
appView.graphLens(),
appView.initClassLens(),
diff --git a/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java b/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java
index c3d8a64..72e322f 100644
--- a/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java
+++ b/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.inspector.internal;
-import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.inspector.ClassInspector;
import com.android.tools.r8.inspector.Inspector;
@@ -29,25 +28,25 @@
}
public static void runInspections(
- List<Consumer<InspectorImpl>> inspections, DexApplication application) {
+ List<Consumer<InspectorImpl>> inspections, Collection<DexProgramClass> classes) {
if (inspections == null || inspections.isEmpty()) {
return;
}
- InspectorImpl inspector = new InspectorImpl(application);
+ InspectorImpl inspector = new InspectorImpl(classes);
for (Consumer<InspectorImpl> inspection : inspections) {
inspection.accept(inspector);
}
}
- private final DexApplication application;
+ private final Collection<DexProgramClass> classes;
- public InspectorImpl(DexApplication application) {
- this.application = application;
+ public InspectorImpl(Collection<DexProgramClass> classes) {
+ this.classes = classes;
}
@Override
public void forEachClass(Consumer<ClassInspector> inspection) {
- for (DexProgramClass clazz : application.classes()) {
+ for (DexProgramClass clazz : classes) {
inspection.accept(new ClassInspectorImpl(clazz));
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 61a2f18..b838429 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -470,12 +470,12 @@
}
}
- public DexApplication convert(DexApplication application, ExecutorService executor)
+ public void convert(AppView<AppInfo> appView, ExecutorService executor)
throws ExecutionException {
removeLambdaDeserializationMethods();
workaroundAbstractMethodOnNonAbstractClassVerificationBug(
executor, OptimizationFeedbackIgnore.getInstance());
-
+ DexApplication application = appView.appInfo().app();
timing.begin("IR conversion");
ThreadUtils.processItems(application.classes(), this::convertMethods, executor);
@@ -496,7 +496,8 @@
handleSynthesizedClassMapping(builder);
timing.end();
- return builder.build();
+ DexApplication app = builder.build();
+ appView.setAppInfo(new AppInfo(app, appView.appInfo().getSyntheticItems().commit(app)));
}
private void handleSynthesizedClassMapping(Builder<?> builder) {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 9b83a88fa2..7de9a9a 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -16,6 +16,7 @@
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.AssemblyWriter;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexItemFactory;
@@ -2086,12 +2087,11 @@
return builder;
}
- public static void writeApplication(DexApplication application, InternalOptions options)
+ public static void writeApplication(AppView<?> appView, InternalOptions options)
throws ExecutionException {
R8.writeApplication(
Executors.newSingleThreadExecutor(),
- application,
- null,
+ appView,
GraphLens.getIdentityLens(),
InitClassLens.getDefault(),
NamingLens.getIdentityLens(),
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index a031cf8..b351ca2 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -100,9 +100,10 @@
return iterator;
}
- private AndroidApp writeDex(DexApplication application, InternalOptions options) {
+ private AndroidApp writeDex() {
try {
- ToolHelper.writeApplication(application, options);
+ InternalOptions options = appView.options();
+ ToolHelper.writeApplication(appView, options);
options.signalFinishedToConsumers();
return consumers.build();
} catch (ExecutionException e) {
@@ -114,7 +115,7 @@
Timing timing = Timing.empty();
IRConverter converter = new IRConverter(appView, timing, null, MainDexClasses.NONE);
converter.replaceCodeForTesting(method, code);
- AndroidApp app = writeDex(application, appView.options());
+ AndroidApp app = writeDex();
return runOnArtRaw(app, DEFAULT_MAIN_CLASS_NAME).stdout;
}
}