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

Commit 53e15887 authored by Songchun Fan's avatar Songchun Fan Committed by Automerger Merge Worker
Browse files

Merge "[AppsFilter] fix cache lock and rebuild cache if needed" into tm-dev...

Merge "[AppsFilter] fix cache lock and rebuild cache if needed" into tm-dev am: cd1a10a2 am: 20d964f2

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18360458



Change-Id: I649ece9767ed99ef11160c34b310e2625881f061
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 87370813 20d964f2
Loading
Loading
Loading
Loading
+41 −10
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.SigningDetails;
import android.os.Binder;
import android.os.Handler;
import android.os.Process;
import android.os.Trace;
import android.os.UserHandle;
@@ -53,7 +54,7 @@ import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * AppsFilter is the entity responsible for filtering visibility between apps based on declarations
@@ -68,6 +69,11 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
    protected static final boolean DEBUG_LOGGING = false;
    public static final boolean DEBUG_TRACING = false;

    // Allow some time for cache rebuilds.
    protected static final int CACHE_REBUILD_DELAY_MIN_MS = 10000;
    // With each new rebuild the delay doubles until it reaches max delay.
    protected static final int CACHE_REBUILD_DELAY_MAX_MS = 10000;

    /**
     * This contains a list of app UIDs that are implicitly queryable because another app explicitly
     * interacted with it. For example, if application A starts a service in application B,
@@ -122,10 +128,10 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
    protected SnapshotCache<WatchedSparseSetArray<Integer>> mQueryableViaUsesLibrarySnapshot;

    /**
     * Executor for running reasonably short background tasks such as building the initial
     * Handler for running reasonably short background tasks such as building the initial
     * visibility cache.
     */
    protected Executor mBackgroundExecutor;
    protected Handler mBackgroundHandler;

    /**
     * Pending full recompute of mQueriesViaComponent. Occurs when a package adds a new set of
@@ -133,7 +139,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
     * computationally expensive recomputing.
     * Full recompute is done lazily at the point when we use mQueriesViaComponent to filter apps.
     */
    protected boolean mQueriesViaComponentRequireRecompute = false;
    protected AtomicBoolean mQueriesViaComponentRequireRecompute = new AtomicBoolean(false);

    /**
     * A set of App IDs that are always queryable by any package, regardless of their manifest
@@ -173,7 +179,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
     * {@link #shouldFilterApplicationInternal(PackageDataSnapshot, int, Object,
     * PackageStateInternal, int)} call.
     * NOTE: It can only be relied upon after the system is ready to avoid unnecessary update on
     * initial scam and is empty until {@link #mSystemReady} is true.
     * initial scam and is empty until {@link #mCacheReady} is true.
     */
    @NonNull
    @Watched
