Merge "Defer recomputeComponentVisibility." into rvc-dev am: 77f5e88a44 am: 5d97b32560

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

Change-Id: Id76a65584d655cc225f01d30fc77280a4860ec14
This commit is contained in:
TreeHugger Robot
2020-06-18 00:56:52 +00:00
committed by Automerger Merge Worker

View File

@@ -95,6 +95,14 @@ public class AppsFilter {
*/ */
private final SparseSetArray<Integer> mQueriesViaComponent = new SparseSetArray<>(); private final SparseSetArray<Integer> mQueriesViaComponent = new SparseSetArray<>();
/**
* Pending full recompute of mQueriesViaComponent. Occurs when a package adds a new set of
* protected broadcast. This in turn invalidates all prior additions and require a very
* computationally expensive recomputing.
* Full recompute is done lazily at the point when we use mQueriesViaComponent to filter apps.
*/
private boolean mQueriesViaComponentRequireRecompute = false;
/** /**
* 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.
@@ -278,7 +286,7 @@ public class AppsFilter {
private void updateEnabledState(AndroidPackage pkg) { private void updateEnabledState(AndroidPackage pkg) {
// TODO(b/135203078): Do not use toAppInfo // TODO(b/135203078): Do not use toAppInfo
final boolean enabled = mInjector.getCompatibility().isChangeEnabled( final boolean enabled = mInjector.getCompatibility().isChangeEnabledInternal(
PackageManager.FILTER_APPLICATION_QUERY, pkg.toAppInfoWithoutState()); PackageManager.FILTER_APPLICATION_QUERY, pkg.toAppInfoWithoutState());
if (enabled) { if (enabled) {
mDisabledPackages.remove(pkg.getPackageName()); mDisabledPackages.remove(pkg.getPackageName());
@@ -523,9 +531,8 @@ public class AppsFilter {
return; return;
} }
if (!newPkg.getProtectedBroadcasts().isEmpty()) { if (mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts())) {
mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts()); mQueriesViaComponentRequireRecompute = true;
recomputeComponentVisibility(existingSettings, newPkg.getPackageName());
} }
final boolean newIsForceQueryable = final boolean newIsForceQueryable =
@@ -550,7 +557,8 @@ public class AppsFilter {
final AndroidPackage existingPkg = existingSetting.pkg; final AndroidPackage existingPkg = existingSetting.pkg;
// let's evaluate the ability of already added packages to see this new package // let's evaluate the ability of already added packages to see this new package
if (!newIsForceQueryable) { if (!newIsForceQueryable) {
if (canQueryViaComponents(existingPkg, newPkg, mProtectedBroadcasts)) { if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(existingPkg,
newPkg, mProtectedBroadcasts)) {
mQueriesViaComponent.add(existingSetting.appId, newPkgSetting.appId); mQueriesViaComponent.add(existingSetting.appId, newPkgSetting.appId);
} }
if (canQueryViaPackage(existingPkg, newPkg) if (canQueryViaPackage(existingPkg, newPkg)
@@ -560,7 +568,8 @@ public class AppsFilter {
} }
// now we'll evaluate our new package's ability to see existing packages // now we'll evaluate our new package's ability to see existing packages
if (!mForceQueryable.contains(existingSetting.appId)) { if (!mForceQueryable.contains(existingSetting.appId)) {
if (canQueryViaComponents(newPkg, existingPkg, mProtectedBroadcasts)) { if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(newPkg,
existingPkg, mProtectedBroadcasts)) {
mQueriesViaComponent.add(newPkgSetting.appId, existingSetting.appId); mQueriesViaComponent.add(newPkgSetting.appId, existingSetting.appId);
} }
if (canQueryViaPackage(newPkg, existingPkg) if (canQueryViaPackage(newPkg, existingPkg)
@@ -689,13 +698,11 @@ public class AppsFilter {
return ret; return ret;
} }
private void recomputeComponentVisibility(ArrayMap<String, PackageSetting> existingSettings, private void recomputeComponentVisibility(ArrayMap<String, PackageSetting> existingSettings) {
@Nullable String excludePackage) {
mQueriesViaComponent.clear(); mQueriesViaComponent.clear();
for (int i = existingSettings.size() - 1; i >= 0; i--) { for (int i = existingSettings.size() - 1; i >= 0; i--) {
PackageSetting setting = existingSettings.valueAt(i); PackageSetting setting = existingSettings.valueAt(i);
if (setting.pkg == null if (setting.pkg == null
|| setting.pkg.getPackageName().equals(excludePackage)
|| mForceQueryable.contains(setting.appId)) { || mForceQueryable.contains(setting.appId)) {
continue; continue;
} }
@@ -704,8 +711,7 @@ public class AppsFilter {
continue; continue;
} }
final PackageSetting otherSetting = existingSettings.valueAt(j); final PackageSetting otherSetting = existingSettings.valueAt(j);
if (otherSetting.pkg == null if (otherSetting.pkg == null) {
|| otherSetting.pkg.getPackageName().equals(excludePackage)) {
continue; continue;
} }
if (canQueryViaComponents(setting.pkg, otherSetting.pkg, mProtectedBroadcasts)) { if (canQueryViaComponents(setting.pkg, otherSetting.pkg, mProtectedBroadcasts)) {
@@ -713,6 +719,7 @@ public class AppsFilter {
} }
} }
} }
mQueriesViaComponentRequireRecompute = false;
} }
/** /**
@@ -787,10 +794,12 @@ public class AppsFilter {
} }
} }
if (!mQueriesViaComponentRequireRecompute) {
mQueriesViaComponent.remove(setting.appId); mQueriesViaComponent.remove(setting.appId);
for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) { for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i), setting.appId); mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i), setting.appId);
} }
}
mQueriesViaPackage.remove(setting.appId); mQueriesViaPackage.remove(setting.appId);
for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) { for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i), setting.appId); mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i), setting.appId);
@@ -810,10 +819,11 @@ public class AppsFilter {
if (!setting.pkg.getProtectedBroadcasts().isEmpty()) { if (!setting.pkg.getProtectedBroadcasts().isEmpty()) {
final String removingPackageName = setting.pkg.getPackageName(); final String removingPackageName = setting.pkg.getPackageName();
mProtectedBroadcasts.clear(); final Set<String> protectedBroadcasts = mProtectedBroadcasts;
mProtectedBroadcasts.addAll( mProtectedBroadcasts = collectProtectedBroadcasts(settings, removingPackageName);
collectProtectedBroadcasts(settings, removingPackageName)); if (!mProtectedBroadcasts.containsAll(protectedBroadcasts)) {
recomputeComponentVisibility(settings, removingPackageName); mQueriesViaComponentRequireRecompute = true;
}
} }
mOverlayReferenceMapper.removePkg(setting.name); mOverlayReferenceMapper.removePkg(setting.name);
@@ -1003,6 +1013,11 @@ public class AppsFilter {
} }
try { try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaComponent"); Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaComponent");
if (mQueriesViaComponentRequireRecompute) {
mStateProvider.runWithState((settings, users) -> {
recomputeComponentVisibility(settings);
});
}
if (mQueriesViaComponent.contains(callingAppId, targetAppId)) { if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
if (DEBUG_LOGGING) { if (DEBUG_LOGGING) {
log(callingSetting, targetPkgSetting, "queries component"); log(callingSetting, targetPkgSetting, "queries component");