diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2dcc8d93abe44..3f61bd48fd1c4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12271,19 +12271,18 @@ public class PackageManagerService extends IPackageManager.Stub public ArraySet getOptimizablePackages() { ArraySet pkgs = new ArraySet<>(); - final boolean hibernationEnabled = AppHibernationService.isAppHibernationEnabled(); - AppHibernationManagerInternal appHibernationManager = - mInjector.getLocalService(AppHibernationManagerInternal.class); synchronized (mLock) { for (AndroidPackage p : mPackages.values()) { - // Checking hibernation state is an inexpensive call. - boolean isHibernating = hibernationEnabled - && appHibernationManager.isHibernatingGlobally(p.getPackageName()); - if (PackageDexOptimizer.canOptimizePackage(p) && !isHibernating) { + if (PackageDexOptimizer.canOptimizePackage(p)) { pkgs.add(p.getPackageName()); } } } + if (AppHibernationService.isAppHibernationEnabled()) { + AppHibernationManagerInternal appHibernationManager = + mInjector.getLocalService(AppHibernationManagerInternal.class); + pkgs.removeIf(pkgName -> appHibernationManager.isHibernatingGlobally(pkgName)); + } return pkgs; } @@ -23464,10 +23463,12 @@ public class PackageManagerService extends IPackageManager.Stub } } if (shouldUnhibernate) { - AppHibernationManagerInternal ah = - mInjector.getLocalService(AppHibernationManagerInternal.class); - ah.setHibernatingForUser(packageName, userId, false); - ah.setHibernatingGlobally(packageName, false); + mHandler.post(() -> { + AppHibernationManagerInternal ah = + mInjector.getLocalService(AppHibernationManagerInternal.class); + ah.setHibernatingForUser(packageName, userId, false); + ah.setHibernatingGlobally(packageName, false); + }); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt index 46487ea279598..411c31c97120b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt @@ -17,8 +17,12 @@ package com.android.server.pm import android.os.Build +import android.os.Handler import android.provider.DeviceConfig import android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper import com.android.server.apphibernation.AppHibernationManagerInternal import com.android.server.extendedtestutils.wheneverStatic import com.android.server.testutils.whenever @@ -28,12 +32,12 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.junit.runners.JUnit4 import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations -@RunWith(JUnit4::class) +@RunWith(AndroidTestingRunner::class) +@RunWithLooper class PackageManagerServiceHibernationTests { companion object { @@ -60,6 +64,8 @@ class PackageManagerServiceHibernationTests { rule.system().stageNominalSystemState() whenever(rule.mocks().injector.getLocalService(AppHibernationManagerInternal::class.java)) .thenReturn(appHibernationManager) + whenever(rule.mocks().injector.handler) + .thenReturn(Handler(TestableLooper.get(this).looper)) } @Test @@ -74,6 +80,9 @@ class PackageManagerServiceHibernationTests { ps!!.setStopped(true, TEST_USER_ID) pm.setPackageStoppedState(TEST_PACKAGE_NAME, false, TEST_USER_ID) + + TestableLooper.get(this).processAllMessages() + verify(appHibernationManager).setHibernatingForUser(TEST_PACKAGE_NAME, TEST_USER_ID, false) verify(appHibernationManager).setHibernatingGlobally(TEST_PACKAGE_NAME, false) }