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

Commit 4448ed51 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Log BROADCAST_DELIVERY_EVENT_REPORTED only when delivery is attempted.

Fixes: 269211533
Test: services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
Test: atest ./services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
Change-Id: I40ca9f45eac4fcf82c1d50de759b647539c9ecd8
Merged-In: I40ca9f45eac4fcf82c1d50de759b647539c9ecd8
(cherry picked from commit c11eeeb1)
parent 3ed359b5
Loading
Loading
Loading
Loading
+12 −5
Original line number Original line Diff line number Diff line
@@ -1620,6 +1620,18 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
     */
     */
    private void notifyFinishReceiver(@Nullable BroadcastProcessQueue queue,
    private void notifyFinishReceiver(@Nullable BroadcastProcessQueue queue,
            @NonNull BroadcastRecord r, int index, @NonNull Object receiver) {
            @NonNull BroadcastRecord r, int index, @NonNull Object receiver) {
        if (r.wasDeliveryAttempted(index)) {
            logBroadcastDeliveryEventReported(queue, r, index, receiver);
        }

        final boolean recordFinished = (r.terminalCount == r.receivers.size());
        if (recordFinished) {
            notifyFinishBroadcast(r);
        }
    }

    private void logBroadcastDeliveryEventReported(@Nullable BroadcastProcessQueue queue,
            @NonNull BroadcastRecord r, int index, @NonNull Object receiver) {
        // Report statistics for each individual receiver
        // Report statistics for each individual receiver
        final int uid = getReceiverUid(receiver);
        final int uid = getReceiverUid(receiver);
        final int senderUid = (r.callingUid == -1) ? Process.SYSTEM_UID : r.callingUid;
        final int senderUid = (r.callingUid == -1) ? Process.SYSTEM_UID : r.callingUid;
@@ -1647,11 +1659,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            FrameworkStatsLog.write(BROADCAST_DELIVERY_EVENT_REPORTED, uid, senderUid, actionName,
            FrameworkStatsLog.write(BROADCAST_DELIVERY_EVENT_REPORTED, uid, senderUid, actionName,
                    receiverType, type, dispatchDelay, receiveDelay, finishDelay, packageState);
                    receiverType, type, dispatchDelay, receiveDelay, finishDelay, packageState);
        }
        }

        final boolean recordFinished = (r.terminalCount == r.receivers.size());
        if (recordFinished) {
            notifyFinishBroadcast(r);
        }
    }
    }


    private void notifyFinishBroadcast(@NonNull BroadcastRecord r) {
    private void notifyFinishBroadcast(@NonNull BroadcastRecord r) {
+12 −0
Original line number Original line Diff line number Diff line
@@ -632,6 +632,18 @@ final class BroadcastRecord extends Binder {
        return delivery[index];
        return delivery[index];
    }
    }


    boolean wasDeliveryAttempted(int index) {
        final int deliveryState = getDeliveryState(index);
        switch (deliveryState) {
            case DELIVERY_DELIVERED:
            case DELIVERY_TIMEOUT:
            case DELIVERY_FAILURE:
                return true;
            default:
                return false;
        }
    }

    void copyEnqueueTimeFrom(@NonNull BroadcastRecord replacedBroadcast) {
    void copyEnqueueTimeFrom(@NonNull BroadcastRecord replacedBroadcast) {
        originalEnqueueClockTime = enqueueClockTime;
        originalEnqueueClockTime = enqueueClockTime;
        enqueueTime = replacedBroadcast.enqueueTime;
        enqueueTime = replacedBroadcast.enqueueTime;
+41 −1
Original line number Original line Diff line number Diff line
@@ -16,6 +16,10 @@


package com.android.server.am;
package com.android.server.am;


import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED;
import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD;
import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__MANIFEST;
import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_ALARM;
import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_ALARM;
import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_FOREGROUND;
import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_FOREGROUND;
import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_INTERACTIVE;
import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_INTERACTIVE;
@@ -44,8 +48,12 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;


import android.annotation.NonNull;
import android.annotation.NonNull;
import android.app.Activity;
import android.app.Activity;
@@ -70,6 +78,11 @@ import android.util.Pair;


import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.ExtendedMockitoTestCase;
import com.android.server.am.BroadcastQueueTest.SyncBarrier;

import org.junit.After;
import org.junit.After;
import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
@@ -86,7 +99,7 @@ import java.util.List;


@SmallTest
@SmallTest
@RunWith(MockitoJUnitRunner.class)
@RunWith(MockitoJUnitRunner.class)
public class BroadcastQueueModernImplTest {
public class BroadcastQueueModernImplTest extends ExtendedMockitoTestCase {
    private static final int TEST_UID = android.os.Process.FIRST_APPLICATION_UID;
    private static final int TEST_UID = android.os.Process.FIRST_APPLICATION_UID;
    private static final int TEST_UID2 = android.os.Process.FIRST_APPLICATION_UID + 1;
    private static final int TEST_UID2 = android.os.Process.FIRST_APPLICATION_UID + 1;


@@ -105,6 +118,11 @@ public class BroadcastQueueModernImplTest {


    BroadcastProcessQueue mHead;
    BroadcastProcessQueue mHead;


    @Override
    protected void initializeSession(StaticMockitoSessionBuilder builder) {
        builder.spyStatic(FrameworkStatsLog.class);
    }

    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
@@ -1081,6 +1099,28 @@ public class BroadcastQueueModernImplTest {
        }
        }
    }
    }


    @Test
    public void testBroadcastDeliveryEventReported() throws Exception {
        final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK);
        final BroadcastOptions optionsTimeTick = BroadcastOptions.makeBasic();
        optionsTimeTick.setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);

        // Halt all processing so that we get a consistent view
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            mImpl.enqueueBroadcastLocked(makeBroadcastRecord(timeTick, optionsTimeTick));
            mImpl.enqueueBroadcastLocked(makeBroadcastRecord(timeTick, optionsTimeTick));
        }
        mImpl.waitForIdle(null);

        // Verify that there is only one delivery event reported since one of the broadcasts
        // should have been skipped.
        verify(() -> FrameworkStatsLog.write(eq(BROADCAST_DELIVERY_EVENT_REPORTED),
                eq(getUidForPackage(PACKAGE_GREEN)), anyInt(), eq(Intent.ACTION_TIME_TICK),
                eq(BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__MANIFEST),
                eq(BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD),
                anyLong(), anyLong(), anyLong(), anyInt()), times(1));
    }

    private Intent createPackageChangedIntent(int uid, List<String> componentNameList) {
    private Intent createPackageChangedIntent(int uid, List<String> componentNameList) {
        final Intent packageChangedIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED);
        final Intent packageChangedIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED);
        packageChangedIntent.putExtra(Intent.EXTRA_UID, uid);
        packageChangedIntent.putExtra(Intent.EXTRA_UID, uid);
