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

Commit c733500d authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Add phenotype flag to disable battery saver tron log

- Also improve dumpsys power output.

Example:
===============================================================================
Battery saving stats:
  Battery Saver state: OFF
  Times enabled: 4

  Drain stats:
                     Battery saver OFF                          ON
  NonDoze NonIntr:      0m      0mAh(  0%)      0.0mAh/h          0m      0mAh(  0%)      0.0mAh/h
             Intr:      0m      0mAh(  0%)      0.0mAh/h          0m      0mAh(  0%)      0.0mAh/h
  Deep    NonIntr:      0m      0mAh(  0%)      0.0mAh/h          0m      0mAh(  0%)      0.0mAh/h
             Intr:      0m      0mAh(  0%)      0.0mAh/h          0m      0mAh(  0%)      0.0mAh/h
  Light   NonIntr:      0m      0mAh(  0%)      0.0mAh/h          0m      0mAh(  0%)      0.0mAh/h
             Intr:      0m      0mAh(  0%)      0.0mAh/h          0m      0mAh(  0%)      0.0mAh/h

Battery saver policy (*NOTE* they only apply when battery saver is ON):
  Settings: battery_saver_constants
    value: send_tron_log=true
  Settings: (overlay)
    value:

  vibration_disabled=true
  animation_disabled=false
  fullbackup_deferred=true
  keyvaluebackup_deferred=true
  firewall_disabled=false
  datasaver_disabled=true
  launch_boost_disabled=true
  :
===============================================================================

Bug: 74742911
Fix: 75024658
Test: atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
Test: Manual test with "settings put global battery_saver_constants send_tron_log=true" and
  "settings put global battery_saver_constants send_tron_log=false" with
  logcat | grep 'sysui_multi.*,1302,'

