Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1bd1efa4 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Do not hold PM or AM locks when calling hibernation API" into sc-dev am: b2a62c4b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14102428

Change-Id: I59561617759b2d1e60e63477b11f227eb33f1600
parents 897778a4 b2a62c4b
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -12271,19 +12271,18 @@ public class PackageManagerService extends IPackageManager.Stub
    public ArraySet<String> getOptimizablePackages() {
        ArraySet<String> 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;
    }
@@ -23460,10 +23459,12 @@ public class PackageManagerService extends IPackageManager.Stub
            }
        }
        if (shouldUnhibernate) {
            mHandler.post(() -> {
                AppHibernationManagerInternal ah =
                        mInjector.getLocalService(AppHibernationManagerInternal.class);
                ah.setHibernatingForUser(packageName, userId, false);
                ah.setHibernatingGlobally(packageName, false);
            });
        }
    }
+11 −2
Original line number Diff line number Diff line
@@ -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)
    }