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

Commit d5a13b9d authored by Jackal Guo's avatar Jackal Guo
Browse files

Invalidate cached result of getPackagesForUid

In order to reduce repeating binder call, there is an optimization
to cache the query result of getPackagesForUid. However, the cached
result don't update while granting package visibility temporarily.

Bug: 167656333
Bug: 178980212
Test: atest CtsAppEnumerationTestCases
Change-Id: I35e80c89f749c5aa288689275e78580610eecb46
parent fdb069d3
Loading
Loading
Loading
Loading
+22 −19
Original line number Diff line number Diff line
@@ -588,9 +588,12 @@ public class AppsFilter implements Watchable, Snappable {
     *
     * @param recipientUid the uid gaining visibility of the {@code visibleUid}.
     * @param visibleUid   the uid becoming visible to the {@recipientUid}
     * @return {@code true} if implicit access was not already granted.
     */
    public void grantImplicitAccess(int recipientUid, int visibleUid) {
        if (recipientUid != visibleUid) {
    public boolean grantImplicitAccess(int recipientUid, int visibleUid) {
        if (recipientUid == visibleUid) {
            return false;
        }
        final boolean changed = mImplicitlyQueryable.add(recipientUid, visibleUid);
        if (changed && DEBUG_LOGGING) {
            Slog.i(TAG, "implicit access granted: " + recipientUid + " -> " + visibleUid);
@@ -610,7 +613,7 @@ public class AppsFilter implements Watchable, Snappable {
        if (changed) {
            onChanged();
        }
        }
        return changed;
    }

    public void onSystemReady() {
+17 −5
Original line number Diff line number Diff line
@@ -470,23 +470,34 @@ class InstantAppRegistry implements Watchable, Snappable {
        return instantGrantList.get(instantAppId);
    }

    /**
     * Allows an app to see an instant app.
     *
     * @param userId the userId in which this access is being granted
     * @param intent when provided, this serves as the intent that caused
     *               this access to be granted
     * @param recipientUid the uid of the app receiving visibility
     * @param instantAppId the app ID of the instant app being made visible
     *                      to the recipient
     * @return {@code true} if access is granted.
     */
    @GuardedBy("mService.mLock")
    public void grantInstantAccessLPw(@UserIdInt int userId, @Nullable Intent intent,
    public boolean grantInstantAccessLPw(@UserIdInt int userId, @Nullable Intent intent,
            int recipientUid, int instantAppId) {
        if (mInstalledInstantAppUids == null) {
            return;     // no instant apps installed; no need to grant
            return false;     // no instant apps installed; no need to grant
        }
        WatchedSparseBooleanArray instantAppList = mInstalledInstantAppUids.get(userId);
        if (instantAppList == null || !instantAppList.get(instantAppId)) {
            return;     // instant app id isn't installed; no need to grant
            return false;     // instant app id isn't installed; no need to grant
        }
        if (instantAppList.get(recipientUid)) {
            return;     // target app id is an instant app; no need to grant
            return false;     // target app id is an instant app; no need to grant
        }
        if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
            final Set<String> categories = intent.getCategories();
            if (categories != null && categories.contains(Intent.CATEGORY_BROWSABLE)) {
                return;  // launched via VIEW/BROWSABLE intent; no need to grant
                return false;  // launched via VIEW/BROWSABLE intent; no need to grant
            }
        }
        WatchedSparseArray<WatchedSparseBooleanArray> targetAppList = mInstantGrants.get(userId);
@@ -500,6 +511,7 @@ class InstantAppRegistry implements Watchable, Snappable {
            targetAppList.put(recipientUid, instantGrantList);
        }
        instantGrantList.put(instantAppId, true /*granted*/);
        return true;
    }

    @GuardedBy("mService.mLock")
+6 −2
Original line number Diff line number Diff line
@@ -27187,6 +27187,7 @@ public class PackageManagerService extends IPackageManager.Stub
                final boolean instantApp =
                        isInstantAppInternal(visiblePackage.getPackageName(), userId, visibleUid);
                final boolean accessGranted;
                if (instantApp) {
                    if (!direct) {
                        // if the interaction that lead to this granting access to an instant app
@@ -27194,10 +27195,13 @@ public class PackageManagerService extends IPackageManager.Stub
                        // grant.
                        return;
                    }
                    mInstantAppRegistry.grantInstantAccessLPw(userId, intent,
                    accessGranted = mInstantAppRegistry.grantInstantAccessLPw(userId, intent,
                            recipientAppId, UserHandle.getAppId(visibleUid) /*instantAppId*/);
                } else {
                    mAppsFilter.grantImplicitAccess(recipientUid, visibleUid);
                    accessGranted = mAppsFilter.grantImplicitAccess(recipientUid, visibleUid);
                }
                if (accessGranted) {
                    ApplicationPackageManager.invalidateGetPackagesForUidCache();
                }
            }
        }