diff options
author | 2022-11-25 23:45:11 +0000 | |
---|---|---|
committer | 2022-12-02 19:51:56 +0000 | |
commit | 60e0a00cbfecd81f39940e7cf82b4efbde1fe8c3 (patch) | |
tree | ab1842ade4696dbaf799a6f547831798a1d7b2f4 | |
parent | c2db36265a18afe740a25b23c31597a1213aa042 (diff) |
Implement compilation reason boot-after-mainline-update.
Bug: 260419279
Test: -
1. adb shell setprop pm.dexopt.boot-after-mainline-update verify
2. adb shell setprop dalvik.vm.systemuicompilerfilter speed
3. adb shell pm art optimize-packages boot-after-mainline-update
Ignore-AOSP-First: ART Services.
Change-Id: I163f808399eb27393e00dbb149d5941ff3db277f
5 files changed, 56 insertions, 6 deletions
diff --git a/libartservice/service/api/system-server-current.txt b/libartservice/service/api/system-server-current.txt index de59623cf4..bd98d1927a 100644 --- a/libartservice/service/api/system-server-current.txt +++ b/libartservice/service/api/system-server-current.txt @@ -53,6 +53,7 @@ package com.android.server.art { public class ReasonMapping { field public static final String REASON_BG_DEXOPT = "bg-dexopt"; + field public static final String REASON_BOOT_AFTER_MAINLINE_UPDATE = "boot-after-mainline-update"; field public static final String REASON_BOOT_AFTER_OTA = "boot-after-ota"; field public static final String REASON_CMDLINE = "cmdline"; field public static final String REASON_FIRST_BOOT = "first-boot"; diff --git a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java index 185d113098..dd9ae525b8 100644 --- a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java +++ b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java @@ -27,6 +27,7 @@ import static com.android.server.art.model.ArtFlags.ScheduleStatus; import static com.android.server.art.model.Config.Callback; import static com.android.server.art.model.OptimizationStatus.DexContainerFileOptimizationStatus; +import android.R; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; @@ -623,12 +624,24 @@ public final class ArtManagerLocal { private List<String> getDefaultPackages(@NonNull PackageManagerLocal.FilteredSnapshot snapshot, @NonNull @BatchOptimizeReason String reason) { var packages = new ArrayList<String>(); - // TODO(b/258818709): Filter packages by last active time. - snapshot.forAllPackageStates((pkgState) -> { - if (Utils.canOptimizePackage(pkgState, mInjector.getAppHibernationManager())) { - packages.add(pkgState.getPackageName()); - } - }); + switch (reason) { + case ReasonMapping.REASON_BOOT_AFTER_MAINLINE_UPDATE: + snapshot.forAllPackageStates((pkgState) -> { + if (mInjector.isSystemUiPackage(pkgState.getPackageName()) + && Utils.canOptimizePackage( + pkgState, mInjector.getAppHibernationManager())) { + packages.add(pkgState.getPackageName()); + } + }); + break; + default: + // TODO(b/258818709): Filter packages by last active time. + snapshot.forAllPackageStates((pkgState) -> { + if (Utils.canOptimizePackage(pkgState, mInjector.getAppHibernationManager())) { + packages.add(pkgState.getPackageName()); + } + }); + } return packages; } @@ -788,5 +801,10 @@ public final class ArtManagerLocal { return Objects.requireNonNull( LocalManagerRegistry.getManager(DexUseManagerLocal.class)); } + + @NonNull + public boolean isSystemUiPackage(@NonNull String packageName) { + return packageName.equals(mContext.getString(R.string.config_systemUi)); + } } } diff --git a/libartservice/service/java/com/android/server/art/ReasonMapping.java b/libartservice/service/java/com/android/server/art/ReasonMapping.java index c236e21506..0a44fa9168 100644 --- a/libartservice/service/java/com/android/server/art/ReasonMapping.java +++ b/libartservice/service/java/com/android/server/art/ReasonMapping.java @@ -46,6 +46,8 @@ public class ReasonMapping { public static final String REASON_FIRST_BOOT = "first-boot"; /** Optimizing apps on the next boot after an OTA. */ public static final String REASON_BOOT_AFTER_OTA = "boot-after-ota"; + /** Optimizing apps on the next boot after a mainline update. */ + public static final String REASON_BOOT_AFTER_MAINLINE_UPDATE = "boot-after-mainline-update"; /** Installing an app after user presses the "install"/"update" button. */ public static final String REASON_INSTALL = "install"; /** Optimizing apps in the background. */ @@ -77,6 +79,7 @@ public class ReasonMapping { @StringDef(prefix = "REASON_", value = { REASON_FIRST_BOOT, REASON_BOOT_AFTER_OTA, + REASON_BOOT_AFTER_MAINLINE_UPDATE, REASON_BG_DEXOPT, }) // clang-format on @@ -92,6 +95,7 @@ public class ReasonMapping { @StringDef(prefix = "REASON_", value = { REASON_FIRST_BOOT, REASON_BOOT_AFTER_OTA, + REASON_BOOT_AFTER_MAINLINE_UPDATE, }) // clang-format on @Retention(RetentionPolicy.SOURCE) @@ -152,6 +156,7 @@ public class ReasonMapping { switch (reason) { case REASON_FIRST_BOOT: case REASON_BOOT_AFTER_OTA: + case REASON_BOOT_AFTER_MAINLINE_UPDATE: return ArtFlags.PRIORITY_BOOT; case REASON_INSTALL_FAST: return ArtFlags.PRIORITY_INTERACTIVE_FAST; diff --git a/libartservice/service/java/com/android/server/art/model/ArtFlags.java b/libartservice/service/java/com/android/server/art/model/ArtFlags.java index cb5921dd73..7cd4f46679 100644 --- a/libartservice/service/java/com/android/server/art/model/ArtFlags.java +++ b/libartservice/service/java/com/android/server/art/model/ArtFlags.java @@ -154,6 +154,7 @@ public class ArtFlags { return FLAG_FOR_PRIMARY_DEX | FLAG_FOR_SECONDARY_DEX | FLAG_SHOULD_DOWNGRADE; case ReasonMapping.REASON_FIRST_BOOT: case ReasonMapping.REASON_BOOT_AFTER_OTA: + case ReasonMapping.REASON_BOOT_AFTER_MAINLINE_UPDATE: return FLAG_FOR_PRIMARY_DEX | FLAG_SHOULD_INCLUDE_DEPENDENCIES; case ReasonMapping.REASON_BG_DEXOPT: case ReasonMapping.REASON_CMDLINE: diff --git a/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java b/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java index a50c801e84..0bbbb0e17c 100644 --- a/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java +++ b/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java @@ -125,13 +125,22 @@ public class ArtManagerLocalTest { lenient().when(mInjector.getConfig()).thenReturn(mConfig); lenient().when(mInjector.getAppHibernationManager()).thenReturn(mAppHibernationManager); lenient().when(mInjector.getUserManager()).thenReturn(mUserManager); + lenient().when(mInjector.isSystemUiPackage(any())).thenReturn(false); + lenient().when(mInjector.isSystemUiPackage(PKG_NAME_SYS_UI)).thenReturn(true); lenient().when(SystemProperties.get(eq("pm.dexopt.install"))).thenReturn("speed-profile"); lenient().when(SystemProperties.get(eq("pm.dexopt.bg-dexopt"))).thenReturn("speed-profile"); lenient().when(SystemProperties.get(eq("pm.dexopt.first-boot"))).thenReturn("verify"); lenient() + .when(SystemProperties.get(eq("pm.dexopt.boot-after-mainline-update"))) + .thenReturn("verify"); + lenient() .when(SystemProperties.getInt(eq("pm.dexopt.bg-dexopt.concurrency"), anyInt())) .thenReturn(3); + lenient() + .when(SystemProperties.getInt( + eq("pm.dexopt.boot-after-mainline-update.concurrency"), anyInt())) + .thenReturn(3); // No ISA translation. lenient() @@ -354,6 +363,22 @@ public class ArtManagerLocalTest { } @Test + public void testOptimizePackagesBootAfterMainlineUpdate() throws Exception { + var result = mock(OptimizeResult.class); + var cancellationSignal = new CancellationSignal(); + + // It should only optimize system UI. + when(mDexOptHelper.dexopt( + any(), deepEq(List.of(PKG_NAME_SYS_UI)), any(), any(), any(), any(), any())) + .thenReturn(result); + + assertThat(mArtManagerLocal.optimizePackages(mSnapshot, "boot-after-mainline-update", + cancellationSignal, null /* processCallbackExecutor */, + null /* processCallback */)) + .isSameInstanceAs(result); + } + + @Test public void testOptimizePackagesOverride() throws Exception { var params = new OptimizeParams.Builder("bg-dexopt").build(); var result = mock(OptimizeResult.class); |