summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGavin Corkery <gavincorkery@google.com>2020-06-01 23:06:23 +0100
committerGavin Corkery <gavincorkery@google.com>2020-06-01 23:11:07 +0100
commitac7b17b98d56ecc6dfac434f63bd9979c24b60df (patch)
tree3ac4c4d6f151687b5f4e35c8c2a698c6502dad09
parent75bda7880bee6b4b2c38b42aa529c21f3954cb13 (diff)
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
-rw-r--r--services/core/java/com/android/server/PackageWatchdog.java9
-rw-r--r--tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java1
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<String> 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<Set> expectedSyncRequests = List.of(
+ Set.of(),
Set.of(APP_A),
Set.of(APP_A, APP_B),
Set.of(APP_A, APP_B, APP_C),