diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/DexOptHelper.java | 59 | ||||
| -rw-r--r-- | services/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 8402e5a300ae..96f4715744a0 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 5b9460a226bb..db0913b1ffce 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)) { |