Change-Id: If0593273e21ace7899ac95642dc9feef2515eea1
parent edd7215f
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ public class BatterySaverPolicy extends ContentObserver {
    private static final String KEY_FORCE_BACKGROUND_CHECK = "force_background_check";
    private static final String KEY_OPTIONAL_SENSORS_DISABLED = "optional_sensors_disabled";
    private static final String KEY_AOD_DISABLED = "aod_disabled";
    private static final String KEY_SEND_TRON_LOG = "send_tron_log";

    private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i";
    private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n";
@@ -212,6 +213,12 @@ public class BatterySaverPolicy extends ContentObserver {
    @GuardedBy("mLock")
    private boolean mAodDisabled;

    /**
     * Whether BatterySavingStats should send tron events.
     */
    @GuardedBy("mLock")
    private boolean mSendTronLog;

    @GuardedBy("mLock")
    private Context mContext;

@@ -347,6 +354,7 @@ public class BatterySaverPolicy extends ContentObserver {
        mForceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK, true);
        mOptionalSensorsDisabled = parser.getBoolean(KEY_OPTIONAL_SENSORS_DISABLED, true);
        mAodDisabled = parser.getBoolean(KEY_AOD_DISABLED, true);
        mSendTronLog = parser.getBoolean(KEY_SEND_TRON_LOG, true);

        // Get default value from Settings.Secure
        final int defaultGpsMode = Settings.Secure.getInt(mContentResolver, SECURE_KEY_GPS_MODE,
@@ -384,10 +392,13 @@ public class BatterySaverPolicy extends ContentObserver {
        if (mLaunchBoostDisabled) sb.append("l");
        if (mOptionalSensorsDisabled) sb.append("S");
        if (mAodDisabled) sb.append("o");
        if (mSendTronLog) sb.append("t");

        sb.append(mGpsMode);

        mEventLogKeys = sb.toString();

        BatterySavingStats.getInstance().setSendTronLog(mSendTronLog);
    }

    /**
@@ -483,7 +494,10 @@ public class BatterySaverPolicy extends ContentObserver {
    public void dump(PrintWriter pw) {
        synchronized (mLock) {
            pw.println();
            pw.println("Battery saver policy");
            BatterySavingStats.getInstance().dump(pw, "");

            pw.println();
            pw.println("Battery saver policy (*NOTE* they only apply when battery saver is ON):");
            pw.println("  Settings: " + Settings.Global.BATTERY_SAVER_CONSTANTS);
            pw.println("    value: " + mSettings);
            pw.println("  Settings: " + mDeviceSpecificSettingsSource);
@@ -504,6 +518,7 @@ public class BatterySaverPolicy extends ContentObserver {
            pw.println("  " + KEY_FORCE_BACKGROUND_CHECK + "=" + mForceBackgroundCheck);
            pw.println("  " + KEY_OPTIONAL_SENSORS_DISABLED + "=" + mOptionalSensorsDisabled);
            pw.println("  " + KEY_AOD_DISABLED + "=" + mAodDisabled);
            pw.println("  " + KEY_SEND_TRON_LOG + "=" + mSendTronLog);
            pw.println();

            pw.print("  Interactive File values:\n");
@@ -512,9 +527,6 @@ public class BatterySaverPolicy extends ContentObserver {

            pw.print("  Noninteractive File values:\n");
            dumpMap(pw, "    ", mFilesForNoninteractive);
            pw.println();
            pw.println();
            BatterySavingStats.getInstance().dump(pw, "  ");
        }
    }

+68 −13
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.os.BatteryManagerInternal;
import android.os.SystemClock;
import android.util.ArrayMap;
import android.util.Slog;
import android.util.TimeUtils;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -31,6 +32,8 @@ import com.android.server.LocalServices;
import com.android.server.power.BatterySaverPolicy;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * This class keeps track of battery drain rate.
@@ -46,9 +49,6 @@ 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. */
@@ -159,8 +159,18 @@ public class BatterySavingStats {
    @GuardedBy("mLock")
    final ArrayMap<Integer, Stat> mStats = new ArrayMap<>();

    @GuardedBy("mLock")
    private int mBatterySaverEnabledCount = 0;

    @GuardedBy("mLock")
    private long mLastBatterySaverEnabledTime = 0;

    private final MetricsLoggerHelper mMetricsLoggerHelper = new MetricsLoggerHelper();

    @VisibleForTesting
    @GuardedBy("mLock")
    private boolean mSendTronLog;

    /**
     * Don't call it directly -- use {@link #getInstance()}. Not private for testing.
     * @param metricsLogger
@@ -178,6 +188,12 @@ public class BatterySavingStats {
        return sInstance;
    }

    public void setSendTronLog(boolean send) {
        synchronized (mLock) {
            mSendTronLog = send;
        }
    }

    private BatteryManagerInternal getBatteryManagerInternal() {
        if (mBatteryManagerInternal == null) {
            mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class);
@@ -291,9 +307,22 @@ public class BatterySavingStats {
        final int batteryLevel = injectBatteryLevel();
        final int batteryPercent = injectBatteryPercent();

        final boolean oldBatterySaverEnabled =
                BatterySaverState.fromIndex(mCurrentState) != BatterySaverState.OFF;
        final boolean newBatterySaverEnabled =
                BatterySaverState.fromIndex(newState) != BatterySaverState.OFF;
        if (oldBatterySaverEnabled != newBatterySaverEnabled) {
            if (newBatterySaverEnabled) {
                mBatterySaverEnabledCount++;
                mLastBatterySaverEnabledTime = injectCurrentTime();
            } else {
                mLastBatterySaverEnabledTime = 0;
            }
        }

        endLastStateLocked(now, batteryLevel, batteryPercent);
        startNewStateLocked(newState, now, batteryLevel, batteryPercent);
        mMetricsLoggerHelper.transitionState(newState, now, batteryLevel, batteryPercent);
        mMetricsLoggerHelper.transitionStateLocked(newState, now, batteryLevel, batteryPercent);
    }

    @GuardedBy("mLock")
@@ -358,12 +387,39 @@ public class BatterySavingStats {
    public void dump(PrintWriter pw, String indent) {
        synchronized (mLock) {
            pw.print(indent);
            pw.println("Battery Saving Stats:");
            pw.println("Battery saving stats:");

            indent = indent + "  ";

            pw.print(indent);
            pw.println("Battery Saver:     w/Off                                      w/On");
            pw.print("Battery Saver state: ");
            if (mLastBatterySaverEnabledTime == 0) {
                pw.print("OFF");
            } else {
                pw.print("ON since ");

                final long now = System.currentTimeMillis();
                final long nowElapsed = injectCurrentTime();

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                pw.print(sdf.format(new Date(now - nowElapsed + mLastBatterySaverEnabledTime)));

                pw.print(" ");
                TimeUtils.formatDuration(mLastBatterySaverEnabledTime, nowElapsed, pw);
            }
            pw.println();

            pw.print(indent);
            pw.print("Times enabled: ");
            pw.println(mBatterySaverEnabledCount);

            pw.println();

            pw.print(indent);
            pw.println("Drain stats:");

            pw.print(indent);
            pw.println("                   Battery saver OFF                          ON");
            dumpLineLocked(pw, indent, InteractiveState.NON_INTERACTIVE, "NonIntr",
                    DozeState.NOT_DOZING, "NonDoze");
            dumpLineLocked(pw, indent, InteractiveState.INTERACTIVE, "   Intr",
@@ -378,8 +434,6 @@ public class BatterySavingStats {
                    DozeState.LIGHT, "Light  ");
            dumpLineLocked(pw, indent, InteractiveState.INTERACTIVE, "   Intr",
                    DozeState.LIGHT, "       ");

            pw.println();
        }
    }

@@ -395,7 +449,7 @@ public class BatterySavingStats {
        final Stat offStat = getStat(BatterySaverState.OFF, interactiveState, dozeState);
        final Stat onStat = getStat(BatterySaverState.ON, interactiveState, dozeState);

        pw.println(String.format("%6dm %6dmA (%3d%%) %8.1fmA/h      %6dm %6dmA (%3d%%) %8.1fmA/h",
        pw.println(String.format("%6dm %6dmAh(%3d%%) %8.1fmAh/h     %6dm %6dmAh(%3d%%) %8.1fmAh/h",
                offStat.totalMinutes(),
                offStat.totalBatteryDrain / 1000,
                offStat.totalBatteryDrainPercent,
@@ -417,7 +471,8 @@ public class BatterySavingStats {
                (BatterySaverState.MASK << BatterySaverState.SHIFT) |
                (InteractiveState.MASK << InteractiveState.SHIFT);

        public void transitionState(int newState, long now, int batteryLevel, int batteryPercent) {
        public void transitionStateLocked(
                int newState, long now, int batteryLevel, int batteryPercent) {
            final boolean stateChanging =
                    ((mLastState >= 0) ^ (newState >= 0)) ||
                    (((mLastState ^ newState) & STATE_CHANGE_DETECT_MASK) != 0);
@@ -425,7 +480,7 @@ public class BatterySavingStats {
                if (mLastState >= 0) {
                    final long deltaTime = now - mStartTime;

                    report(mLastState, deltaTime, mStartBatteryLevel, mStartPercent,
                    reportLocked(mLastState, deltaTime, mStartBatteryLevel, mStartPercent,
                            batteryLevel, batteryPercent);
                }
                mStartTime = now;
@@ -435,10 +490,10 @@ public class BatterySavingStats {
            mLastState = newState;
        }

        void report(int state, long deltaTimeMs,
        void reportLocked(int state, long deltaTimeMs,
                int startBatteryLevelUa, int startBatteryLevelPercent,
                int endBatteryLevelUa, int endBatteryLevelPercent) {
            if (!SEND_TRON_EVENTS) {
            if (!mSendTronLog) {
                return;
            }
            final boolean batterySaverOn =
+30 −5
Original line number Diff line number Diff line
@@ -15,8 +15,6 @@
 */
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;
@@ -105,9 +103,23 @@ public class BatterySavingStatsTest {

    public MetricsLogger mMetricsLogger = mock(MetricsLogger.class);

    private boolean sendTronEvents;

    @Test
    public void testAll() {
    public void testAll_withTron() {
        sendTronEvents = true;
        checkAll();
    }

    @Test
    public void testAll_noTron() {
        sendTronEvents = false;
        checkAll();
    }

    private void checkAll() {
        final BatterySavingStatsTestable target = new BatterySavingStatsTestable();
        target.setSendTronLog(sendTronEvents);

        target.assertDumpable();

@@ -229,7 +241,7 @@ public class BatterySavingStatsTest {

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

@@ -251,9 +263,22 @@ public class BatterySavingStatsTest {
        }
    }


    @Test
    public void testMetricsLogger_withTron() {
        sendTronEvents = true;
        checkMetricsLogger();
    }

    @Test
    public void testMetricsLogger() {
    public void testMetricsLogger_noTron() {
        sendTronEvents = false;
        checkMetricsLogger();
    }

    private void checkMetricsLogger() {
        final BatterySavingStatsTestable target = new BatterySavingStatsTestable();
        target.setSendTronLog(sendTronEvents);

        target.advanceClock(1);
        target.drainBattery(1000);