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

Commit 4b44ad30 authored by Songchun Fan's avatar Songchun Fan
Browse files

[AppsFilter] skip recompute mQueriesViaComponent for snapshot

With lazy recomputeComponentVisibility, it's possible that snapshots
would need to do the recomputation and this leads to duplicated work
because the changes are not reflected in other snapshots.

BUG: 228712570
Test: tradefed.sh run google/continuous/boottime-successive
Test: saves about 200ms-500ms total boot time on my local build
Test: saves about 300ms on forrest boot time test
Change-Id: I533b99f0e10ae68594df08b4cdd67b908ac4ef89
parent 5990b7f6
Loading
Loading
Loading
Loading
+52 −9
Original line number Diff line number Diff line
@@ -189,6 +189,8 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable

    private final Object mCacheLock = new Object();

    private final boolean mIsSnapshot;

    /**
     * This structure maps uid -> uid and indicates whether access from the first should be
     * filtered to the second. It's essentially a cache of the
@@ -322,6 +324,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
                mProtectedBroadcasts, mProtectedBroadcasts, "AppsFilter.mProtectedBroadcasts");

        mSnapshot = makeCache();
        mIsSnapshot = false;
    }

    /**
@@ -360,6 +363,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
        mBackgroundExecutor = null;
        mSnapshot = new SnapshotCache.Sealed<>();
        mSystemReady = orig.mSystemReady;
        mIsSnapshot = true;
    }

    /**
@@ -1136,6 +1140,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
            }
        }
        mQueriesViaComponentRequireRecompute = false;
        onChanged();
    }

    /**
@@ -1405,6 +1410,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
        }
    }

    @SuppressWarnings("GuardedBy")
    private boolean shouldFilterApplicationInternal(PackageDataSnapshot snapshot, int callingUid,
            Object callingSetting, PackageStateInternal targetPkgSetting, int targetUserId) {
        if (DEBUG_TRACING) {
@@ -1563,10 +1569,19 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
                if (DEBUG_TRACING) {
                    Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaComponent");
                }
                if (mQueriesViaComponentRequireRecompute) {
                    recomputeComponentVisibility(snapshot.getPackageStates());
                    onChanged();
                if (!mQueriesViaComponentRequireRecompute) {
                    synchronized (mLock) {
                        if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
                            if (DEBUG_LOGGING) {
                                log(callingSetting, targetPkgSetting, "queries component");
                            }
                            return false;
                        }
                    }
                } else { // mQueriesViaComponent is stale
                    if (!mIsSnapshot) {
                        // Only recompute mQueriesViaComponent if not in snapshot
                        recomputeComponentVisibility(snapshot.getPackageStates());
                        synchronized (mLock) {
                            if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
                                if (DEBUG_LOGGING) {
@@ -1575,6 +1590,34 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
                                return false;
                            }
                        }
                    } else {
                        // Do no recompute or use mQueriesViaComponent if it's stale in snapshot
                        // Since we know we are in the snapshot, no need to acquire mLock because
                        // mProtectedBroadcasts will not change
                        if (callingPkgSetting != null) {
                            if (callingPkgSetting.getPkg() != null
                                    && canQueryViaComponents(callingPkgSetting.getPkg(), targetPkg,
                                    mProtectedBroadcasts)) {
                                if (DEBUG_LOGGING) {
                                    log(callingSetting, targetPkgSetting, "queries component");
                                }
                                return false;
                            }
                        } else {
                            for (int i = callingSharedPkgSettings.size() - 1; i >= 0; i--) {
                                final AndroidPackage pkg =
                                        callingSharedPkgSettings.valueAt(i).getPkg();
                                if (pkg != null && canQueryViaComponents(pkg, targetPkg,
                                        mProtectedBroadcasts)) {
                                    if (DEBUG_LOGGING) {
                                        log(callingSetting, targetPkgSetting, "queries component");
                                    }
                                    return false;
                                }
                            }
                        }
                    }
                }
            } finally {
                if (DEBUG_TRACING) {
                    Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);