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:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user