summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Songchun Fan <schfan@google.com> 2022-04-25 20:36:22 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-04-25 20:36:22 +0000
commitc49dfd94b96483ec8d3721f5a65b089d158a8244 (patch)
tree1199ea87cce6b313fc9d4a52324024314531ac4e
parentdf092b720bcb4e647603c3fe34012633ac3a969f (diff)
parent4b44ad30a010d7503f53cacdae37940cef2471d2 (diff)
Merge "[AppsFilter] skip recompute mQueriesViaComponent for snapshot" into tm-dev
-rw-r--r--services/core/java/com/android/server/pm/AppsFilterImpl.java61
1 files changed, 52 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/pm/AppsFilterImpl.java b/services/core/java/com/android/server/pm/AppsFilterImpl.java
index c447880e75e9..f757405645b9 100644
--- a/services/core/java/com/android/server/pm/AppsFilterImpl.java
+++ b/services/core/java/com/android/server/pm/AppsFilterImpl.java
@@ -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,16 +1569,53 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
if (DEBUG_TRACING) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaComponent");
}
- if (mQueriesViaComponentRequireRecompute) {
- recomputeComponentVisibility(snapshot.getPackageStates());
- onChanged();
- }
- synchronized (mLock) {
- if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
- if (DEBUG_LOGGING) {
- log(callingSetting, targetPkgSetting, "queries component");
+ 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) {
+ log(callingSetting, targetPkgSetting, "queries component");
+ }
+ 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;
+ }
+ }
}
- return false;
}
}
} finally {