Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79487fca authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

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
parent a6b032d1
Loading
Loading
Loading
Loading
+6 −29
Original line number Diff line number Diff line
@@ -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");
        }
    }