From 9edad83f3ccde21438a86b496c51e3b8559d258f Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 21 Sep 2022 15:04:37 -0700 Subject: [PATCH] [AppsFilter] read sysprop only when it's changed Bisection shows ag/19669172 likely caused a small regression on the health metrics possibly due to the overhead of parsing. Given that system properties don't change much, optimize the reading of the debug property to be called when any system property is changed. BUG: 241751330 Test: atest AppEnumerationTests Change-Id: Ib1c71db0e668b10ddb92fd842fa3a18dd2cf323c --- .../core/java/com/android/server/pm/AppsFilterBase.java | 5 ++--- .../core/java/com/android/server/pm/AppsFilterImpl.java | 7 +++++++ .../java/com/android/server/pm/AppsFilterSnapshotImpl.java | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppsFilterBase.java b/services/core/java/com/android/server/pm/AppsFilterBase.java index 14140b5fe2640..5fa5de75eaf35 100644 --- a/services/core/java/com/android/server/pm/AppsFilterBase.java +++ b/services/core/java/com/android/server/pm/AppsFilterBase.java @@ -28,7 +28,6 @@ import android.content.pm.SigningDetails; import android.os.Binder; import android.os.Handler; import android.os.Process; -import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.text.TextUtils; @@ -199,6 +198,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot { protected SnapshotCache mShouldFilterCacheSnapshot; protected volatile boolean mCacheReady = false; + protected volatile boolean mCacheEnabled = true; protected static final boolean CACHE_VALID = true; protected static final boolean CACHE_INVALID = false; @@ -342,8 +342,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot { && !isImplicitlyQueryable(callingAppId, targetPkgSetting.getAppId()); } // use cache - if (mCacheReady && SystemProperties.getBoolean("debug.pm.use_app_filter_cache", - true)) { + if (mCacheReady && mCacheEnabled) { if (!shouldFilterApplicationUsingCache(callingUid, targetPkgSetting.getAppId(), userId)) { diff --git a/services/core/java/com/android/server/pm/AppsFilterImpl.java b/services/core/java/com/android/server/pm/AppsFilterImpl.java index 79d72a3ad7f0c..4c21195e28903 100644 --- a/services/core/java/com/android/server/pm/AppsFilterImpl.java +++ b/services/core/java/com/android/server/pm/AppsFilterImpl.java @@ -36,6 +36,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.SigningDetails; import android.content.pm.UserInfo; import android.os.Handler; +import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.provider.DeviceConfig; @@ -223,6 +224,12 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, return new AppsFilterSnapshotImpl(AppsFilterImpl.this); } }; + readCacheEnabledSysProp(); + SystemProperties.addChangeCallback(this::readCacheEnabledSysProp); + } + + private void readCacheEnabledSysProp() { + mCacheEnabled = SystemProperties.getBoolean("debug.pm.use_app_filter_cache", true); } /** diff --git a/services/core/java/com/android/server/pm/AppsFilterSnapshotImpl.java b/services/core/java/com/android/server/pm/AppsFilterSnapshotImpl.java index 019c853471fe5..4e268a277102b 100644 --- a/services/core/java/com/android/server/pm/AppsFilterSnapshotImpl.java +++ b/services/core/java/com/android/server/pm/AppsFilterSnapshotImpl.java @@ -74,6 +74,7 @@ public final class AppsFilterSnapshotImpl extends AppsFilterBase { // cache is not ready, use an empty cache for the snapshot mShouldFilterCache = new WatchedSparseBooleanMatrix(); } + mCacheEnabled = orig.mCacheEnabled; mShouldFilterCacheSnapshot = new SnapshotCache.Sealed<>(); mBackgroundHandler = null;