+14 −12
Original line number Original line Diff line number Diff line
@@ -346,16 +346,18 @@ public class BroadcastQueueTest {
     * Helper that leverages try-with-resources to pause dispatch of
     * Helper that leverages try-with-resources to pause dispatch of
     * {@link #mHandlerThread} until released.
     * {@link #mHandlerThread} until released.
     */
     */
    private class SyncBarrier implements AutoCloseable {
    static class SyncBarrier implements AutoCloseable {
        private final int mToken;
        private final int mToken;
        private HandlerThread mThread;


        public SyncBarrier() {
        SyncBarrier(HandlerThread thread) {
            mToken = mHandlerThread.getLooper().getQueue().postSyncBarrier();
            mThread = thread;
            mToken = mThread.getLooper().getQueue().postSyncBarrier();
        }
        }


        @Override
        @Override
        public void close() throws Exception {
        public void close() throws Exception {
            mHandlerThread.getLooper().getQueue().removeSyncBarrier(mToken);
            mThread.getLooper().getQueue().removeSyncBarrier(mToken);
        }
        }
    }
    }


@@ -1120,7 +1122,7 @@ public class BroadcastQueueTest {
        final ProcessRecord receiverApp = makeActiveProcessRecord(PACKAGE_GREEN);
        final ProcessRecord receiverApp = makeActiveProcessRecord(PACKAGE_GREEN);


        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, new ArrayList<>(
            enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, new ArrayList<>(
                    List.of(makeRegisteredReceiver(receiverApp),
                    List.of(makeRegisteredReceiver(receiverApp),
                            makeManifestReceiver(PACKAGE_GREEN, CLASS_RED),
                            makeManifestReceiver(PACKAGE_GREEN, CLASS_RED),
@@ -1164,7 +1166,7 @@ public class BroadcastQueueTest {


        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        final Intent timeZone = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
        final Intent timeZone = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, USER_GUEST, new ArrayList<>(
            enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, USER_GUEST, new ArrayList<>(
                    List.of(makeRegisteredReceiver(callerApp),
                    List.of(makeRegisteredReceiver(callerApp),
                            makeManifestReceiver(PACKAGE_GREEN, CLASS_RED, USER_GUEST),
                            makeManifestReceiver(PACKAGE_GREEN, CLASS_RED, USER_GUEST),
@@ -1204,7 +1206,7 @@ public class BroadcastQueueTest {
        final ProcessRecord oldApp = makeActiveProcessRecord(PACKAGE_GREEN);
        final ProcessRecord oldApp = makeActiveProcessRecord(PACKAGE_GREEN);


        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, new ArrayList<>(
            enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, new ArrayList<>(
                    List.of(makeRegisteredReceiver(oldApp),
                    List.of(makeRegisteredReceiver(oldApp),
                            makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN)))));
                            makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN)))));
@@ -1585,7 +1587,7 @@ public class BroadcastQueueTest {
        final Intent timezone = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
        final Intent timezone = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        airplane.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
        airplane.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            enqueueBroadcast(makeBroadcastRecord(timezone, callerApp,
            enqueueBroadcast(makeBroadcastRecord(timezone, callerApp,
                    List.of(makeRegisteredReceiver(receiverBlueApp, 10),
                    List.of(makeRegisteredReceiver(receiverBlueApp, 10),
                            makeRegisteredReceiver(receiverGreenApp, 10),
                            makeRegisteredReceiver(receiverGreenApp, 10),
@@ -1638,7 +1640,7 @@ public class BroadcastQueueTest {
        final IIntentReceiver resultToFirst = mock(IIntentReceiver.class);
        final IIntentReceiver resultToFirst = mock(IIntentReceiver.class);
        final IIntentReceiver resultToSecond = mock(IIntentReceiver.class);
        final IIntentReceiver resultToSecond = mock(IIntentReceiver.class);


        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            enqueueBroadcast(makeOrderedBroadcastRecord(timezoneFirst, callerApp,
            enqueueBroadcast(makeOrderedBroadcastRecord(timezoneFirst, callerApp,
                    List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
                    List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
                            makeManifestReceiver(PACKAGE_BLUE, CLASS_GREEN)),
                            makeManifestReceiver(PACKAGE_BLUE, CLASS_GREEN)),
@@ -1729,7 +1731,7 @@ public class BroadcastQueueTest {
        timeTickFirst.putExtra(Intent.EXTRA_INDEX, "third");
        timeTickFirst.putExtra(Intent.EXTRA_INDEX, "third");
        timeTickThird.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
        timeTickThird.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);


        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            enqueueBroadcast(makeBroadcastRecord(timeTickFirst, callerApp,
            enqueueBroadcast(makeBroadcastRecord(timeTickFirst, callerApp,
                    List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE))));
                    List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE))));
            enqueueBroadcast(makeBroadcastRecord(timeTickSecond, callerApp,
            enqueueBroadcast(makeBroadcastRecord(timeTickSecond, callerApp,
@@ -1771,7 +1773,7 @@ public class BroadcastQueueTest {
        assertTrue(mQueue.isIdleLocked());
        assertTrue(mQueue.isIdleLocked());
        assertTrue(mQueue.isBeyondBarrierLocked(beforeFirst));
        assertTrue(mQueue.isBeyondBarrierLocked(beforeFirst));


        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            final Intent timezone = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
            final Intent timezone = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
            enqueueBroadcast(makeBroadcastRecord(timezone, callerApp,
            enqueueBroadcast(makeBroadcastRecord(timezone, callerApp,
                    List.of(makeRegisteredReceiver(receiverApp))));
                    List.of(makeRegisteredReceiver(receiverApp))));
@@ -1865,7 +1867,7 @@ public class BroadcastQueueTest {
        final ProcessRecord receiverBlueApp = makeActiveProcessRecord(PACKAGE_BLUE);
        final ProcessRecord receiverBlueApp = makeActiveProcessRecord(PACKAGE_BLUE);


        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        try (SyncBarrier b = new SyncBarrier()) {
        try (SyncBarrier b = new SyncBarrier(mHandlerThread)) {
            final Object greenReceiver = makeRegisteredReceiver(receiverGreenApp);
            final Object greenReceiver = makeRegisteredReceiver(receiverGreenApp);
            final Object blueReceiver = makeRegisteredReceiver(receiverBlueApp);
            final Object blueReceiver = makeRegisteredReceiver(receiverBlueApp);
            final Object yellowReceiver = makeManifestReceiver(PACKAGE_YELLOW, CLASS_YELLOW);
            final Object yellowReceiver = makeManifestReceiver(PACKAGE_YELLOW, CLASS_YELLOW);