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

Commit d7b425ff authored by Song Chun Fan's avatar Song Chun Fan Committed by TYM Tsai
Browse files

[AbstractMasterSystemService] hold PackageMonitor object

System server only holds a weak reference to PackageMonitor though PackageMonitorCallback. If there's nothing else holding on to PackageMonitor, it will get GC'd and following callbacks to it will be discarded.

Bug: 398759145
Test: manual
Flag: EXEMPT bug fix
Change-Id: Ic8bbfc20f81cc77711aeb3a3a73bba4b9a8331e8
parent 9b85e1ca
Loading
Loading
Loading
Loading
+198 −191
Original line number Diff line number Diff line
@@ -193,6 +193,8 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
    @Nullable
    private UserManagerInternal mUm;

    private final MyPackageMonitor mPackageMonitor;

    /**
     * Default constructor.
     *
@@ -289,6 +291,7 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
                }
            });
        }
        mPackageMonitor = new MyPackageMonitor(/* supportsPackageRestartQuery */ true);
        startTrackingPackageChanges();
    }

@@ -986,17 +989,20 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
        }
    }

    private void startTrackingPackageChanges() {
        final PackageMonitor monitor = new PackageMonitor(true) {
    private class MyPackageMonitor extends PackageMonitor {
        MyPackageMonitor(boolean supportsPackageRestartQuery) {
            super(supportsPackageRestartQuery);
        }

        @Override
        public void onPackageUpdateStarted(@NonNull String packageName, int uid) {
            if (verbose) Slog.v(mTag, "onPackageUpdateStarted(): " + packageName);
            synchronized (mLock) {
                final String activePackageName = getActiveServicePackageNameLocked();
                if (!packageName.equals(activePackageName)) return;

                final int userId = getChangingUserId();
                synchronized (mLock) {

                if (mUpdatingPackageNames == null) {
                    mUpdatingPackageNames = new SparseArray<String>(mServicesCacheList.size());
                }
@@ -1236,10 +1242,11 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
        private void handlePackageUpdateLocked(String packageName) {
            visitServicesLocked((s) -> s.handlePackageUpdateLocked(packageName));
        }
        };
    }

    private void startTrackingPackageChanges() {
        // package changes
        monitor.register(getContext(), null, UserHandle.ALL, true);
        mPackageMonitor.register(getContext(), null, UserHandle.ALL, true);
    }

    @GuardedBy("mLock")