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
This commit is contained in:
Gavin Corkery
2020-06-01 23:06:23 +01:00
parent 75bda7880b
commit ac7b17b98d
2 changed files with 7 additions and 3 deletions

View File

@@ -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;
}

View File

@@ -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),