Merge "Lock for AppsFilter" into tm-dev am: f5e3cd3ec6

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

Change-Id: Ie74db22e1c4d56694927b5fa3c21877ce4b25c4b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Songchun Fan
2022-04-13 01:07:06 +00:00
committed by Automerger Merge Worker

View File

@@ -103,6 +103,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
* application B is implicitly allowed to query for application A; regardless of any manifest * application B is implicitly allowed to query for application A; regardless of any manifest
* entries. * entries.
*/ */
@GuardedBy("mLock")
@Watched @Watched
private final WatchedSparseSetArray<Integer> mImplicitlyQueryable; private final WatchedSparseSetArray<Integer> mImplicitlyQueryable;
private final SnapshotCache<WatchedSparseSetArray<Integer>> mImplicitQueryableSnapshot; private final SnapshotCache<WatchedSparseSetArray<Integer>> mImplicitQueryableSnapshot;
@@ -112,6 +113,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
* interacted with it, but could keep across package updates. For example, if application A * interacted with it, but could keep across package updates. For example, if application A
* grants persistable uri permission to application B; regardless of any manifest entries. * grants persistable uri permission to application B; regardless of any manifest entries.
*/ */
@GuardedBy("mLock")
@Watched @Watched
private final WatchedSparseSetArray<Integer> mRetainedImplicitlyQueryable; private final WatchedSparseSetArray<Integer> mRetainedImplicitlyQueryable;
private final SnapshotCache<WatchedSparseSetArray<Integer>> private final SnapshotCache<WatchedSparseSetArray<Integer>>
@@ -121,6 +123,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
* A mapping from the set of App IDs that query other App IDs via package name to the * A mapping from the set of App IDs that query other App IDs via package name to the
* list of packages that they can see. * list of packages that they can see.
*/ */
@GuardedBy("mLock")
@Watched @Watched
private final WatchedSparseSetArray<Integer> mQueriesViaPackage; private final WatchedSparseSetArray<Integer> mQueriesViaPackage;
private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueriesViaPackageSnapshot; private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueriesViaPackageSnapshot;
@@ -129,6 +132,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
* A mapping from the set of App IDs that query others via component match to the list * A mapping from the set of App IDs that query others via component match to the list
* of packages that the they resolve to. * of packages that the they resolve to.
*/ */
@GuardedBy("mLock")
@Watched @Watched
private final WatchedSparseSetArray<Integer> mQueriesViaComponent; private final WatchedSparseSetArray<Integer> mQueriesViaComponent;
private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueriesViaComponentSnapshot; private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueriesViaComponentSnapshot;
@@ -137,6 +141,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
* A mapping from the set of App IDs that query other App IDs via library name to the * A mapping from the set of App IDs that query other App IDs via library name to the
* list of packages that they can see. * list of packages that they can see.
*/ */
@GuardedBy("mLock")
@Watched @Watched
private final WatchedSparseSetArray<Integer> mQueryableViaUsesLibrary; private final WatchedSparseSetArray<Integer> mQueryableViaUsesLibrary;
private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueryableViaUsesLibrarySnapshot; private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueryableViaUsesLibrarySnapshot;
@@ -159,6 +164,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
* A set of App IDs that are always queryable by any package, regardless of their manifest * A set of App IDs that are always queryable by any package, regardless of their manifest
* content. * content.
*/ */
@GuardedBy("mLock")
@Watched @Watched
private final WatchedArraySet<Integer> mForceQueryable; private final WatchedArraySet<Integer> mForceQueryable;
private final SnapshotCache<WatchedArraySet<Integer>> mForceQueryableSnapshot; private final SnapshotCache<WatchedArraySet<Integer>> mForceQueryableSnapshot;
@@ -176,6 +182,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
private final StateProvider mStateProvider; private final StateProvider mStateProvider;
private SigningDetails mSystemSigningDetails; private SigningDetails mSystemSigningDetails;
@GuardedBy("mLock")
@Watched @Watched
private final WatchedArrayList<String> mProtectedBroadcasts; private final WatchedArrayList<String> mProtectedBroadcasts;
private final SnapshotCache<WatchedArrayList<String>> mProtectedBroadcastsSnapshot; private final SnapshotCache<WatchedArrayList<String>> mProtectedBroadcastsSnapshot;
@@ -196,6 +203,11 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
private volatile boolean mSystemReady = false; private volatile boolean mSystemReady = false;
/**
* Guards the accesses for the list/set fields except for {@link #mShouldFilterCache}
*/
private final Object mLock = new Object();
/** /**
* A cached snapshot. * A cached snapshot.
*/ */
@@ -328,20 +340,22 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
* The copy constructor is used by PackageManagerService to construct a snapshot. * The copy constructor is used by PackageManagerService to construct a snapshot.
*/ */
private AppsFilterImpl(AppsFilterImpl orig) { private AppsFilterImpl(AppsFilterImpl orig) {
mImplicitlyQueryable = orig.mImplicitQueryableSnapshot.snapshot(); synchronized (orig.mLock) {
mImplicitQueryableSnapshot = new SnapshotCache.Sealed<>(); mImplicitlyQueryable = orig.mImplicitQueryableSnapshot.snapshot();
mRetainedImplicitlyQueryable = orig.mRetainedImplicitlyQueryableSnapshot.snapshot(); mImplicitQueryableSnapshot = new SnapshotCache.Sealed<>();
mRetainedImplicitlyQueryableSnapshot = new SnapshotCache.Sealed<>(); mRetainedImplicitlyQueryable = orig.mRetainedImplicitlyQueryableSnapshot.snapshot();
mQueriesViaPackage = orig.mQueriesViaPackageSnapshot.snapshot(); mRetainedImplicitlyQueryableSnapshot = new SnapshotCache.Sealed<>();
mQueriesViaPackageSnapshot = new SnapshotCache.Sealed<>(); mQueriesViaPackage = orig.mQueriesViaPackageSnapshot.snapshot();
mQueriesViaComponent = orig.mQueriesViaComponentSnapshot.snapshot(); mQueriesViaPackageSnapshot = new SnapshotCache.Sealed<>();
mQueriesViaComponentSnapshot = new SnapshotCache.Sealed<>(); mQueriesViaComponent = orig.mQueriesViaComponentSnapshot.snapshot();
mQueryableViaUsesLibrary = orig.mQueryableViaUsesLibrarySnapshot.snapshot(); mQueriesViaComponentSnapshot = new SnapshotCache.Sealed<>();
mQueryableViaUsesLibrarySnapshot = new SnapshotCache.Sealed<>(); mQueryableViaUsesLibrary = orig.mQueryableViaUsesLibrarySnapshot.snapshot();
mForceQueryable = orig.mForceQueryableSnapshot.snapshot(); mQueryableViaUsesLibrarySnapshot = new SnapshotCache.Sealed<>();
mForceQueryableSnapshot = new SnapshotCache.Sealed<>(); mForceQueryable = orig.mForceQueryableSnapshot.snapshot();
mProtectedBroadcasts = orig.mProtectedBroadcastsSnapshot.snapshot(); mForceQueryableSnapshot = new SnapshotCache.Sealed<>();
mProtectedBroadcastsSnapshot = new SnapshotCache.Sealed<>(); mProtectedBroadcasts = orig.mProtectedBroadcastsSnapshot.snapshot();
mProtectedBroadcastsSnapshot = new SnapshotCache.Sealed<>();
}
mQueriesViaComponentRequireRecompute = orig.mQueriesViaComponentRequireRecompute; mQueriesViaComponentRequireRecompute = orig.mQueriesViaComponentRequireRecompute;
mForceQueryableByDevicePackageNames = mForceQueryableByDevicePackageNames =
Arrays.copyOf(orig.mForceQueryableByDevicePackageNames, Arrays.copyOf(orig.mForceQueryableByDevicePackageNames,
@@ -742,9 +756,11 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
return false; return false;
} }
final boolean changed; final boolean changed;
changed = retainOnUpdate synchronized (mLock) {
? mRetainedImplicitlyQueryable.add(recipientUid, visibleUid) changed = retainOnUpdate
: mImplicitlyQueryable.add(recipientUid, visibleUid); ? mRetainedImplicitlyQueryable.add(recipientUid, visibleUid)
: mImplicitlyQueryable.add(recipientUid, visibleUid);
}
if (changed && DEBUG_LOGGING) { if (changed && DEBUG_LOGGING) {
Slog.i(TAG, (retainOnUpdate ? "retained " : "") + "implicit access granted: " Slog.i(TAG, (retainOnUpdate ? "retained " : "") + "implicit access granted: "
+ recipientUid + " -> " + visibleUid); + recipientUid + " -> " + visibleUid);
@@ -833,7 +849,9 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
// packages for signature matches // packages for signature matches
for (PackageStateInternal setting : existingSettings.values()) { for (PackageStateInternal setting : existingSettings.values()) {
if (isSystemSigned(mSystemSigningDetails, setting)) { if (isSystemSigned(mSystemSigningDetails, setting)) {
mForceQueryable.add(setting.getAppId()); synchronized (mLock) {
mForceQueryable.add(setting.getAppId());
}
} }
} }
} }
@@ -843,75 +861,76 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
return null; return null;
} }
if (mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts())) { synchronized (mLock) {
mQueriesViaComponentRequireRecompute = true; if (mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts())) {
} mQueriesViaComponentRequireRecompute = true;
}
final boolean newIsForceQueryable = final boolean newIsForceQueryable =
mForceQueryable.contains(newPkgSetting.getAppId()) mForceQueryable.contains(newPkgSetting.getAppId())
/* shared user that is already force queryable */ /* shared user that is already force queryable */
|| newPkgSetting.isForceQueryableOverride() /* adb override */ || newPkgSetting.isForceQueryableOverride() /* adb override */
|| (newPkgSetting.isSystem() && (mSystemAppsQueryable || (newPkgSetting.isSystem() && (mSystemAppsQueryable
|| newPkg.isForceQueryable() || newPkg.isForceQueryable()
|| ArrayUtils.contains(mForceQueryableByDevicePackageNames, || ArrayUtils.contains(mForceQueryableByDevicePackageNames,
newPkg.getPackageName()))); newPkg.getPackageName())));
if (newIsForceQueryable if (newIsForceQueryable
|| (mSystemSigningDetails != null || (mSystemSigningDetails != null
&& isSystemSigned(mSystemSigningDetails, newPkgSetting))) { && isSystemSigned(mSystemSigningDetails, newPkgSetting))) {
mForceQueryable.add(newPkgSetting.getAppId()); mForceQueryable.add(newPkgSetting.getAppId());
} }
for (int i = existingSettings.size() - 1; i >= 0; i--) { for (int i = existingSettings.size() - 1; i >= 0; i--) {
final PackageStateInternal existingSetting = existingSettings.valueAt(i); final PackageStateInternal existingSetting = existingSettings.valueAt(i);
if (existingSetting.getAppId() == newPkgSetting.getAppId() if (existingSetting.getAppId() == newPkgSetting.getAppId()
|| existingSetting.getPkg() || existingSetting.getPkg()
== null) { == null) {
continue; continue;
}
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)) {
mQueriesViaComponent.add(existingSetting.getAppId(),
newPkgSetting.getAppId());
} }
if (canQueryViaPackage(existingPkg, newPkg) final AndroidPackage existingPkg = existingSetting.getPkg();
|| canQueryAsInstaller(existingSetting, newPkg)) { // let's evaluate the ability of already added packages to see this new package
mQueriesViaPackage.add(existingSetting.getAppId(), if (!newIsForceQueryable) {
newPkgSetting.getAppId()); if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(existingPkg,
newPkg, mProtectedBroadcasts)) {
mQueriesViaComponent.add(existingSetting.getAppId(),
newPkgSetting.getAppId());
}
if (canQueryViaPackage(existingPkg, newPkg)
|| canQueryAsInstaller(existingSetting, newPkg)) {
mQueriesViaPackage.add(existingSetting.getAppId(),
newPkgSetting.getAppId());
}
if (canQueryViaUsesLibrary(existingPkg, newPkg)) {
mQueryableViaUsesLibrary.add(existingSetting.getAppId(),
newPkgSetting.getAppId());
}
} }
if (canQueryViaUsesLibrary(existingPkg, newPkg)) { // now we'll evaluate our new package's ability to see existing packages
mQueryableViaUsesLibrary.add(existingSetting.getAppId(), if (!mForceQueryable.contains(existingSetting.getAppId())) {
newPkgSetting.getAppId()); if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(newPkg,
existingPkg, mProtectedBroadcasts)) {
mQueriesViaComponent.add(newPkgSetting.getAppId(),
existingSetting.getAppId());
}
if (canQueryViaPackage(newPkg, existingPkg)
|| canQueryAsInstaller(newPkgSetting, existingPkg)) {
mQueriesViaPackage.add(newPkgSetting.getAppId(),
existingSetting.getAppId());
}
if (canQueryViaUsesLibrary(newPkg, existingPkg)) {
mQueryableViaUsesLibrary.add(newPkgSetting.getAppId(),
existingSetting.getAppId());
}
} }
} // if either package instruments the other, mark both as visible to one another
// now we'll evaluate our new package's ability to see existing packages if (newPkgSetting.getPkg() != null && existingSetting.getPkg() != null
if (!mForceQueryable.contains(existingSetting.getAppId())) { && (pkgInstruments(newPkgSetting.getPkg(), existingSetting.getPkg())
if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(newPkg, || pkgInstruments(existingSetting.getPkg(), newPkgSetting.getPkg()))) {
existingPkg, mProtectedBroadcasts)) { mQueriesViaPackage.add(newPkgSetting.getAppId(), existingSetting.getAppId());
mQueriesViaComponent.add(newPkgSetting.getAppId(), mQueriesViaPackage.add(existingSetting.getAppId(), newPkgSetting.getAppId());
existingSetting.getAppId());
} }
if (canQueryViaPackage(newPkg, existingPkg)
|| canQueryAsInstaller(newPkgSetting, existingPkg)) {
mQueriesViaPackage.add(newPkgSetting.getAppId(),
existingSetting.getAppId());
}
if (canQueryViaUsesLibrary(newPkg, existingPkg)) {
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()))) {
mQueriesViaPackage.add(newPkgSetting.getAppId(), existingSetting.getAppId());
mQueriesViaPackage.add(existingSetting.getAppId(), newPkgSetting.getAppId());
} }
} }
int existingSize = existingSettings.size(); int existingSize = existingSettings.size();
ArrayMap<String, AndroidPackage> existingPkgs = new ArrayMap<>(existingSize); ArrayMap<String, AndroidPackage> existingPkgs = new ArrayMap<>(existingSize);
for (int index = 0; index < existingSize; index++) { for (int index = 0; index < existingSize; index++) {
@@ -1138,16 +1157,18 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
private void collectProtectedBroadcasts( private void collectProtectedBroadcasts(
ArrayMap<String, ? extends PackageStateInternal> existingSettings, ArrayMap<String, ? extends PackageStateInternal> existingSettings,
@Nullable String excludePackage) { @Nullable String excludePackage) {
mProtectedBroadcasts.clear(); synchronized (mLock) {
for (int i = existingSettings.size() - 1; i >= 0; i--) { mProtectedBroadcasts.clear();
PackageStateInternal setting = existingSettings.valueAt(i); for (int i = existingSettings.size() - 1; i >= 0; i--) {
if (setting.getPkg() == null || setting.getPkg().getPackageName().equals( PackageStateInternal setting = existingSettings.valueAt(i);
excludePackage)) { if (setting.getPkg() == null || setting.getPkg().getPackageName().equals(
continue; excludePackage)) {
} continue;
final List<String> protectedBroadcasts = setting.getPkg().getProtectedBroadcasts(); }
if (!protectedBroadcasts.isEmpty()) { final List<String> protectedBroadcasts = setting.getPkg().getProtectedBroadcasts();
mProtectedBroadcasts.addAll(protectedBroadcasts); if (!protectedBroadcasts.isEmpty()) {
mProtectedBroadcasts.addAll(protectedBroadcasts);
}
} }
} }
} }
@@ -1158,24 +1179,26 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
*/ */
private void recomputeComponentVisibility( private void recomputeComponentVisibility(
ArrayMap<String, ? extends PackageStateInternal> existingSettings) { ArrayMap<String, ? extends PackageStateInternal> existingSettings) {
mQueriesViaComponent.clear(); synchronized (mLock) {
for (int i = existingSettings.size() - 1; i >= 0; i--) { mQueriesViaComponent.clear();
PackageStateInternal setting = existingSettings.valueAt(i); for (int i = existingSettings.size() - 1; i >= 0; i--) {
if (setting.getPkg() == null || requestsQueryAllPackages(setting.getPkg())) { PackageStateInternal setting = existingSettings.valueAt(i);
continue; if (setting.getPkg() == null || requestsQueryAllPackages(setting.getPkg())) {
}
for (int j = existingSettings.size() - 1; j >= 0; j--) {
if (i == j) {
continue; continue;
} }
final PackageStateInternal otherSetting = existingSettings.valueAt(j); for (int j = existingSettings.size() - 1; j >= 0; j--) {
if (otherSetting.getPkg() == null || mForceQueryable.contains( if (i == j) {
otherSetting.getAppId())) { continue;
continue; }
} final PackageStateInternal otherSetting = existingSettings.valueAt(j);
if (canQueryViaComponents(setting.getPkg(), otherSetting.getPkg(), if (otherSetting.getPkg() == null || mForceQueryable.contains(
mProtectedBroadcasts)) { otherSetting.getAppId())) {
mQueriesViaComponent.add(setting.getAppId(), otherSetting.getAppId()); continue;
}
if (canQueryViaComponents(setting.getPkg(), otherSetting.getPkg(),
mProtectedBroadcasts)) {
mQueriesViaComponent.add(setting.getAppId(), otherSetting.getAppId());
}
} }
} }
} }
@@ -1189,8 +1212,10 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
@Nullable @Nullable
public SparseArray<int[]> getVisibilityAllowList(PackageStateInternal setting, int[] users, public SparseArray<int[]> getVisibilityAllowList(PackageStateInternal setting, int[] users,
ArrayMap<String, ? extends PackageStateInternal> existingSettings) { ArrayMap<String, ? extends PackageStateInternal> existingSettings) {
if (mForceQueryable.contains(setting.getAppId())) { synchronized (mLock) {
return null; if (mForceQueryable.contains(setting.getAppId())) {
return null;
}
} }
// let's reserve max memory to limit the number of allocations // let's reserve max memory to limit the number of allocations
SparseArray<int[]> result = new SparseArray<>(users.length); SparseArray<int[]> result = new SparseArray<>(users.length);
@@ -1256,54 +1281,56 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
mStateProvider.runWithState((settings, sharedUserSettings, users) -> { mStateProvider.runWithState((settings, sharedUserSettings, users) -> {
final ArraySet<String> additionalChangedPackages; final ArraySet<String> additionalChangedPackages;
final int userCount = users.length; final int userCount = users.length;
for (int u = 0; u < userCount; u++) { synchronized (mLock) {
final int userId = users[u].id; for (int u = 0; u < userCount; u++) {
final int removingUid = UserHandle.getUid(userId, setting.getAppId()); final int userId = users[u].id;
mImplicitlyQueryable.remove(removingUid); final int removingUid = UserHandle.getUid(userId, setting.getAppId());
for (int i = mImplicitlyQueryable.size() - 1; i >= 0; i--) { mImplicitlyQueryable.remove(removingUid);
mImplicitlyQueryable.remove(mImplicitlyQueryable.keyAt(i), for (int i = mImplicitlyQueryable.size() - 1; i >= 0; i--) {
removingUid); mImplicitlyQueryable.remove(mImplicitlyQueryable.keyAt(i),
removingUid);
}
if (isReplace) {
continue;
}
mRetainedImplicitlyQueryable.remove(removingUid);
for (int i = mRetainedImplicitlyQueryable.size() - 1; i >= 0; i--) {
mRetainedImplicitlyQueryable.remove(
mRetainedImplicitlyQueryable.keyAt(i), removingUid);
}
} }
if (isReplace) { if (!mQueriesViaComponentRequireRecompute) {
continue; mQueriesViaComponent.remove(setting.getAppId());
for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i),
setting.getAppId());
}
} }
mQueriesViaPackage.remove(setting.getAppId());
mRetainedImplicitlyQueryable.remove(removingUid); for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
for (int i = mRetainedImplicitlyQueryable.size() - 1; i >= 0; i--) { mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i),
mRetainedImplicitlyQueryable.remove( setting.getAppId());
mRetainedImplicitlyQueryable.keyAt(i), removingUid); }
} mQueryableViaUsesLibrary.remove(setting.getAppId());
} for (int i = mQueryableViaUsesLibrary.size() - 1; i >= 0; i--) {
mQueryableViaUsesLibrary.remove(mQueryableViaUsesLibrary.keyAt(i),
if (!mQueriesViaComponentRequireRecompute) {
mQueriesViaComponent.remove(setting.getAppId());
for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i),
setting.getAppId()); setting.getAppId());
} }
}
mQueriesViaPackage.remove(setting.getAppId());
for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i),
setting.getAppId());
}
mQueryableViaUsesLibrary.remove(setting.getAppId());
for (int i = mQueryableViaUsesLibrary.size() - 1; i >= 0; i--) {
mQueryableViaUsesLibrary.remove(mQueryableViaUsesLibrary.keyAt(i),
setting.getAppId());
}
mForceQueryable.remove(setting.getAppId()); mForceQueryable.remove(setting.getAppId());
if (setting.getPkg() != null if (setting.getPkg() != null
&& !setting.getPkg().getProtectedBroadcasts().isEmpty()) { && !setting.getPkg().getProtectedBroadcasts().isEmpty()) {
final String removingPackageName = setting.getPkg().getPackageName(); final String removingPackageName = setting.getPkg().getPackageName();
final ArrayList<String> protectedBroadcasts = new ArrayList<>(); final ArrayList<String> protectedBroadcasts = new ArrayList<>();
protectedBroadcasts.addAll(mProtectedBroadcasts.untrackedStorage()); protectedBroadcasts.addAll(mProtectedBroadcasts.untrackedStorage());
collectProtectedBroadcasts(settings, removingPackageName); collectProtectedBroadcasts(settings, removingPackageName);
if (!mProtectedBroadcasts.containsAll(protectedBroadcasts)) { if (!mProtectedBroadcasts.containsAll(protectedBroadcasts)) {
mQueriesViaComponentRequireRecompute = true; mQueriesViaComponentRequireRecompute = true;
}
} }
} }
@@ -1562,11 +1589,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mForceQueryable"); Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mForceQueryable");
} }
if (mForceQueryable.contains(targetAppId)) { synchronized (mLock) {
if (DEBUG_LOGGING) { if (mForceQueryable.contains(targetAppId)) {
log(callingSetting, targetPkgSetting, "force queryable"); if (DEBUG_LOGGING) {
log(callingSetting, targetPkgSetting, "force queryable");
}
return false;
} }
return false;
} }
} finally { } finally {
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
@@ -1577,11 +1606,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaPackage"); Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaPackage");
} }
if (mQueriesViaPackage.contains(callingAppId, targetAppId)) { synchronized (mLock) {
if (DEBUG_LOGGING) { if (mQueriesViaPackage.contains(callingAppId, targetAppId)) {
log(callingSetting, targetPkgSetting, "queries package"); if (DEBUG_LOGGING) {
log(callingSetting, targetPkgSetting, "queries package");
}
return false;
} }
return false;
} }
} finally { } finally {
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
@@ -1597,11 +1628,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
recomputeComponentVisibility(settings); recomputeComponentVisibility(settings);
}); });
} }
if (mQueriesViaComponent.contains(callingAppId, targetAppId)) { synchronized (mLock) {
if (DEBUG_LOGGING) { if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
log(callingSetting, targetPkgSetting, "queries component"); if (DEBUG_LOGGING) {
log(callingSetting, targetPkgSetting, "queries component");
}
return false;
} }
return false;
} }
} finally { } finally {
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
@@ -1614,11 +1647,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mImplicitlyQueryable"); Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mImplicitlyQueryable");
} }
final int targetUid = UserHandle.getUid(targetUserId, targetAppId); final int targetUid = UserHandle.getUid(targetUserId, targetAppId);
if (mImplicitlyQueryable.contains(callingUid, targetUid)) { synchronized (mLock) {
if (DEBUG_LOGGING) { if (mImplicitlyQueryable.contains(callingUid, targetUid)) {
log(callingSetting, targetPkgSetting, "implicitly queryable for user"); if (DEBUG_LOGGING) {
log(callingSetting, targetPkgSetting, "implicitly queryable for user");
}
return false;
} }
return false;
} }
} finally { } finally {
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
@@ -1631,12 +1666,14 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mRetainedImplicitlyQueryable"); Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mRetainedImplicitlyQueryable");
} }
final int targetUid = UserHandle.getUid(targetUserId, targetAppId); final int targetUid = UserHandle.getUid(targetUserId, targetAppId);
if (mRetainedImplicitlyQueryable.contains(callingUid, targetUid)) { synchronized (mLock) {
if (DEBUG_LOGGING) { if (mRetainedImplicitlyQueryable.contains(callingUid, targetUid)) {
log(callingSetting, targetPkgSetting, if (DEBUG_LOGGING) {
"retained implicitly queryable for user"); log(callingSetting, targetPkgSetting,
"retained implicitly queryable for user");
}
return false;
} }
return false;
} }
} finally { } finally {
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
@@ -1682,11 +1719,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueryableViaUsesLibrary"); Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueryableViaUsesLibrary");
} }
if (mQueryableViaUsesLibrary.contains(callingAppId, targetAppId)) { synchronized (mLock) {
if (DEBUG_LOGGING) { if (mQueryableViaUsesLibrary.contains(callingAppId, targetAppId)) {
log(callingSetting, targetPkgSetting, "queryable for library users"); if (DEBUG_LOGGING) {
log(callingSetting, targetPkgSetting, "queryable for library users");
}
return false;
} }
return false;
} }
} finally { } finally {
if (DEBUG_TRACING) { if (DEBUG_TRACING) {
@@ -1802,23 +1841,25 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
pw.println(" system apps queryable: " + mSystemAppsQueryable); pw.println(" system apps queryable: " + mSystemAppsQueryable);
dumpPackageSet(pw, filteringAppId, mForceQueryable.untrackedStorage(), dumpPackageSet(pw, filteringAppId, mForceQueryable.untrackedStorage(),
"forceQueryable", " ", expandPackages); "forceQueryable", " ", expandPackages);
pw.println(" queries via package name:"); synchronized (mLock) {
dumpQueriesMap(pw, filteringAppId, mQueriesViaPackage, " ", expandPackages); pw.println(" queries via package name:");
pw.println(" queries via component:"); dumpQueriesMap(pw, filteringAppId, mQueriesViaPackage, " ", expandPackages);
dumpQueriesMap(pw, filteringAppId, mQueriesViaComponent, " ", expandPackages); pw.println(" queries via component:");
pw.println(" queryable via interaction:"); dumpQueriesMap(pw, filteringAppId, mQueriesViaComponent, " ", expandPackages);
for (int user : users) { pw.println(" queryable via interaction:");
pw.append(" User ").append(Integer.toString(user)).println(":"); for (int user : users) {
dumpQueriesMap(pw, pw.append(" User ").append(Integer.toString(user)).println(":");
filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId), dumpQueriesMap(pw,
mImplicitlyQueryable, " ", expandPackages); filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId),
dumpQueriesMap(pw, mImplicitlyQueryable, " ", expandPackages);
filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId), dumpQueriesMap(pw,
mRetainedImplicitlyQueryable, " ", expandPackages); filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId),
mRetainedImplicitlyQueryable, " ", expandPackages);
}
pw.println(" queryable via uses-library:");
dumpQueriesMap(pw, filteringAppId, mQueryableViaUsesLibrary, " ",
expandPackages);
} }
pw.println(" queryable via uses-library:");
dumpQueriesMap(pw, filteringAppId, mQueryableViaUsesLibrary, " ",
expandPackages);
} }
private static void dumpQueriesMap(PrintWriter pw, @Nullable Integer filteringId, private static void dumpQueriesMap(PrintWriter pw, @Nullable Integer filteringId,