summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Amith Yamasani <yamasani@google.com> 2023-05-17 21:20:32 -0700
committer Amith Yamasani <yamasani@google.com> 2023-05-17 21:23:19 -0700
commitf6f23bff46ecc9289c1ddf37db89c7d80b139a17 (patch)
tree741c14dc102e0103100649e3699623de733e12a8
parent34bc8be6c50133fdd1b92c1fcd82d7266a8fdf7d (diff)
Implement freezer delay broadcast option in legacy queue
Add similar logic for freezer delay as in the modern queue. Also, gracefully return from forceDelayBroadcastDelay() when called for legacy queue. Bug: 278940896 Test: atest BroadcastFreezerTest Change-Id: Iae17898df59f50799ed9ba6c44bf745b0e090026
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java5
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueueImpl.java20
2 files changed, 22 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index bfa397fa2b03..74cf57d17826 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -19037,8 +19037,11 @@ public class ActivityManagerService extends IActivityManager.Stub
long delayedDurationMs) {
Objects.requireNonNull(targetPackage);
Preconditions.checkArgumentNonnegative(delayedDurationMs);
- Preconditions.checkState(mEnableModernQueue, "Not valid in legacy queue");
enforceCallingPermission(permission.DUMP, "forceDelayBroadcastDelivery()");
+ // Ignore request if modern queue is not enabled
+ if (!mEnableModernQueue) {
+ return;
+ }
for (BroadcastQueue queue : mBroadcastQueues) {
queue.forceDelayBroadcastDelivery(targetPackage, delayedDurationMs);
diff --git a/services/core/java/com/android/server/am/BroadcastQueueImpl.java b/services/core/java/com/android/server/am/BroadcastQueueImpl.java
index 7f3ceb578891..e389821595a0 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueImpl.java
@@ -18,6 +18,7 @@ package com.android.server.am;
import static android.app.ActivityManager.RESTRICTION_LEVEL_RESTRICTED_BUCKET;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_START_RECEIVER;
+import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_APP_FREEZING_DELAYED;
import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY;
import static android.os.Process.ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE;
import static android.text.TextUtils.formatSimple;
@@ -384,6 +385,16 @@ public class BroadcastQueueImpl extends BroadcastQueue {
maybeReportBroadcastDispatchedEventLocked(r, r.curReceiver.applicationInfo.uid);
r.intent.setComponent(r.curComponent);
+ // See if we need to delay the freezer based on BroadcastOptions
+ if (r.options != null
+ && r.options.getTemporaryAppAllowlistDuration() > 0
+ && r.options.getTemporaryAppAllowlistType()
+ == TEMPORARY_ALLOW_LIST_TYPE_APP_FREEZING_DELAYED) {
+ mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(app,
+ CachedAppOptimizer.UNFREEZE_REASON_START_RECEIVER,
+ r.options.getTemporaryAppAllowlistDuration());
+ }
+
boolean started = false;
try {
if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST,
@@ -930,8 +941,13 @@ public class BroadcastQueueImpl extends BroadcastQueue {
Slog.v(TAG, "Broadcast temp allowlist uid=" + uid + " duration=" + duration
+ " type=" + type + " : " + b.toString());
}
- mService.tempAllowlistUidLocked(uid, duration, reasonCode, b.toString(), type,
- r.callingUid);
+
+ // Only add to temp allowlist if it's not the APP_FREEZING_DELAYED type. That will be
+ // handled when the broadcast is actually being scheduled on the app thread.
+ if (type != TEMPORARY_ALLOW_LIST_TYPE_APP_FREEZING_DELAYED) {
+ mService.tempAllowlistUidLocked(uid, duration, reasonCode, b.toString(), type,
+ r.callingUid);
+ }
}
private void processNextBroadcast(boolean fromMsg) {