Unify finalization of app in D8
Change-Id: I177d04507dd59ea33548310e4b8c3758a7f1afdc
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index f80403a..f57e064 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -276,57 +276,52 @@
namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens);
namingLens = RecordRewritingNamingLens.createRecordRewritingNamingLens(appView, namingLens);
+ if (options.isGeneratingDex()
+ && hasDexResources
+ && hasClassResources
+ && appView.typeRewriter.isRewriting()) {
+ // There are both cf and dex inputs in the program, and rewriting is required for
+ // 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.
+ timing.begin("Rewrite non-dex inputs");
+ DexApplication app =
+ rewriteNonDexInputs(
+ appView, inputApp, options, executor, timing, appView.appInfo().app(), namingLens);
+ timing.end();
+ appView.setAppInfo(
+ new AppInfo(
+ appView.appInfo().getSyntheticItems().commit(app),
+ appView.appInfo().getMainDexInfo()));
+ namingLens = NamingLens.getIdentityLens();
+ } else if (options.isGeneratingDex() && hasDexResources) {
+ namingLens = NamingLens.getIdentityLens();
+ }
+
+ // Since tracing is not lens aware, this needs to be done prior to synthetic finalization
+ // which will construct a graph lens.
+ if (options.isGeneratingDex() && !options.mainDexKeepRules.isEmpty()) {
+ appView.dexItemFactory().clearTypeElementsCache();
+ MainDexInfo mainDexInfo =
+ new GenerateMainDexList(options)
+ .traceMainDex(
+ executor, appView.appInfo().app(), appView.appInfo().getMainDexInfo());
+ appView.setAppInfo(appView.appInfo().rebuildWithMainDexInfo(mainDexInfo));
+ }
+
+ finalizeApplication(appView, executor);
+
+ new GenericSignatureRewriter(appView, namingLens)
+ .runForD8(appView.appInfo().classes(), executor);
+ new KotlinMetadataRewriter(appView, namingLens).runForD8(executor);
+
if (options.isGeneratingClassFiles()) {
- finalizeApplication(appView, executor);
new CfApplicationWriter(appView, marker, namingLens)
.write(options.getClassFileConsumer(), inputApp);
} else {
- if (!hasDexResources || !hasClassResources || !appView.typeRewriter.isRewriting()) {
- // All inputs are either dex or cf, or there is nothing to rewrite.
- namingLens = hasDexResources ? NamingLens.getIdentityLens() : namingLens;
- new GenericSignatureRewriter(appView, namingLens)
- .run(appView.appInfo().classes(), executor);
- new KotlinMetadataRewriter(appView, namingLens).runForD8(executor);
- } else {
- // There are both cf and dex inputs in the program, and rewriting is required for
- // 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.
- timing.begin("Rewrite non-dex inputs");
- DexApplication app =
- rewriteNonDexInputs(
- appView,
- inputApp,
- options,
- executor,
- timing,
- appView.appInfo().app(),
- namingLens);
- timing.end();
- appView.setAppInfo(
- new AppInfo(
- appView.appInfo().getSyntheticItems().commit(app),
- appView.appInfo().getMainDexInfo()));
- namingLens = NamingLens.getIdentityLens();
- }
-
- // Since tracing is not lens aware, this needs to be done prior to synthetic finalization
- // which will construct a graph lens.
- if (!options.mainDexKeepRules.isEmpty()) {
- appView.dexItemFactory().clearTypeElementsCache();
- MainDexInfo mainDexInfo =
- new GenerateMainDexList(options)
- .traceMainDex(
- executor, appView.appInfo().app(), appView.appInfo().getMainDexInfo());
- appView.setAppInfo(appView.appInfo().rebuildWithMainDexInfo(mainDexInfo));
- }
-
- finalizeApplication(appView, executor);
-
if (options.apiModelingOptions().enableStubbingOfClasses) {
new ApiReferenceStubber(appView).run(executor);
}
-
new ApplicationWriter(
appView,
marker == null ? null : ImmutableList.copyOf(markers),
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
index bc285b7..e50737d 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -38,6 +38,14 @@
this.contextBuilder = contextBuilder;
}
+ public void runForD8(Iterable<? extends DexProgramClass> classes, ExecutorService executorService)
+ throws ExecutionException {
+ if (namingLens.isIdentityLens()) {
+ return;
+ }
+ run(classes, executorService);
+ }
+
public void run(Iterable<? extends DexProgramClass> classes, ExecutorService executorService)
throws ExecutionException {
// Rewrite signature annotations for applications that are minified or if we have liveness