@@ -181,7 +187,11 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
    @NonNull
    protected SnapshotCache<WatchedSparseBooleanMatrix> mShouldFilterCacheSnapshot;

    protected volatile boolean mSystemReady = false;
    protected volatile boolean mCacheReady = false;

    protected static final boolean CACHE_VALID = true;
    protected static final boolean CACHE_INVALID = false;
    protected AtomicBoolean mCacheValid = new AtomicBoolean(CACHE_INVALID);

    protected boolean isForceQueryable(int callingAppId) {
        return mForceQueryable.contains(callingAppId);
@@ -312,7 +322,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
                    || callingAppId == targetPkgSetting.getAppId()) {
                return false;
            }
            if (mSystemReady) { // use cache
            if (mCacheReady) { // use cache
                if (!shouldFilterApplicationUsingCache(callingUid,
                        targetPkgSetting.getAppId(),
                        userId)) {
@@ -506,7 +516,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
                if (DEBUG_TRACING) {
                    Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaComponent");
                }
                if (!mQueriesViaComponentRequireRecompute) {
                if (!mQueriesViaComponentRequireRecompute.get()) {
                    if (isQueryableViaComponent(callingAppId, targetAppId)) {
                        if (DEBUG_LOGGING) {
                            log(callingSetting, targetPkgSetting, "queries component");
@@ -702,17 +712,34 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
            }
        }
        pw.println("  system apps queryable: " + mSystemAppsQueryable);
        dumpQueryables(pw, filteringAppId, users, expandPackages);
        dumpForceQueryable(pw, filteringAppId, expandPackages);
        dumpQueriesViaPackage(pw, filteringAppId, expandPackages);
        dumpQueriesViaComponent(pw, filteringAppId, expandPackages);
        dumpQueriesViaImplicitlyQueryable(pw, filteringAppId, users, expandPackages);
        dumpQueriesViaUsesLibrary(pw, filteringAppId, expandPackages);
    }

    protected void dumpQueryables(PrintWriter pw, @Nullable Integer filteringAppId, int[] users,
    protected void dumpForceQueryable(PrintWriter pw, @Nullable Integer filteringAppId,
            ToString<Integer> expandPackages) {
        pw.println("  queries via forceQueryable:");
        dumpPackageSet(pw, filteringAppId, mForceQueryable.untrackedStorage(),
                "forceQueryable", "  ", expandPackages);
    }

    protected void dumpQueriesViaPackage(PrintWriter pw, @Nullable Integer filteringAppId,
            ToString<Integer> expandPackages) {
        pw.println("  queries via package name:");
        dumpQueriesMap(pw, filteringAppId, mQueriesViaPackage, "    ", expandPackages);
    }

    protected void dumpQueriesViaComponent(PrintWriter pw, @Nullable Integer filteringAppId,
            ToString<Integer> expandPackages) {
        pw.println("  queries via component:");
        dumpQueriesMap(pw, filteringAppId, mQueriesViaComponent, "    ", expandPackages);
    }

    protected void dumpQueriesViaImplicitlyQueryable(PrintWriter pw,
            @Nullable Integer filteringAppId, int[] users, ToString<Integer> expandPackages) {
        pw.println("  queryable via interaction:");
        for (int user : users) {
            pw.append("    User ").append(Integer.toString(user)).println(":");
@@ -723,6 +750,10 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
                    filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId),
                    mRetainedImplicitlyQueryable, "      ", expandPackages);
        }
    }

    protected void dumpQueriesViaUsesLibrary(PrintWriter pw, @Nullable Integer filteringAppId,
            ToString<Integer> expandPackages) {
        pw.println("  queryable via uses-library:");
        dumpQueriesMap(pw, filteringAppId, mQueryableViaUsesLibrary, "    ",
                expandPackages);
+167 −95
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.SigningDetails;
import android.content.pm.UserInfo;
import android.os.Handler;
import android.os.Trace;
import android.os.UserHandle;
import android.provider.DeviceConfig;
@@ -70,7 +71,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;

/**
 * Implementation of the methods that update the internal structures of AppsFilter. Because of the
@@ -83,7 +83,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
     * A cached snapshot.
     */
    @NonNull
    private SnapshotCache<AppsFilterSnapshot> mSnapshot;
    private final SnapshotCache<AppsFilterSnapshot> mSnapshot;

    /**
     * Watchable machinery
@@ -142,18 +142,24 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        dispatchChange(this);
    }

    private void invalidateCache(String reason) {
        if (mCacheValid.compareAndSet(CACHE_VALID, CACHE_INVALID)) {
            Slog.i(TAG, "Invalidating cache: " + reason);
        }
    }

    @VisibleForTesting(visibility = PRIVATE)
    AppsFilterImpl(FeatureConfig featureConfig,
            String[] forceQueryableList,
            boolean systemAppsQueryable,
            @Nullable OverlayReferenceMapper.Provider overlayProvider,
            Executor backgroundExecutor) {
            Handler backgroundHandler) {
        mFeatureConfig = featureConfig;
        mForceQueryableByDevicePackageNames = forceQueryableList;
        mSystemAppsQueryable = systemAppsQueryable;
        mOverlayReferenceMapper = new OverlayReferenceMapper(true /*deferRebuild*/,
                overlayProvider);
        mBackgroundExecutor = backgroundExecutor;
        mBackgroundHandler = backgroundHandler;
        mShouldFilterCache = new WatchedSparseBooleanMatrix();
        mShouldFilterCacheSnapshot = new SnapshotCache.Auto<>(
                mShouldFilterCache, mShouldFilterCache, "AppsFilter.mShouldFilterCache");
@@ -371,7 +377,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        }
        AppsFilterImpl appsFilter = new AppsFilterImpl(featureConfig,
                forcedQueryablePackageNames, forceSystemAppsQueryable, null,
                injector.getBackgroundExecutor());
                injector.getBackgroundHandler());
        featureConfig.setAppsFilter(appsFilter);
        return appsFilter;
    }
