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

Commit 698f7a06 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Switch to tron events for battery saver logging

Bug: 73293341
Bug: 73296226
Test: atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
Test: manual test
Change-Id: I2230a4968b985a2a357b535c980deb1f8adb64df
parent 67d9a90b
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -5229,6 +5229,34 @@ message MetricsEvent {
    // OS: P
    DIALOG_TV_NETWORK_PROXY = 1301;

    // Events for battery saver turning on/off and/or the interactive state changes.
    // OS: P
    BATTERY_SAVER = 1302;

    // Device interactive state -- i.e. the screen ON (=1) or OFF (=1)
    // OS: P
    FIELD_INTERACTIVE = 1303;

    // Time spent in milliseconds in the current mode.
    // OS: P
    FIELD_DURATION_MILLIS = 1304;

    // Battery level in uA (0 - ~3,000,000 depending on device) when the current "mode" started.
    // OS: P
    FIELD_START_BATTERY_UA = 1305;

    // Battery level in uA (0 - ~3,000,000 depending on device) when this event was created.
    // OS: P
    FIELD_END_BATTERY_UA = 1306;

    // Battery level in % (0-100) when the current "mode" started.
    // OS: P
    FIELD_START_BATTERY_PERCENT = 1307;

    // Battery level in % (0-100) when this event was created.
    // OS: P
    FIELD_END_BATTERY_PERCENT = 1308;

    // ---- End P Constants, all P constants go above this line ----
    // Add new aosp constants above this line.
    // END OF AOSP CONSTANTS
+26 −25
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package com.android.server.power.batterysaver;

import android.metrics.LogMaker;
import android.os.BatteryManagerInternal;
import android.os.SystemClock;
import android.util.ArrayMap;
@@ -23,6 +24,8 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.power.BatterySaverPolicy;
@@ -43,6 +46,9 @@ public class BatterySavingStats {

    private static final boolean DEBUG = BatterySaverPolicy.DEBUG;

    @VisibleForTesting
    static final boolean SEND_TRON_EVENTS = true;

    private final Object mLock = new Object();

    /** Whether battery saver is on or off. */
@@ -132,15 +138,6 @@ public class BatterySavingStats {
        }
    }

    @VisibleForTesting
    static final String COUNTER_POWER_PERCENT_PREFIX = "battery_saver_stats_percent_";

    @VisibleForTesting
    static final String COUNTER_POWER_MILLIAMPS_PREFIX = "battery_saver_stats_milliamps_";

    @VisibleForTesting
    static final String COUNTER_TIME_SECONDS_PREFIX = "battery_saver_stats_seconds_";

    private static BatterySavingStats sInstance;

    private BatteryManagerInternal mBatteryManagerInternal;
@@ -427,10 +424,9 @@ public class BatterySavingStats {
            if (stateChanging) {
                if (mLastState >= 0) {
                    final long deltaTime = now - mStartTime;
                    final int deltaBattery = mStartBatteryLevel - batteryLevel;
                    final int deltaPercent = mStartPercent - batteryPercent;

                    report(mLastState, deltaTime, deltaBattery, deltaPercent);
                    report(mLastState, deltaTime, mStartBatteryLevel, mStartPercent,
                            batteryLevel, batteryPercent);
                }
                mStartTime = now;
                mStartBatteryLevel = batteryLevel;
@@ -439,23 +435,28 @@ public class BatterySavingStats {
            mLastState = newState;
        }

        String getCounterSuffix(int state) {
            final boolean batterySaver =
        void report(int state, long deltaTimeMs,
                int startBatteryLevelUa, int startBatteryLevelPercent,
                int endBatteryLevelUa, int endBatteryLevelPercent) {
            if (!SEND_TRON_EVENTS) {
                return;
            }
            final boolean batterySaverOn =
                    BatterySaverState.fromIndex(state) != BatterySaverState.OFF;
            final boolean interactive =
                    InteractiveState.fromIndex(state) != InteractiveState.NON_INTERACTIVE;
            if (batterySaver) {
                return interactive ? "11" : "10";
            } else {
                return interactive ? "01" : "00";
            }
        }

        void report(int state, long deltaTimeMs, int deltaBatteryUa, int deltaPercent) {
            final String suffix = getCounterSuffix(state);
            mMetricsLogger.count(COUNTER_POWER_MILLIAMPS_PREFIX + suffix, deltaBatteryUa / 1000);
            mMetricsLogger.count(COUNTER_POWER_PERCENT_PREFIX + suffix, deltaPercent);
            mMetricsLogger.count(COUNTER_TIME_SECONDS_PREFIX + suffix, (int) (deltaTimeMs / 1000));
            final LogMaker logMaker = new LogMaker(MetricsProto.MetricsEvent.BATTERY_SAVER)
                    .setSubtype(batterySaverOn ? 1 : 0)
                    .addTaggedData(MetricsEvent.FIELD_INTERACTIVE, interactive ? 1 : 0)
                    .addTaggedData(MetricsEvent.FIELD_DURATION_MILLIS, deltaTimeMs)
                    .addTaggedData(MetricsEvent.FIELD_START_BATTERY_UA, startBatteryLevelUa)
                    .addTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT,
                            startBatteryLevelPercent)
                    .addTaggedData(MetricsEvent.FIELD_END_BATTERY_UA, endBatteryLevelUa)
                    .addTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT, endBatteryLevelPercent);

            mMetricsLogger.write(logMaker);
        }
    }
}
+32 −15
Original line number Diff line number Diff line
@@ -15,25 +15,30 @@
 */
