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

Commit f50e78d8 authored by Adam Bookatz's avatar Adam Bookatz Committed by Android (Google) Code Review
Browse files

Merge "Fix statsd ble scan logging" into pi-dev

parents 8d2404d1 e5ec0b44
Loading
Loading
Loading
Loading
+10 −17
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ message Atom {
    oneof pushed {
        // For StatsLog reasons, 1 is illegal and will not work. Must start at 2.
        BleScanStateChanged ble_scan_state_changed = 2;
        BleUnoptimizedScanStateChanged ble_unoptimized_scan_state_changed = 3;
        // TODO: 3 is blank, but need not be
        BleScanResultReceived ble_scan_result_received = 4;
        SensorStateChanged sensor_state_changed = 5;
        GpsScanStateChanged gps_scan_state_changed = 6;
@@ -247,31 +247,24 @@ message ProcessLifeCycleStateChanged {
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
// TODO: Consider changing to tracking per-scanner-id (log from AppScanStats).
message BleScanStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
        // RESET indicates all ble stopped. Used when it (re)starts (e.g. after it crashes).
        RESET = 2;
    }
    optional State state = 2;
}

/**
 * Logs when an unoptimized ble scan state changes.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
// TODO: Consider changing to tracking per-scanner-id (log from AppScanStats).
message BleUnoptimizedScanStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 2;
    // Does the scan have a filter.
    optional bool is_filtered = 3;
    // Whether the scan is a CALLBACK_TYPE_FIRST_MATCH scan. Called 'background' scan internally.
    optional bool is_first_match = 4;
    // Whether the scan set to piggy-back off the results of other scans (SCAN_MODE_OPPORTUNISTIC).
    optional bool is_opportunistic = 5;
}

/**
+0 −111
Original line number Diff line number Diff line
@@ -5666,29 +5666,7 @@ public class BatteryStatsImpl extends BatteryStats {
            mBluetoothScanTimer.startRunningLocked(elapsedRealtime);
        }
        mBluetoothScanNesting++;
        if (workChain != null) {
            StatsLog.write(StatsLog.BLE_SCAN_STATE_CHANGED,
                    workChain.getUids(), workChain.getTags(),
                    StatsLog.BLE_SCAN_STATE_CHANGED__STATE__ON);
            if (isUnoptimized) {
                StatsLog.write(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED,
                        workChain.getUids(), workChain.getTags(),
                        StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__ON);
            }
        } else {
            StatsLog.write_non_chained(StatsLog.BLE_SCAN_STATE_CHANGED, uid, null,
                    StatsLog.BLE_SCAN_STATE_CHANGED__STATE__ON);
            if (isUnoptimized) {
                StatsLog.write_non_chained(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED, uid, null,
                        StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__ON);
            }
        }
        getUidStatsLocked(uid).noteBluetoothScanStartedLocked(elapsedRealtime, isUnoptimized);
        if (workChain != null) {
            getUidStatsLocked(uid).addBluetoothWorkChain(workChain, isUnoptimized);
        }
    }
    public void noteBluetoothScanStartedFromSourceLocked(WorkSource ws, boolean isUnoptimized) {
@@ -5718,29 +5696,7 @@ public class BatteryStatsImpl extends BatteryStats {
            addHistoryRecordLocked(elapsedRealtime, uptime);
            mBluetoothScanTimer.stopRunningLocked(elapsedRealtime);
        }
        if (workChain != null) {
            StatsLog.write(
                    StatsLog.BLE_SCAN_STATE_CHANGED, workChain.getUids(), workChain.getTags(),
                    StatsLog.BLE_SCAN_STATE_CHANGED__STATE__OFF);
            if (isUnoptimized) {
                StatsLog.write(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED,
                        workChain.getUids(), workChain.getTags(),
                        StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__OFF);
            }
        } else {
            StatsLog.write_non_chained(StatsLog.BLE_SCAN_STATE_CHANGED, uid, null,
                    StatsLog.BLE_SCAN_STATE_CHANGED__STATE__OFF);
            if (isUnoptimized) {
                StatsLog.write_non_chained(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED, uid, null,
                        StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__OFF);
            }
        }
        getUidStatsLocked(uid).noteBluetoothScanStoppedLocked(elapsedRealtime, isUnoptimized);
        if (workChain != null) {
            getUidStatsLocked(uid).removeBluetoothWorkChain(workChain, isUnoptimized);
        }
    }
    private int getAttributionUid(int uid, WorkChain workChain) {
@@ -5775,33 +5731,9 @@ public class BatteryStatsImpl extends BatteryStats {
                    + Integer.toHexString(mHistoryCur.states2));
            addHistoryRecordLocked(elapsedRealtime, uptime);
            mBluetoothScanTimer.stopAllRunningLocked(elapsedRealtime);
            for (int i=0; i<mUidStats.size(); i++) {
                BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
                uid.noteResetBluetoothScanLocked(elapsedRealtime);
                List<WorkChain> allWorkChains = uid.getAllBluetoothWorkChains();
                if (allWorkChains != null) {
                    for (int j = 0; j < allWorkChains.size(); ++j) {
                        StatsLog.write(StatsLog.BLE_SCAN_STATE_CHANGED,
                                allWorkChains.get(j).getUids(),
                                allWorkChains.get(j).getTags(),
                                StatsLog.BLE_SCAN_STATE_CHANGED__STATE__OFF);
                    }
                    allWorkChains.clear();
                }
                List<WorkChain> unoptimizedWorkChains = uid.getUnoptimizedBluetoothWorkChains();
                if (unoptimizedWorkChains != null) {
                    for (int j = 0; j < unoptimizedWorkChains.size(); ++j) {
                        StatsLog.write(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED,
                                unoptimizedWorkChains.get(j).getUids(),
                                unoptimizedWorkChains.get(j).getTags(),
                                StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__OFF);
                    }
                    unoptimizedWorkChains.clear();
                }
            }
        }
    }
@@ -6873,15 +6805,6 @@ public class BatteryStatsImpl extends BatteryStats {
         */
        final SparseArray<Pid> mPids = new SparseArray<>();
        /**
         * The list of WorkChains associated with active bluetooth scans.
         *
         * NOTE: This is a hack and it only needs to exist because there's a "reset" API that is
         * supposed to stop and log all WorkChains that were currently active.
         */
        ArrayList<WorkChain> mAllBluetoothChains = null;
        ArrayList<WorkChain> mUnoptimizedBluetoothChains = null;
        public Uid(BatteryStatsImpl bsi, int uid) {
            mBsi = bsi;
            mUid = uid;
@@ -7410,40 +7333,6 @@ public class BatteryStatsImpl extends BatteryStats {
            }
        }
        public void addBluetoothWorkChain(WorkChain workChain, boolean isUnoptimized) {
            if (mAllBluetoothChains == null) {
                mAllBluetoothChains = new ArrayList<WorkChain>(4);
            }
            if (isUnoptimized && mUnoptimizedBluetoothChains == null) {
                mUnoptimizedBluetoothChains = new ArrayList<WorkChain>(4);
            }
            mAllBluetoothChains.add(workChain);
            if (isUnoptimized) {
                mUnoptimizedBluetoothChains.add(workChain);
            }
        }
        public void removeBluetoothWorkChain(WorkChain workChain, boolean isUnoptimized) {
            if (mAllBluetoothChains != null) {
                mAllBluetoothChains.remove(workChain);
            }
            if (isUnoptimized && mUnoptimizedBluetoothChains != null) {
                mUnoptimizedBluetoothChains.remove(workChain);
            }
        }
        public List<WorkChain> getAllBluetoothWorkChains() {
            return mAllBluetoothChains;
        }
        public List<WorkChain> getUnoptimizedBluetoothWorkChains() {
            return mUnoptimizedBluetoothChains;
        }
        public void noteResetBluetoothScanLocked(long elapsedRealtimeMs) {
            if (mBluetoothScanTimer != null) {
                mBluetoothScanTimer.stopAllRunningLocked(elapsedRealtimeMs);
+0 −47
Original line number Diff line number Diff line
@@ -272,53 +272,6 @@ public class BatteryStatsBackgroundStatsTest extends TestCase {
        assertEquals((3004 - 2001) * 1000, badBgTime);
    }

    @SmallTest
    public void testAppBluetoothScan_workChainAccounting() throws Exception {
        final MockClocks clocks = new MockClocks();MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
        long curr = 0; // realtime in us

        // On battery
        curr = 1000 * (clocks.realtime = clocks.uptime = 100);
        bi.updateTimeBasesLocked(true, Display.STATE_ON, curr, curr); // on battery

        // App in foreground
        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);

        WorkSource ws = new WorkSource();
        ws.createWorkChain().addNode(500, "foo");
        ws.createWorkChain().addNode(500, "bar");

        // Test start / stop and reset with isUnoptimized == false.
        bi.noteBluetoothScanStartedFromSourceLocked(ws, false);
        BatteryStatsImpl.Uid stats = (BatteryStatsImpl.Uid) bi.getUidStats().get(500);
        assertEquals(ws.getWorkChains(), stats.getAllBluetoothWorkChains());
        assertNull(stats.getUnoptimizedBluetoothWorkChains());

        bi.noteBluetoothScanStoppedFromSourceLocked(ws, false);
        assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
        assertNull(stats.getUnoptimizedBluetoothWorkChains());

        bi.noteBluetoothScanStartedFromSourceLocked(ws, false);
        bi.noteResetBluetoothScanLocked();
        assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
        assertNull(stats.getUnoptimizedBluetoothWorkChains());

        // Test start / stop  and reset with isUnoptimized == true.
        bi.noteBluetoothScanStartedFromSourceLocked(ws, true);
        stats = (BatteryStatsImpl.Uid) bi.getUidStats().get(500);
        assertEquals(ws.getWorkChains(), stats.getAllBluetoothWorkChains());
        assertEquals(ws.getWorkChains(), stats.getUnoptimizedBluetoothWorkChains());

        bi.noteBluetoothScanStoppedFromSourceLocked(ws, true);
        assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
        assertTrue(stats.getUnoptimizedBluetoothWorkChains().isEmpty());

        bi.noteBluetoothScanStartedFromSourceLocked(ws, true);
        bi.noteResetBluetoothScanLocked();
        assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
        assertTrue(stats.getUnoptimizedBluetoothWorkChains().isEmpty());
    }

    @SmallTest
    public void testJob() throws Exception {
        final MockClocks clocks = new MockClocks();