Finish receiver synchronously when broadcast can be skipped.

With the delivery group policies applied to more broadcasts,
there could be a lot of broadcasts in the SKIPPED state and
finishing each of these asynchronously could increase the
delivery latency which could be problematic for foreground
broadcasts.

Bug: 268639079
Test: atest services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
Test: atest services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
Change-Id: I3f052ba1c58be321a3d1376712b50b440c84c908

Change-Id: I5b3d848b9a5088b55f950ddc3065e6d85fac8d46
This commit is contained in:
Sudheer Shanka
2023-03-01 07:27:10 +00:00
parent a6b032d136
commit 79487fcab2

View File

@@ -52,7 +52,6 @@ import android.app.usage.UsageEvents.Event;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -90,7 +89,6 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -225,22 +223,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
private static final int MSG_DELIVERY_TIMEOUT_HARD = 3;
private static final int MSG_BG_ACTIVITY_START_TIMEOUT = 4;
private static final int MSG_CHECK_HEALTH = 5;
private static final int MSG_FINISH_RECEIVER = 6;
private void enqueueUpdateRunningList() {
mLocalHandler.removeMessages(MSG_UPDATE_RUNNING_LIST);
mLocalHandler.sendEmptyMessage(MSG_UPDATE_RUNNING_LIST);
}
private void enqueueFinishReceiver(@NonNull BroadcastProcessQueue queue,
@DeliveryState int deliveryState, @NonNull String reason) {
final SomeArgs args = SomeArgs.obtain();
args.arg1 = queue;
args.argi1 = deliveryState;
args.arg2 = reason;
mLocalHandler.sendMessage(Message.obtain(mLocalHandler, MSG_FINISH_RECEIVER, args));
}
private final Handler mLocalHandler;
private final Handler.Callback mLocalCallback = (msg) -> {
@@ -279,17 +267,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
}
return true;
}
case MSG_FINISH_RECEIVER: {
synchronized (mService) {
final SomeArgs args = (SomeArgs) msg.obj;
final BroadcastProcessQueue queue = (BroadcastProcessQueue) args.arg1;
final int deliveryState = args.argi1;
final String reason = (String) args.arg2;
args.recycle();
finishReceiverActiveLocked(queue, deliveryState, reason);
}
return true;
}
}
return false;
};
@@ -727,7 +704,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
// Ignore registered receivers from a previous PID
if (receiver instanceof BroadcastFilter) {
mRunningColdStart = null;
enqueueFinishReceiver(queue, BroadcastRecord.DELIVERY_SKIPPED,
finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_SKIPPED,
"BroadcastFilter for cold app");
return;
}
@@ -758,7 +735,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
hostingRecord, zygotePolicyFlags, allowWhileBooting, false);
if (queue.app == null) {
mRunningColdStart = null;
enqueueFinishReceiver(queue, BroadcastRecord.DELIVERY_FAILURE,
finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_FAILURE,
"startProcessLocked failed");
return;
}
@@ -800,7 +777,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
@NonNull BroadcastRecord r, int index) {
final String reason = shouldSkipReceiver(queue, r, index);
if (reason != null) {
enqueueFinishReceiver(queue, BroadcastRecord.DELIVERY_SKIPPED, reason);
finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_SKIPPED, reason);
return true;
}
return false;
@@ -913,7 +890,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
// TODO: consider making registered receivers of unordered
// broadcasts report results to detect ANRs
if (assumeDelivered) {
enqueueFinishReceiver(queue, BroadcastRecord.DELIVERY_DELIVERED,
finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_DELIVERED,
"assuming delivered");
}
} else {
@@ -931,10 +908,10 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
logw(msg);
app.killLocked("Can't deliver broadcast", ApplicationExitInfo.REASON_OTHER,
ApplicationExitInfo.SUBREASON_UNDELIVERED_BROADCAST, true);
enqueueFinishReceiver(queue, BroadcastRecord.DELIVERY_FAILURE, "remote app");
finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_FAILURE, "remote app");
}
} else {
enqueueFinishReceiver(queue, BroadcastRecord.DELIVERY_FAILURE,
finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_FAILURE,
"missing IApplicationThread");
}
}