From 240daf679b8f0b53820380c0504f3829a3b6824a Mon Sep 17 00:00:00 2001 From: nathch Date: Wed, 24 Jul 2019 01:07:12 +0100 Subject: [PATCH] Unsubscribe listeners when stopping UserBackupManagerService Unsubscribe listeners as otherwise they schedule work on a stopped handler thread after the user backup manager service is stopped This also ensures that any dangling wakelocks are released when they are garbage collected This was already done in master in ag/8036218 Test: atest CtsBackupTestCases CtsBackupHostTestCases Test: m RunBackupFrameworksServicesRoboTests && atest RunBackupFrameworksServicesRoboTests Test: blaze run -- //experimental/users/nathch/py/bug_repros:repro 136264323 -m w_codechange followed by "adb shell kill -10 pid" (where pid = "adb shell pgrep system_server") to force GC see in logs: PowerManager: WakeLock finalized while still held: *backup*-0 Test: blaze run -- //experimental/users/nathch/py/bug_repros:repro 136264323 -m backup_w_codechange followed by same as above Bug: 136264323 Bug: 135261178 Change-Id: I769d750a46faa3d28634d302e0f8e18cce41a744 --- .../backup/UserBackupManagerService.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index c0af99c305422..e24eaa50377a4 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -367,6 +367,9 @@ public class UserBackupManagerService { private long mCurrentToken = 0; @Nullable private File mAncestralSerialNumberFile; + private final ContentObserver mSetupObserver; + private final BroadcastReceiver mRunBackupReceiver; + private final BroadcastReceiver mRunInitReceiver; /** * Creates an instance of {@link UserBackupManagerService} and initializes state for it. This @@ -493,11 +496,11 @@ public class UserBackupManagerService { mAutoRestore = Settings.Secure.getIntForUser(resolver, Settings.Secure.BACKUP_AUTO_RESTORE, 1, userId) != 0; - ContentObserver setupObserver = new SetupObserver(this, mBackupHandler); + mSetupObserver = new SetupObserver(this, mBackupHandler); resolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), /* notifyForDescendents */ false, - setupObserver, + mSetupObserver, mUserId); mBaseStateDir = checkNotNull(baseStateDir, "baseStateDir cannot be null"); @@ -516,21 +519,21 @@ public class UserBackupManagerService { mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng); // Receivers for scheduled backups and transport initialization operations. - BroadcastReceiver runBackupReceiver = new RunBackupReceiver(this); + mRunBackupReceiver = new RunBackupReceiver(this); IntentFilter filter = new IntentFilter(); filter.addAction(RUN_BACKUP_ACTION); context.registerReceiverAsUser( - runBackupReceiver, + mRunBackupReceiver, UserHandle.of(userId), filter, android.Manifest.permission.BACKUP, /* scheduler */ null); - BroadcastReceiver runInitReceiver = new RunInitializeReceiver(this); + mRunInitReceiver = new RunInitializeReceiver(this); filter = new IntentFilter(); filter.addAction(RUN_INITIALIZE_ACTION); context.registerReceiverAsUser( - runInitReceiver, + mRunInitReceiver, UserHandle.of(userId), filter, android.Manifest.permission.BACKUP, @@ -599,6 +602,12 @@ public class UserBackupManagerService { /** Cleans up state when the user of this service is stopped. */ void tearDownService() { + mAgentTimeoutParameters.stop(); + mConstants.stop(); + mContext.getContentResolver().unregisterContentObserver(mSetupObserver); + mContext.unregisterReceiver(mRunBackupReceiver); + mContext.unregisterReceiver(mRunInitReceiver); + mContext.unregisterReceiver(mPackageTrackingReceiver); mUserBackupThread.quit(); } @@ -747,7 +756,7 @@ public class UserBackupManagerService { @VisibleForTesting BroadcastReceiver getPackageTrackingReceiver() { - return mBroadcastReceiver; + return mPackageTrackingReceiver; } @Nullable @@ -874,7 +883,7 @@ public class UserBackupManagerService { filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addDataScheme("package"); mContext.registerReceiverAsUser( - mBroadcastReceiver, + mPackageTrackingReceiver, UserHandle.of(mUserId), filter, /* broadcastPermission */ null, @@ -885,7 +894,7 @@ public class UserBackupManagerService { sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); mContext.registerReceiverAsUser( - mBroadcastReceiver, + mPackageTrackingReceiver, UserHandle.of(mUserId), sdFilter, /* broadcastPermission */ null, @@ -1158,7 +1167,7 @@ public class UserBackupManagerService { * A {@link BroadcastReceiver} tracking changes to packages and sd cards in order to update our * internal bookkeeping. */ - private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + private BroadcastReceiver mPackageTrackingReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (MORE_DEBUG) { Slog.d(TAG, "Received broadcast " + intent);