Merge "Add hibernation NPE check and unhibernate only if hibernating" into sc-v2-dev am: fdd7b1a075
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16374644 Change-Id: I86abe904a35ba229ec3047619563b0827c55815f
This commit is contained in:
@@ -24310,24 +24310,24 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
|
||||
true /* checkShell */, "stop package");
|
||||
boolean shouldUnhibernate = false;
|
||||
// writer
|
||||
synchronized (mLock) {
|
||||
final PackageSetting ps = mSettings.getPackageLPr(packageName);
|
||||
if (ps != null && ps.getStopped(userId) && !stopped) {
|
||||
shouldUnhibernate = true;
|
||||
}
|
||||
if (!shouldFilterApplicationLocked(ps, callingUid, userId)
|
||||
&& mSettings.setPackageStoppedStateLPw(this, packageName, stopped, userId)) {
|
||||
scheduleWritePackageRestrictionsLocked(userId);
|
||||
}
|
||||
}
|
||||
if (shouldUnhibernate) {
|
||||
// If this would cause the app to leave force-stop, then also make sure to unhibernate the
|
||||
// app if needed.
|
||||
if (!stopped) {
|
||||
mHandler.post(() -> {
|
||||
AppHibernationManagerInternal ah =
|
||||
mInjector.getLocalService(AppHibernationManagerInternal.class);
|
||||
ah.setHibernatingForUser(packageName, userId, false);
|
||||
ah.setHibernatingGlobally(packageName, false);
|
||||
if (ah != null && ah.isHibernatingForUser(packageName, userId)) {
|
||||
ah.setHibernatingForUser(packageName, userId, false);
|
||||
ah.setHibernatingGlobally(packageName, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.android.server.apphibernation.AppHibernationManagerInternal
|
||||
import com.android.server.apphibernation.AppHibernationService
|
||||
import com.android.server.extendedtestutils.wheneverStatic
|
||||
import com.android.server.testutils.whenever
|
||||
import org.junit.Assert
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Before
|
||||
@@ -100,8 +101,11 @@ class PackageManagerServiceHibernationTests {
|
||||
rule.system().dataAppDirectory)
|
||||
val pm = createPackageManagerService()
|
||||
rule.system().validateFinalState()
|
||||
val ps = pm.getPackageSetting(TEST_PACKAGE_NAME)
|
||||
ps!!.setStopped(true, TEST_USER_ID)
|
||||
|
||||
TestableLooper.get(this).processAllMessages()
|
||||
|
||||
whenever(appHibernationManager.isHibernatingForUser(TEST_PACKAGE_NAME, TEST_USER_ID))
|
||||
.thenReturn(true)
|
||||
|
||||
pm.setPackageStoppedState(TEST_PACKAGE_NAME, false, TEST_USER_ID)
|
||||
|
||||
@@ -111,6 +115,31 @@ class PackageManagerServiceHibernationTests {
|
||||
verify(appHibernationManager).setHibernatingGlobally(TEST_PACKAGE_NAME, false)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testExitForceStop_nonExistingAppHibernationManager_doesNotThrowException() {
|
||||
whenever(rule.mocks().injector.getLocalService(AppHibernationManagerInternal::class.java))
|
||||
.thenReturn(null)
|
||||
|
||||
rule.system().stageScanExistingPackage(
|
||||
TEST_PACKAGE_NAME,
|
||||
1L,
|
||||
rule.system().dataAppDirectory)
|
||||
val pm = createPackageManagerService()
|
||||
rule.system().validateFinalState()
|
||||
|
||||
TestableLooper.get(this).processAllMessages()
|
||||
|
||||
whenever(appHibernationManager.isHibernatingForUser(TEST_PACKAGE_NAME, TEST_USER_ID))
|
||||
.thenReturn(true)
|
||||
|
||||
try {
|
||||
pm.setPackageStoppedState(TEST_PACKAGE_NAME, false, TEST_USER_ID)
|
||||
TestableLooper.get(this).processAllMessages()
|
||||
} catch (e: Exception) {
|
||||
Assert.fail("Method throws exception when AppHibernationManager is not ready.\n$e")
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testGetOptimizablePackages_ExcludesGloballyHibernatingPackages() {
|
||||
rule.system().stageScanExistingPackage(
|
||||
|
||||
Reference in New Issue
Block a user