From 84e99020aa7be6067ded85c979bad91dde77e340 Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Wed, 20 Nov 2019 15:40:45 +0000 Subject: [PATCH] Allow registration of observers without specifying packages This is a prerequisite for integrating RescueParty into PackageWatchdog. Currently, an observer may only be registered for an existing ObserverInternal, and the only way to add an ObserverInternal to mAllObservers is to supply a set of packages. Observers are pruned if they do not contain any packages. Change this by adding a method to the PackageHealthObserver interface to indicate whether an observer may process failures without an explicit set of packages to monitor. Test: atest PackageWatchdogTest Bug: 136135457 Change-Id: Ic97f5d9892af949fe5bbc71ecf4b429f569964e9 --- .../com/android/server/PackageWatchdog.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index e2fe76e94db3b..2915257401931 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -200,7 +200,8 @@ public class PackageWatchdog { } /** - * Registers {@code observer} to listen for package failures + * Registers {@code observer} to listen for package failures. Add a new ObserverInternal for + * this observer if it does not already exist. * *

Observers are expected to call this on boot. It does not specify any packages but * it will resume observing any packages requested from a previous boot. @@ -210,6 +211,11 @@ public class PackageWatchdog { ObserverInternal internalObserver = mAllObservers.get(observer.getName()); if (internalObserver != null) { internalObserver.registeredObserver = observer; + } else { + internalObserver = new ObserverInternal(observer.getName(), new ArrayList<>()); + internalObserver.registeredObserver = observer; + mAllObservers.put(observer.getName(), internalObserver); + syncState("added new observer"); } } } @@ -415,6 +421,14 @@ public class PackageWatchdog { * watchdog may drop observing packages with the old name. */ String getName(); + + /** + * An observer will not be pruned if this is set, even if the observer is not explicitly + * monitoring any packages. + */ + default boolean isPersistent() { + return false; + } } long getTriggerFailureCount() { @@ -626,7 +640,8 @@ public class PackageWatchdog { if (!failedPackages.isEmpty()) { onHealthCheckFailed(observer, failedPackages); } - if (observer.packages.isEmpty()) { + if (observer.packages.isEmpty() && (observer.registeredObserver == null + || !observer.registeredObserver.isPersistent())) { Slog.i(TAG, "Discarding observer " + observer.name + ". All packages expired"); it.remove(); }