diff options
| author | 2024-08-15 09:47:37 -0700 | |
|---|---|---|
| committer | 2024-08-21 05:05:09 +0000 | |
| commit | 46b42e3b66c26c616922da4d1a68c385bb270104 (patch) | |
| tree | e3522380069b27175aa9a19ee807da868e6f5010 | |
| parent | 94e64d081d5b4e636b0c7d4c996d06d8996b6f5f (diff) | |
Add a rate limiter to the getRunningAppProcesses() call
Allow at most 400 calls per second to system_server and
return a cached value at other times. This is distributed
as 4 calls every 10 ms.
Bug: 360374604
Test: Take a trace to verify AIDL call doesn't exceed
4 every 10ms.
Flag: android.app.rate_limit_get_running_app_processes
Change-Id: I0781949fe3fcef170e8a3c09f6de4aeba4c2989d
| -rw-r--r-- | core/java/android/app/ActivityManager.java | 15 | ||||
| -rw-r--r-- | core/java/android/app/activity_manager.aconfig | 12 |
2 files changed, 27 insertions, 0 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index be70de20c2e2..e57630bfd5ed 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -94,6 +94,7 @@ import com.android.internal.os.TransferPipe; import com.android.internal.util.FastPrintWriter; import com.android.internal.util.MemInfoReader; import com.android.internal.util.Preconditions; +import com.android.internal.util.RateLimitingCache; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; import com.android.server.LocalServices; @@ -228,6 +229,10 @@ public class ActivityManager { final ArrayMap<OnUidImportanceListener, MyUidObserver> mImportanceListeners = new ArrayMap<>(); + /** Rate-Limiting Cache that allows no more than 400 calls to the service per second. */ + private static final RateLimitingCache<List<RunningAppProcessInfo>> mRunningProcessesCache = + new RateLimitingCache<>(10, 4); + /** * Map of callbacks that have registered for {@link UidFrozenStateChanged} events. * Will be called when a Uid has become frozen or unfrozen. @@ -4213,6 +4218,16 @@ public class ActivityManager { * specified. */ public List<RunningAppProcessInfo> getRunningAppProcesses() { + if (!Flags.rateLimitGetRunningAppProcesses()) { + return getRunningAppProcessesInternal(); + } else { + return mRunningProcessesCache.get(() -> { + return getRunningAppProcessesInternal(); + }); + } + } + + private List<RunningAppProcessInfo> getRunningAppProcessesInternal() { try { return getService().getRunningAppProcesses(); } catch (RemoteException e) { diff --git a/core/java/android/app/activity_manager.aconfig b/core/java/android/app/activity_manager.aconfig index fa646a76768c..d9594d3e4c31 100644 --- a/core/java/android/app/activity_manager.aconfig +++ b/core/java/android/app/activity_manager.aconfig @@ -81,3 +81,15 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + namespace: "backstage_power" + name: "rate_limit_get_running_app_processes" + description: "Rate limit calls to getRunningAppProcesses using a cache" + is_fixed_read_only: true + bug: "360374604" + metadata { + purpose: PURPOSE_BUGFIX + } +} + |