From ac7b17b98d56ecc6dfac434f63bd9979c24b60df Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Mon, 1 Jun 2020 23:06:23 +0100 Subject: Unbind explicit health check controller when possible Ensure that calls to sync requests with the explicit health check controller are always sent if the list of packages pending health checks is empty, so that the controller can unbind. This will allow extservices to be killed by lmkd on low memory devices. Test: atest PackageWatchdogTest Test: atest NetworkStagedRollbackTest Test: check logcat to see that the service is unbound Bug: 156323728 Change-Id: If615a337760b2057b962284bde8565b593d82a50 --- services/core/java/com/android/server/PackageWatchdog.java | 9 ++++++--- .../src/com/android/server/PackageWatchdogTest.java | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index e77458cc955a..fd7abfa65c86 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -239,7 +239,10 @@ public class PackageWatchdog { mIsPackagesReady = true; mHealthCheckController.setCallbacks(packageName -> onHealthCheckPassed(packageName), packages -> onSupportedPackages(packages), - () -> syncRequestsAsync()); + () -> { + syncRequestsAsync(); + mSyncRequired = true; + }); setPropertyChangedListenerLocked(); updateConfigs(); registerConnectivityModuleHealthListener(); @@ -255,7 +258,6 @@ public class PackageWatchdog { */ public void registerHealthObserver(PackageHealthObserver observer) { synchronized (mLock) { - mSyncRequired = true; ObserverInternal internalObserver = mAllObservers.get(observer.getName()); if (internalObserver != null) { internalObserver.registeredObserver = observer; @@ -642,7 +644,8 @@ public class PackageWatchdog { synchronized (mLock) { if (mIsPackagesReady) { Set packages = getPackagesPendingHealthChecksLocked(); - if (!packages.equals(mRequestedHealthCheckPackages) || mSyncRequired) { + if (mSyncRequired || !packages.equals(mRequestedHealthCheckPackages) + || packages.isEmpty()) { syncRequired = true; mRequestedHealthCheckPackages = packages; } diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java index d011dbbbe5db..ae93a81f274e 100644 --- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java @@ -1113,6 +1113,7 @@ public class PackageWatchdogTest { mTestLooper.dispatchAll(); List expectedSyncRequests = List.of( + Set.of(), Set.of(APP_A), Set.of(APP_A, APP_B), Set.of(APP_A, APP_B, APP_C), -- cgit v1.2.3-59-g8ed1b