package com.android.server.power.batterysaver;

import static com.android.server.power.batterysaver.BatterySavingStats.SEND_TRON_EVENTS;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.metrics.LogMaker;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState;
import com.android.server.power.batterysaver.BatterySavingStats.DozeState;
import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;

import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
@@ -222,8 +227,28 @@ public class BatterySavingStatsTest {
                target.toDebugString());
    }

    private void assertMetricsLog(String counter, int value) {
        verify(mMetricsLogger, times(1)).count(eq(counter), eq(value));
    private void assertLog(boolean batterySaver, boolean interactive, long deltaTimeMs,
            int deltaBatteryLevelUa, int deltaBatteryLevelPercent) {
        if (SEND_TRON_EVENTS) {
            ArgumentCaptor<LogMaker> ac = ArgumentCaptor.forClass(LogMaker.class);
            verify(mMetricsLogger, times(1)).write(ac.capture());

            LogMaker lm = ac.getValue();
            assertEquals(MetricsEvent.BATTERY_SAVER, lm.getCategory());
            assertEquals(batterySaver ? 1 : 0,
                    lm.getTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE));
            assertEquals(interactive ? 1 : 0, lm.getTaggedData(MetricsEvent.FIELD_INTERACTIVE));
            assertEquals(deltaTimeMs, lm.getTaggedData(MetricsEvent.FIELD_DURATION_MILLIS));

            assertEquals(deltaBatteryLevelUa,
                    (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_UA)
                            - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_UA));
            assertEquals(deltaBatteryLevelPercent,
                    (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT)
                            - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT));
        } else {
            verify(mMetricsLogger, times(0)).write(any(LogMaker.class));
        }
    }

    @Test
@@ -249,9 +274,7 @@ public class BatterySavingStatsTest {
                InteractiveState.NON_INTERACTIVE,
                DozeState.NOT_DOZING);

        assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "01", 2);
        assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "01", 200);
        assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "01", 60);
        assertLog(false, true, 60_000, 2000, 200);

        target.advanceClock(1);
        target.drainBattery(2000);
@@ -282,9 +305,7 @@ public class BatterySavingStatsTest {
                InteractiveState.INTERACTIVE,
                DozeState.NOT_DOZING);

        assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "00", 2 * 3);
        assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "00", 200 * 3);
        assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "00", 60 * 3);
        assertLog(false, false, 60_000 * 3, 2000 * 3, 200 * 3);

        target.advanceClock(10);
        target.drainBattery(10000);
@@ -292,9 +313,7 @@ public class BatterySavingStatsTest {
        reset(mMetricsLogger);
        target.startCharging();

        assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "11", 10);
        assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "11", 1000);
        assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "11", 60 * 10);
        assertLog(true, true, 60_000 * 10, 10000, 1000);

        target.advanceClock(1);
        target.drainBattery(2000);
@@ -312,8 +331,6 @@ public class BatterySavingStatsTest {

        target.startCharging();

        assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "10", 2);
        assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "10", 200);
        assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "10", 60);
        assertLog(true, false, 60_000, 2000, 200);
    }
}