Run enqueuer in a method to ensure it can be gc'ed
This reduces the miniumum required memory for compiling both r8 and youtube by approx 3%
Change-Id: Ifb469beeda2889a26e147fe9225c1542582481d1
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 19a0118..1ce3316 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -59,6 +59,7 @@
import com.android.tools.r8.shaking.DefaultTreePrunerConfiguration;
import com.android.tools.r8.shaking.DiscardedChecker;
import com.android.tools.r8.shaking.Enqueuer;
+import com.android.tools.r8.shaking.Enqueuer.Mode;
import com.android.tools.r8.shaking.EnqueuerFactory;
import com.android.tools.r8.shaking.MainDexClasses;
import com.android.tools.r8.shaking.MainDexListBuilder;
@@ -311,30 +312,12 @@
options.getProguardConfiguration().getRules(), synthesizedProguardRules))
.run(executorService));
- Enqueuer enqueuer = EnqueuerFactory.createForInitialTreeShaking(appView);
-
- if (appView.options().enableInitializedClassesInInstanceMethodsAnalysis) {
- enqueuer.registerAnalysis(new InitializedClassesInInstanceMethodsAnalysis(appView));
- }
- if (appView.options().assertionProcessing != AssertionProcessing.LEAVE) {
- enqueuer.registerAnalysis(
- new ClassInitializerAssertionEnablingAnalysis(
- appView.dexItemFactory(), OptimizationFeedbackSimple.getInstance()));
- }
-
- AppView<AppInfoWithLiveness> appViewWithLiveness =
- appView.setAppInfo(
- enqueuer.traceApplication(
- appView.rootSet(),
- options.getProguardConfiguration().getDontWarnPatterns(),
- executorService,
- timing));
+ AppView<AppInfoWithLiveness> appViewWithLiveness = runEnqueuer(executorService, appView);
assert appView.rootSet().verifyKeptFieldsAreAccessedAndLive(appViewWithLiveness.appInfo());
assert appView.rootSet().verifyKeptMethodsAreTargetedAndLive(appViewWithLiveness.appInfo());
assert appView.rootSet().verifyKeptTypesAreLive(appViewWithLiveness.appInfo());
appView.rootSet().checkAllRulesAreUsed(options);
-
if (options.proguardSeedsConsumer != null) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
PrintStream out = new PrintStream(bytes);
@@ -349,7 +332,9 @@
// Mark dead proto extensions fields as neither being read nor written. This step must
// run prior to the tree pruner.
appView.withGeneratedExtensionRegistryShrinker(
- shrinker -> shrinker.run(enqueuer.getMode()));
+ shrinker -> {
+ shrinker.run(Mode.INITIAL_TREE_SHAKING);
+ });
TreePruner pruner = new TreePruner(appViewWithLiveness);
application = pruner.run(application);
@@ -812,6 +797,27 @@
}
}
+ private AppView<AppInfoWithLiveness> runEnqueuer(ExecutorService executorService,
+ AppView<AppInfoWithSubtyping> appView) throws ExecutionException {
+ Enqueuer enqueuer = EnqueuerFactory.createForInitialTreeShaking(appView);
+
+ if (appView.options().enableInitializedClassesInInstanceMethodsAnalysis) {
+ enqueuer.registerAnalysis(new InitializedClassesInInstanceMethodsAnalysis(appView));
+ }
+ if (appView.options().assertionProcessing != AssertionProcessing.LEAVE) {
+ enqueuer.registerAnalysis(
+ new ClassInitializerAssertionEnablingAnalysis(
+ appView.dexItemFactory(), OptimizationFeedbackSimple.getInstance()));
+ }
+
+ return appView.setAppInfo(
+ enqueuer.traceApplication(
+ appView.rootSet(),
+ options.getProguardConfiguration().getDontWarnPatterns(),
+ executorService,
+ timing));
+ }
+
static void processWhyAreYouKeepingAndCheckDiscarded(
RootSet rootSet,
Supplier<Iterable<DexProgramClass>> classes,