Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 240daf67 authored by nathch's avatar nathch
Browse files

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
parent 6de7a3a3
Loading
Loading
Loading
Loading
+19 −10
Original line number Diff line number Diff line
@@ -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);