From 368b304f6dbfc675c7910557cda79b7cbefbee49 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Tue, 10 Jan 2023 23:46:44 +0000 Subject: [PATCH] Schedule the background dexopt job in ART Service if it should be used. Test: atest -a CtsCompilationTestCases Test: Build with dalvik.vm.useartservice=true adb shell cmd jobscheduler get-job-state android 27873780 > waiting adb shell cmd jobscheduler run android 27873780 Check logcat that artd compiles packages. Bug: 251903639 Change-Id: Idb9117d36a163a94ce2048e8030b7071e3e9ca81 --- .../server/pm/BackgroundDexOptService.java | 7 +++-- .../com/android/server/pm/DexOptHelper.java | 2 ++ .../server/pm/PackageManagerService.java | 28 ++++++++++++++----- .../pm/PackageManagerServiceInjector.java | 5 +++- .../pm/PackageManagerServiceTestParams.java | 2 +- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index 9785d478a6d10..837b4db714bb5 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -189,13 +189,14 @@ public final class BackgroundDexOptService { void onPackagesUpdated(ArraySet updatedPackages); } - public BackgroundDexOptService( - Context context, DexManager dexManager, PackageManagerService pm) { + public BackgroundDexOptService(Context context, DexManager dexManager, PackageManagerService pm) + throws LegacyDexoptDisabledException { this(new Injector(context, dexManager, pm)); } @VisibleForTesting - public BackgroundDexOptService(Injector injector) { + public BackgroundDexOptService(Injector injector) throws LegacyDexoptDisabledException { + Installer.checkLegacyDexoptDisabled(); mInjector = injector; mDexOptHelper = mInjector.getDexOptHelper(); LocalServices.addService(BackgroundDexOptService.class, this); diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index cf447a75ea86f..a7d0cd23dc1c2 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -997,6 +997,8 @@ public final class DexOptHelper { artManager.addOptimizePackageDoneCallback(false /* onlyIncludeUpdates */, Runnable::run, new OptimizePackageDoneHandler(Objects.requireNonNull(pm))); LocalManagerRegistry.addManager(ArtManagerLocal.class, artManager); + + artManager.scheduleBackgroundDexoptJob(); } /** diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 92bbb7e863279..174dfa4269215 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -789,8 +789,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService final ArtManagerService mArtManagerService; + // TODO(b/260124949): Remove these. final PackageDexOptimizer mPackageDexOptimizer; - final BackgroundDexOptService mBackgroundDexOptService; + @Nullable + final BackgroundDexOptService mBackgroundDexOptService; // null when ART Service is in use. // DexManager handles the usage of dex files (e.g. secondary files, whether or not a package // is used by other apps). private final DexManager mDexManager; @@ -1567,7 +1569,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService new DefaultSystemWrapper(), LocalServices::getService, context::getSystemService, - (i, pm) -> new BackgroundDexOptService(i.getContext(), i.getDexManager(), pm), + (i, pm) -> { + if (useArtService()) { + return null; + } + try { + return new BackgroundDexOptService(i.getContext(), i.getDexManager(), pm); + } catch (LegacyDexoptDisabledException e) { + throw new RuntimeException(e); + } + }, (i, pm) -> IBackupManager.Stub.asInterface(ServiceManager.getService( Context.BACKUP_SERVICE)), (i, pm) -> new SharedLibrariesImpl(pm, i), @@ -4287,11 +4298,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService } }); - // TODO(b/251903639): Call into ART Service. - try { - mBackgroundDexOptService.systemReady(); - } catch (LegacyDexoptDisabledException e) { - throw new RuntimeException(e); + if (!useArtService()) { + // The background dexopt job is scheduled in DexOptHelper.initializeArtManagerLocal when + // ART Service is in use. + try { + mBackgroundDexOptService.systemReady(); + } catch (LegacyDexoptDisabledException e) { + throw new RuntimeException(e); + } } // Prune unused static shared libraries which have been cached a period of time diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java index eb033cb343d4b..13549f536c9f9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java @@ -16,6 +16,7 @@ package com.android.server.pm; +import android.annotation.Nullable; import android.app.ActivityManagerInternal; import android.app.backup.IBackupManager; import android.content.ComponentName; @@ -138,7 +139,8 @@ public class PackageManagerServiceInjector { private final Singleton mDomainVerificationManagerInternalProducer; private final Singleton mHandlerProducer; - private final Singleton mBackgroundDexOptService; + private final Singleton + mBackgroundDexOptService; // TODO(b/260124949): Remove this. private final Singleton mIBackupManager; private final Singleton mSharedLibrariesProducer; private final Singleton mCrossProfileIntentFilterHelperProducer; @@ -408,6 +410,7 @@ public class PackageManagerServiceInjector { return getLocalService(ActivityManagerInternal.class); } + @Nullable public BackgroundDexOptService getBackgroundDexOptService() { return mBackgroundDexOptService.get(this, mPackageManager); } diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java index 0c617aef1ed63..08ff51d0f1abe 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java @@ -106,7 +106,7 @@ public final class PackageManagerServiceTestParams { public boolean isEngBuild; public boolean isUserDebugBuild; public int sdkInt = Build.VERSION.SDK_INT; - public BackgroundDexOptService backgroundDexOptService; + public @Nullable BackgroundDexOptService backgroundDexOptService; public final String incrementalVersion = Build.VERSION.INCREMENTAL; public BroadcastHelper broadcastHelper; public AppDataHelper appDataHelper;