summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/DexOptHelper.java59
-rw-r--r--services/java/com/android/server/SystemServer.java6
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)) {