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
This commit is contained in:
@@ -588,29 +588,32 @@ 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) {
|
||||
final boolean changed = mImplicitlyQueryable.add(recipientUid, visibleUid);
|
||||
if (changed && DEBUG_LOGGING) {
|
||||
Slog.i(TAG, "implicit access granted: " + recipientUid + " -> " + visibleUid);
|
||||
}
|
||||
synchronized (mCacheLock) {
|
||||
if (mShouldFilterCache != null) {
|
||||
// update the cache in a one-off manner since we've got all the information we
|
||||
// need.
|
||||
SparseBooleanArray visibleUids = mShouldFilterCache.get(recipientUid);
|
||||
if (visibleUids == null) {
|
||||
visibleUids = new SparseBooleanArray();
|
||||
mShouldFilterCache.put(recipientUid, visibleUids);
|
||||
}
|
||||
visibleUids.put(visibleUid, false);
|
||||
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);
|
||||
}
|
||||
synchronized (mCacheLock) {
|
||||
if (mShouldFilterCache != null) {
|
||||
// update the cache in a one-off manner since we've got all the information we
|
||||
// need.
|
||||
SparseBooleanArray visibleUids = mShouldFilterCache.get(recipientUid);
|
||||
if (visibleUids == null) {
|
||||
visibleUids = new SparseBooleanArray();
|
||||
mShouldFilterCache.put(recipientUid, visibleUids);
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
onChanged();
|
||||
visibleUids.put(visibleUid, false);
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
onChanged();
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
public void onSystemReady() {
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user