@@ -394,7 +400,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            return false;
        }
        final boolean changed;
        synchronized (mLock) {
        synchronized (mImplicitlyQueryableLock) {
            changed = retainOnUpdate
                    ? mRetainedImplicitlyQueryable.add(recipientUid, visibleUid)
                    : mImplicitlyQueryable.add(recipientUid, visibleUid);
@@ -404,12 +410,13 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                    + recipientUid + " -> " + visibleUid);
        }

        if (mSystemReady) {
        if (mCacheReady) {
            synchronized (mCacheLock) {
                // update the cache in a one-off manner since we've got all the information we
                // need.
                // Update the cache in a one-off manner since we've got all the information we need.
                mShouldFilterCache.put(recipientUid, visibleUid, false);
            }
        } else if (changed) {
            invalidateCache("grantImplicitAccess: " + recipientUid + " -> " + visibleUid);
        }
        onChanged();
        return changed;
@@ -420,7 +427,6 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        mFeatureConfig.onSystemReady();

        updateEntireShouldFilterCacheAsync(pmInternal);
        mSystemReady = true;
    }

    /**
@@ -444,7 +450,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            final UserInfo[] users = snapshot.getUserInfos();
            final ArraySet<String> additionalChangedPackages =
                    addPackageInternal(newPkgSetting, settings);
            if (mSystemReady) {
            if (mCacheReady) {
                synchronized (mCacheLock) {
                    updateShouldFilterCacheForPackage(snapshot, null, newPkgSetting,
                            settings, users, USER_ALL, settings.size());
@@ -463,7 +469,9 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                        }
                    }
                }
            } // else, rebuild entire cache when system is ready
            } else {
                invalidateCache("addPackage: " + newPkgSetting.getPackageName());
            }
        } finally {
            onChanged();
            if (DEBUG_TRACING) {
@@ -486,7 +494,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            // packages for signature matches
            for (PackageStateInternal setting : existingSettings.values()) {
                if (isSystemSigned(mSystemSigningDetails, setting)) {
                    synchronized (mLock) {
                    synchronized (mForceQueryableLock) {
                        mForceQueryable.add(setting.getAppId());
                    }
                }
@@ -498,13 +506,18 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            return null;
        }

        synchronized (mLock) {
            if (mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts())) {
                mQueriesViaComponentRequireRecompute = true;
        final boolean protectedBroadcastsChanged;
        synchronized (mProtectedBroadcastsLock) {
            protectedBroadcastsChanged =
                    mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts());
        }
        if (protectedBroadcastsChanged) {
            mQueriesViaComponentRequireRecompute.set(true);
        }

            final boolean newIsForceQueryable =
                    mForceQueryable.contains(newPkgSetting.getAppId())
        final boolean newIsForceQueryable;
        synchronized (mForceQueryableLock) {
            newIsForceQueryable = mForceQueryable.contains(newPkgSetting.getAppId())
                            /* shared user that is already force queryable */
                            || newPkgSetting.isForceQueryableOverride() /* adb override */
                            || (newPkgSetting.isSystem() && (mSystemAppsQueryable
@@ -516,6 +529,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                    && isSystemSigned(mSystemSigningDetails, newPkgSetting))) {
                mForceQueryable.add(newPkgSetting.getAppId());
            }
        }

        for (int i = existingSettings.size() - 1; i >= 0; i--) {
            final PackageStateInternal existingSetting = existingSettings.valueAt(i);
@@ -527,47 +541,65 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            final AndroidPackage existingPkg = existingSetting.getPkg();
            // let's evaluate the ability of already added packages to see this new package
            if (!newIsForceQueryable) {
                    if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(existingPkg,
                            newPkg, mProtectedBroadcasts)) {
                if (!mQueriesViaComponentRequireRecompute.get()
                        && canQueryViaComponents(existingPkg, newPkg, mProtectedBroadcasts)) {
                    synchronized (mQueriesViaComponentLock) {
                        mQueriesViaComponent.add(existingSetting.getAppId(),
                                newPkgSetting.getAppId());
                    }
                }
                if (canQueryViaPackage(existingPkg, newPkg)
                        || canQueryAsInstaller(existingSetting, newPkg)) {
                    synchronized (mQueriesViaPackageLock) {
                        mQueriesViaPackage.add(existingSetting.getAppId(),
                                newPkgSetting.getAppId());
                    }
                }
                if (canQueryViaUsesLibrary(existingPkg, newPkg)) {
                    synchronized (mQueryableViaUsesLibraryLock) {
                        mQueryableViaUsesLibrary.add(existingSetting.getAppId(),
                                newPkgSetting.getAppId());
                    }
                }
            }
            final boolean existingIsForceQueryable;
            synchronized (mForceQueryableLock) {
                existingIsForceQueryable = mForceQueryable.contains(existingSetting.getAppId());
            }
            // now we'll evaluate our new package's ability to see existing packages
                if (!mForceQueryable.contains(existingSetting.getAppId())) {
                    if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(newPkg,
                            existingPkg, mProtectedBroadcasts)) {
            if (!existingIsForceQueryable) {
                if (!mQueriesViaComponentRequireRecompute.get()
                        && canQueryViaComponents(newPkg, existingPkg, mProtectedBroadcasts)) {
                    synchronized (mQueriesViaComponentLock) {
                        mQueriesViaComponent.add(newPkgSetting.getAppId(),
                                existingSetting.getAppId());
                    }
                }
                if (canQueryViaPackage(newPkg, existingPkg)
                        || canQueryAsInstaller(newPkgSetting, existingPkg)) {
                    synchronized (mQueriesViaPackageLock) {
                        mQueriesViaPackage.add(newPkgSetting.getAppId(),
                                existingSetting.getAppId());
                    }
                }
                if (canQueryViaUsesLibrary(newPkg, existingPkg)) {
                    synchronized (mQueryableViaUsesLibraryLock) {
                        mQueryableViaUsesLibrary.add(newPkgSetting.getAppId(),
                                existingSetting.getAppId());
                    }
                }
            }
            // if either package instruments the other, mark both as visible to one another
            if (newPkgSetting.getPkg() != null && existingSetting.getPkg() != null
                    && (pkgInstruments(newPkgSetting.getPkg(), existingSetting.getPkg())
                    || pkgInstruments(existingSetting.getPkg(), newPkgSetting.getPkg()))) {
                synchronized (mQueriesViaPackageLock) {
                    mQueriesViaPackage.add(newPkgSetting.getAppId(), existingSetting.getAppId());
                    mQueriesViaPackage.add(existingSetting.getAppId(), newPkgSetting.getAppId());
                }
            }
        }

        int existingSize = existingSettings.size();
        ArrayMap<String, AndroidPackage> existingPkgs = new ArrayMap<>(existingSize);
        for (int index = 0; index < existingSize; index++) {
@@ -586,9 +618,6 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
    }

    private void removeAppIdFromVisibilityCache(int appId) {
        if (!mSystemReady) {
            return;
        }
        synchronized (mCacheLock) {
            for (int i = 0; i < mShouldFilterCache.size(); i++) {
                if (UserHandle.getAppId(mShouldFilterCache.keyAt(i)) == appId) {
@@ -642,7 +671,17 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
    }

    private void updateEntireShouldFilterCacheAsync(PackageManagerInternal pmInternal) {
        mBackgroundExecutor.execute(() -> {
        updateEntireShouldFilterCacheAsync(pmInternal, CACHE_REBUILD_DELAY_MIN_MS);
    }

    private void updateEntireShouldFilterCacheAsync(PackageManagerInternal pmInternal,
            long delayMs) {
        mBackgroundHandler.postDelayed(() -> {
            if (!mCacheValid.compareAndSet(CACHE_INVALID, CACHE_VALID)) {
                // Cache is already valid.
                return;
            }

            final ArrayMap<String, AndroidPackage> packagesCache = new ArrayMap<>();
            final UserInfo[][] usersRef = new UserInfo[1][];
            final PackageDataSnapshot snapshot = pmInternal.snapshot();
@@ -661,18 +700,27 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,

            updateEntireShouldFilterCacheInner(snapshot, settings, usersRef[0], USER_ALL);
            onChanged();
        });

            if (!mCacheValid.compareAndSet(CACHE_VALID, CACHE_VALID)) {
                Slog.i(TAG, "Cache invalidated while building, retrying.");
                updateEntireShouldFilterCacheAsync(pmInternal,
                        Math.min(delayMs * 2, CACHE_REBUILD_DELAY_MAX_MS));
                return;
            }

            mCacheReady = true;
        }, delayMs);
    }

    public void onUserCreated(PackageDataSnapshot snapshot, int newUserId) {
        if (!mSystemReady) {
        if (!mCacheReady) {
            return;
        }
        updateEntireShouldFilterCache(snapshot, newUserId);
    }

    public void onUserDeleted(@UserIdInt int userId) {
        if (!mSystemReady) {
        if (!mCacheReady) {
            return;
        }
        removeShouldFilterCacheForUser(userId);
@@ -681,7 +729,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,

    private void updateShouldFilterCacheForPackage(PackageDataSnapshot snapshot,
            String packageName) {
        if (!mSystemReady) {
        if (!mCacheReady) {
            return;
        }
        final ArrayMap<String, ? extends PackageStateInternal> settings =
@@ -772,7 +820,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
    private void collectProtectedBroadcasts(
            ArrayMap<String, ? extends PackageStateInternal> existingSettings,
            @Nullable String excludePackage) {
        synchronized (mLock) {
        synchronized (mProtectedBroadcastsLock) {
            mProtectedBroadcasts.clear();
            for (int i = existingSettings.size() - 1; i >= 0; i--) {
                PackageStateInternal setting = existingSettings.valueAt(i);
@@ -806,8 +854,9 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
     */
    private void recomputeComponentVisibility(
            ArrayMap<String, ? extends PackageStateInternal> existingSettings) {
        synchronized (mLock) {
        synchronized (mQueriesViaComponentLock) {
            mQueriesViaComponent.clear();
        }
        for (int i = existingSettings.size() - 1; i >= 0; i--) {
            PackageStateInternal setting = existingSettings.valueAt(i);
            if (setting.getPkg() == null || requestsQueryAllPackages(setting.getPkg())) {
@@ -822,14 +871,20 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                        otherSetting.getAppId())) {
                    continue;
                }
                    if (canQueryViaComponents(setting.getPkg(), otherSetting.getPkg(),
                            mProtectedBroadcasts)) {
                final boolean canQueryViaComponents;
                synchronized (mProtectedBroadcastsLock) {
                    canQueryViaComponents = canQueryViaComponents(setting.getPkg(),
                            otherSetting.getPkg(), mProtectedBroadcasts);
                }
                if (canQueryViaComponents) {
                    synchronized (mQueriesViaComponentLock) {
                        mQueriesViaComponent.add(setting.getAppId(), otherSetting.getAppId());
                    }
                }
            }
        }
        mQueriesViaComponentRequireRecompute = false;

        mQueriesViaComponentRequireRecompute.set(false);
        onChanged();
    }

@@ -857,7 +912,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        final UserInfo[] users = snapshot.getUserInfos();
        final Collection<SharedUserSetting> sharedUserSettings = snapshot.getAllSharedUsers();
        final int userCount = users.length;
        synchronized (mLock) {
        synchronized (mImplicitlyQueryableLock) {
            for (int u = 0; u < userCount; u++) {
                final int userId = users[u].id;
                final int removingUid = UserHandle.getUid(userId, setting.getAppId());
@@ -877,37 +932,51 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                            mRetainedImplicitlyQueryable.keyAt(i), removingUid);
                }
            }
        }

            if (!mQueriesViaComponentRequireRecompute) {
        if (!mQueriesViaComponentRequireRecompute.get()) {
            synchronized (mQueriesViaComponentLock) {
                mQueriesViaComponent.remove(setting.getAppId());
                for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
                    mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i),
                            setting.getAppId());
                    mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i), setting.getAppId());
                }
            }
        }

        synchronized (mQueriesViaPackageLock) {
            mQueriesViaPackage.remove(setting.getAppId());
            for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
                mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i),
                        setting.getAppId());
            }
        }

        synchronized (mQueryableViaUsesLibraryLock) {
            mQueryableViaUsesLibrary.remove(setting.getAppId());
            for (int i = mQueryableViaUsesLibrary.size() - 1; i >= 0; i--) {
                mQueryableViaUsesLibrary.remove(mQueryableViaUsesLibrary.keyAt(i),
                        setting.getAppId());
            }
        }

        synchronized (mForceQueryableLock) {
            mForceQueryable.remove(setting.getAppId());
        }

        boolean protectedBroadcastsChanged = false;
        synchronized (mProtectedBroadcastsLock) {
            if (setting.getPkg() != null
                    && !setting.getPkg().getProtectedBroadcasts().isEmpty()) {
                final String removingPackageName = setting.getPkg().getPackageName();
                final ArrayList<String> protectedBroadcasts = new ArrayList<>();
                protectedBroadcasts.addAll(mProtectedBroadcasts.untrackedStorage());
                final ArrayList<String> protectedBroadcasts = new ArrayList<>(
                        mProtectedBroadcasts.untrackedStorage());
                collectProtectedBroadcasts(settings, removingPackageName);
                if (!mProtectedBroadcasts.containsAll(protectedBroadcasts)) {
                    mQueriesViaComponentRequireRecompute = true;
                protectedBroadcastsChanged = !mProtectedBroadcasts.containsAll(protectedBroadcasts);
            }
        }

        if (protectedBroadcastsChanged) {
            mQueriesViaComponentRequireRecompute.set(true);
        }

        additionalChangedPackages = mOverlayReferenceMapper.removePkg(setting.getPackageName());
@@ -929,8 +998,10 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            }
        }

        if (mCacheReady) {
            removeAppIdFromVisibilityCache(setting.getAppId());
        if (mSystemReady && setting.hasSharedUser()) {

            if (setting.hasSharedUser()) {
                final ArraySet<? extends PackageStateInternal> sharedUserPackages =
                        getSharedUserPackages(setting.getSharedUserAppId(), sharedUserSettings);
                for (int i = sharedUserPackages.size() - 1; i >= 0; i--) {
@@ -947,7 +1018,6 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                }
            }

        if (mSystemReady) {
            if (additionalChangedPackages != null) {
                for (int index = 0; index < additionalChangedPackages.size(); index++) {
                    String changedPackage = additionalChangedPackages.valueAt(index);
@@ -964,6 +1034,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                    }
                }
            }
        } else {
            invalidateCache("removePackage: " + setting.getPackageName());
        }
        onChanged();
    }