From 5a1787b3d37cf44cb3e45ed9e82b6594b36f7b70 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Sat, 7 Jan 2023 01:13:22 +0000 Subject: [PATCH] Use ART Service OptimizePackageDoneCallback. Add the callback when the ART Manager is initialized, and move the CompilerStats code into it. This moves the ART Manager initialization code from SystemServer to DexOptHelper to keep it more contained, and it also fixes a small bug where an ArtManagerLocal instance was created and registered even when ART Service shouldn't be in use. Also remove TODO for controlDexOptBlocking handling when ART Service is in use. It got marked with LegacyDexoptDisabledException, so it's moot to support in that mode. Test: Boot Bug: 251903639 Bug: 260072740 Change-Id: Id0995ef9f24ee007207ee0d1f7d2108fa81b15aa --- .../com/android/server/pm/DexOptHelper.java | 59 ++++++++++++++----- .../java/com/android/server/SystemServer.java | 6 +- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index 8402e5a300ae0..96f4715744a0d 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -41,6 +41,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.app.ActivityManager; import android.app.AppGlobals; +import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; import android.content.pm.SharedLibraryInfo; @@ -84,8 +85,10 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; @@ -524,7 +527,6 @@ public final class DexOptHelper { return Optional.empty(); } - // TODO(b/251903639): Either remove controlDexOptBlocking, or don't ignore it here. OptimizeResult result; try { result = artManager.optimizePackage(snapshot, options.getPackageName(), params); @@ -533,21 +535,6 @@ public final class DexOptHelper { return Optional.empty(); } - // TODO(b/251903639): Move this to ArtManagerLocal.addOptimizePackageDoneCallback when - // it is implemented. - for (OptimizeResult.PackageOptimizeResult pkgRes : result.getPackageOptimizeResults()) { - PackageState ps = snapshot.getPackageState(pkgRes.getPackageName()); - AndroidPackage ap = ps != null ? ps.getAndroidPackage() : null; - if (ap != null) { - CompilerStats.PackageStats stats = mPm.getOrCreateCompilerPackageStats(ap); - for (OptimizeResult.DexContainerFileOptimizeResult dexRes : - pkgRes.getDexContainerFileOptimizeResults()) { - stats.setCompileTime( - dexRes.getDexContainerFile(), dexRes.getDex2oatWallTimeMillis()); - } - } - } - return Optional.of(convertToDexOptResult(result)); } } @@ -967,6 +954,46 @@ public final class DexOptHelper { } } + private static class OptimizePackageDoneHandler + implements ArtManagerLocal.OptimizePackageDoneCallback { + @NonNull private final PackageManagerService mPm; + + OptimizePackageDoneHandler(@NonNull PackageManagerService pm) { mPm = pm; } + + /** + * Called after every package optimization operation done by {@link ArtManagerLocal}. + */ + @Override + public void onOptimizePackageDone(@NonNull OptimizeResult result) { + for (OptimizeResult.PackageOptimizeResult pkgRes : result.getPackageOptimizeResults()) { + CompilerStats.PackageStats stats = + mPm.getOrCreateCompilerPackageStats(pkgRes.getPackageName()); + for (OptimizeResult.DexContainerFileOptimizeResult dexRes : + pkgRes.getDexContainerFileOptimizeResults()) { + stats.setCompileTime( + dexRes.getDexContainerFile(), dexRes.getDex2oatWallTimeMillis()); + } + } + } + } + + /** + * Initializes {@link ArtManagerLocal} before {@link getArtManagerLocal} is called. + */ + public static void initializeArtManagerLocal( + @NonNull Context systemContext, @NonNull PackageManagerService pm) { + if (!useArtService()) { + return; + } + + ArtManagerLocal artManager = new ArtManagerLocal(systemContext); + // There doesn't appear to be any checks that @NonNull is heeded, so use requireNonNull + // below to ensure we don't store away a null that we'll fail on later. + artManager.addOptimizePackageDoneCallback(false /* onlyIncludeUpdates */, + Runnable::run, new OptimizePackageDoneHandler(Objects.requireNonNull(pm))); + LocalManagerRegistry.addManager(ArtManagerLocal.class, artManager); + } + /** * Returns {@link ArtManagerLocal} if ART Service should be used for package optimization. */ diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 5b9460a226bb9..db0913b1ffcef 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -108,7 +108,6 @@ import com.android.internal.widget.LockSettingsInternal; import com.android.server.am.ActivityManagerService; import com.android.server.ambientcontext.AmbientContextManagerService; import com.android.server.appbinding.AppBindingService; -import com.android.server.art.ArtManagerLocal; import com.android.server.art.ArtModuleServiceInitializer; import com.android.server.art.DexUseManagerLocal; import com.android.server.attention.AttentionManagerService; @@ -132,8 +131,8 @@ import com.android.server.display.DisplayManagerService; import com.android.server.display.color.ColorDisplayService; import com.android.server.dreams.DreamManagerService; import com.android.server.emergency.EmergencyAffordanceService; -import com.android.server.grammaticalinflection.GrammaticalInflectionService; import com.android.server.gpu.GpuService; +import com.android.server.grammaticalinflection.GrammaticalInflectionService; import com.android.server.graphics.fonts.FontManagerService; import com.android.server.hdmi.HdmiControlService; import com.android.server.incident.IncidentCompanionService; @@ -163,6 +162,7 @@ import com.android.server.pm.ApexSystemServiceInfo; import com.android.server.pm.BackgroundInstallControlService; import com.android.server.pm.CrossProfileAppsService; import com.android.server.pm.DataLoaderManagerService; +import com.android.server.pm.DexOptHelper; import com.android.server.pm.DynamicCodeLoggingService; import com.android.server.pm.Installer; import com.android.server.pm.LauncherAppsService; @@ -2770,7 +2770,7 @@ public final class SystemServer implements Dumpable { t.traceEnd(); t.traceBegin("ArtManagerLocal"); - LocalManagerRegistry.addManager(ArtManagerLocal.class, new ArtManagerLocal(context)); + DexOptHelper.initializeArtManagerLocal(context, mPackageManagerService); t.traceEnd(); if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB)) {