From c733500d1de3db256f5f97b71920f55878b2156f Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Thu, 15 Mar 2018 17:04:34 -0700 Subject: [PATCH] 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 --- .../server/power/BatterySaverPolicy.java | 20 ++++- .../batterysaver/BatterySavingStats.java | 81 ++++++++++++++++--- .../batterysaver/BatterySavingStatsTest.java | 35 ++++++-- 3 files changed, 114 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/power/BatterySaverPolicy.java b/services/core/java/com/android/server/power/BatterySaverPolicy.java index 16336b308dbcf..483f974ab8b6f 100644 --- a/services/core/java/com/android/server/power/BatterySaverPolicy.java +++ b/services/core/java/com/android/server/power/BatterySaverPolicy.java @@ -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, " "); } } diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java b/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java index 5d76329eb8a14..4fd86860d8f99 100644 --- a/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java +++ b/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java @@ -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 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 = diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java index f7112d43443b1..0f3ca03fa6d70 100644 --- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java +++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java @@ -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 ac = ArgumentCaptor.forClass(LogMaker.class); verify(mMetricsLogger, times(1)).write(ac.capture()); @@ -251,9 +263,22 @@ public class BatterySavingStatsTest { } } + @Test - public void testMetricsLogger() { + public void testMetricsLogger_withTron() { + sendTronEvents = true; + checkMetricsLogger(); + } + + @Test + public void testMetricsLogger_noTron() { + sendTronEvents = false; + checkMetricsLogger(); + } + + private void checkMetricsLogger() { final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); + target.setSendTronLog(sendTronEvents); target.advanceClock(1); target.drainBattery(1000);