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

Commit 1972882d authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Remove the normal broadcast delay for core uids.

- Some of the core components use a registered receiver for
  listening to broadcasts as they are expecting to be running
  while they are delivered. So, we could end up applying the
  normal broadcast delay to these components but not the apps
  which are using a manifest broadcast and so these core
  components could end up receiving the broadcast after the
  apps.
- Also, order the process queues in the same order as the
  receivers returned by intent resolver queries. This just
  tries to keep the ordering similar to legacy queue to some
  extent and if clients need to always receive broadcasts in
  certain order, they should rely on intent-filter priorities.

Bug: 284009479
Test: atest ./services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
Test: atest ./services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
Test: atest CtsBroadcastTestCases
Change-Id: Iacdd47bb55f06fb866d87ba5d3d3a5448a0de8bb
parent 2907102b
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -1015,6 +1015,7 @@ class BroadcastProcessQueue {
    static final int REASON_CONTAINS_INSTRUMENTED = 16;
    static final int REASON_CONTAINS_MANIFEST = 17;
    static final int REASON_FOREGROUND = 18;
    static final int REASON_CORE_UID = 19;

    @IntDef(flag = false, prefix = { "REASON_" }, value = {
            REASON_EMPTY,
@@ -1035,6 +1036,7 @@ class BroadcastProcessQueue {
            REASON_CONTAINS_INSTRUMENTED,
            REASON_CONTAINS_MANIFEST,
            REASON_FOREGROUND,
            REASON_CORE_UID,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface Reason {}
@@ -1059,6 +1061,7 @@ class BroadcastProcessQueue {
            case REASON_CONTAINS_INSTRUMENTED: return "CONTAINS_INSTRUMENTED";
            case REASON_CONTAINS_MANIFEST: return "CONTAINS_MANIFEST";
            case REASON_FOREGROUND: return "FOREGROUND";
            case REASON_CORE_UID: return "CORE_UID";
            default: return Integer.toString(reason);
        }
    }
@@ -1103,6 +1106,9 @@ class BroadcastProcessQueue {
            } else if (mProcessPersistent) {
                mRunnableAt = runnableAt + constants.DELAY_PERSISTENT_PROC_MILLIS;
                mRunnableAtReason = REASON_PERSISTENT;
            } else if (UserHandle.isCore(uid)) {
                mRunnableAt = runnableAt;
                mRunnableAtReason = REASON_CORE_UID;
            } else if (mCountOrdered > 0) {
                mRunnableAt = runnableAt;
                mRunnableAtReason = REASON_CONTAINS_ORDERED;
@@ -1257,7 +1263,7 @@ class BroadcastProcessQueue {
        BroadcastProcessQueue test = head;
        BroadcastProcessQueue tail = null;
        while (test != null) {
            if (test.getRunnableAt() >= itemRunnableAt) {
            if (test.getRunnableAt() > itemRunnableAt) {
                item.runnableAtNext = test;
                item.runnableAtPrev = test.runnableAtPrev;
                if (item.runnableAtNext != null) {
+29 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ import android.os.Bundle;
import android.os.BundleMerger;
import android.os.DropBoxManager;
import android.os.HandlerThread;
import android.os.Process;
import android.os.SystemClock;
import android.os.TestLooperManager;
import android.os.UserHandle;
@@ -326,6 +327,20 @@ public final class BroadcastQueueModernImplTest {
        assertOrphan(mQueue4);
    }

    @Test
    public void testRunnableList_sameRunnableAt() {
        doReturn(2L).when(mQueue1).getRunnableAt();
        doReturn(2L).when(mQueue2).getRunnableAt();
        doReturn(2L).when(mQueue3).getRunnableAt();
        doReturn(2L).when(mQueue4).getRunnableAt();

        mHead = insertIntoRunnableList(mHead, mQueue1);
        mHead = insertIntoRunnableList(mHead, mQueue2);
        mHead = insertIntoRunnableList(mHead, mQueue3);
        mHead = insertIntoRunnableList(mHead, mQueue4);
        assertRunnableList(List.of(mQueue1, mQueue2, mQueue3, mQueue4), mHead);
    }

    @Test
    public void testProcessQueue_Complex() {
        BroadcastProcessQueue red = mImpl.getOrCreateProcessQueue(PACKAGE_RED, TEST_UID);
@@ -561,6 +576,20 @@ public final class BroadcastQueueModernImplTest {
        assertEquals(BroadcastProcessQueue.REASON_NORMAL, queue.getRunnableAtReason());
    }

    @Test
    public void testRunnableAt_coreUid() {
        final BroadcastProcessQueue queue = new BroadcastProcessQueue(mConstants,
                "com.android.bluetooth", Process.BLUETOOTH_UID);

        final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK);
        final BroadcastRecord timeTickRecord = makeBroadcastRecord(timeTick,
                List.of(makeMockRegisteredReceiver()));
        enqueueOrReplaceBroadcast(queue, timeTickRecord, 0);

        assertThat(queue.getRunnableAt()).isEqualTo(timeTickRecord.enqueueTime);
        assertEquals(BroadcastProcessQueue.REASON_CORE_UID, queue.getRunnableAtReason());
    }

    /**
     * Verify that a cached process that would normally be delayed becomes
     * immediately runnable when the given broadcast is enqueued.