Battery Stats Reset的4大原因:
一、读电池文件异常执行reset[BatteryStatsImpl.RESET_REASON_CORRUPT_FILE]
-
超过200个持锁;
-
超过200个syn或job;
-
超过1000个sensor;
-
超过1000个processes;
-
超过1000个应用;
-
超过1000个alarm
-
超过10000个service
二、命令行执行reset[BatteryStatsImpl.RESET_REASON_ADB_COMMAND]
adb dumpsys batterystats --reset
三、充电执行reset[BatteryStatsImpl.RESET_REASON_FULL_CHARGE]
-
充满电状态
-
电量百分比90%以上,
-
电量百分比从20%以下到80%以上
-
充电期间累计总充电量百分比>200%
四、开机检测到power buckets改变执行reset[BatteryStatsImpl.RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE]
每次开机检测当前机型所支持的POWER_BUCKET_的类别和数量是否发生改变,若和上次开机不同,则表示可能存在兼容性差异(MeasuredEnergyStatsConfig.isCompatible(config)),需要reset 可能场景举例:换电池或刷其他power_profile的版本
--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
@IntDef(prefix = {"POWER_BUCKET_"}, value = {
POWER_BUCKET_UNKNOWN,
POWER_BUCKET_SCREEN_ON,
POWER_BUCKET_SCREEN_DOZE,
POWER_BUCKET_SCREEN_OTHER,
POWER_BUCKET_CPU,
POWER_BUCKET_WIFI,
POWER_BUCKET_BLUETOOTH,
POWER_BUCKET_GNSS,
POWER_BUCKET_MOBILE_RADIO,
})
private static final int[] SUPPORTED_PER_PROCESS_STATE_STANDARD_ENERGY_BUCKETS = {
MeasuredEnergyStats.POWER_BUCKET_CPU, // CPU 电量消耗桶
MeasuredEnergyStats.POWER_BUCKET_MOBILE_RADIO,// Modem 电量消耗桶
MeasuredEnergyStats.POWER_BUCKET_WIFI,// WIFI 电量消耗桶
MeasuredEnergyStats.POWER_BUCKET_BLUETOOTH,// 蓝牙 电量消耗桶
};
本次开机检测到与上一次开机CPU、Modem、WIFI、蓝牙的电量消耗桶发生变化了,之前的数据可能不可靠,需要进行重置
--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
200 public static final int RESET_REASON_CORRUPT_FILE = 1;
201 public static final int RESET_REASON_ADB_COMMAND = 2;
202 public static final int RESET_REASON_FULL_CHARGE = 3;
203 public static final int RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE = 4;
15536 if (!mNoAutoReset && mSystemReady
15537 && (oldStatus == BatteryManager.BATTERY_STATUS_FULL
15538 || level >= 90
15539 || (mDischargeCurrentLevel < 20 && level >= 80)
15540 || getHighDischargeAmountSinceCharge() >= 200)) {
15541 Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus
15542 + " dischargeLevel=" + mDischargeCurrentLevel
15543 + " lowAmount=" + getLowDischargeAmountSinceCharge()
15544 + " highAmount=" + getHighDischargeAmountSinceCharge());
267 private static final int[] SUPPORTED_PER_PROCESS_STATE_STANDARD_ENERGY_BUCKETS = {
268 MeasuredEnergyStats.POWER_BUCKET_CPU,
269 MeasuredEnergyStats.POWER_BUCKET_MOBILE_RADIO,
270 MeasuredEnergyStats.POWER_BUCKET_WIFI,
271 MeasuredEnergyStats.POWER_BUCKET_BLUETOOTH,
272 };
109 /**
110 * Returns true if the supplied Config is compatible with this one and therefore
111 * data collected with one of them will work with the other.
112 */
113 public boolean isCompatible(Config other) {
114 return Arrays.equals(mSupportedStandardBuckets, other.mSupportedStandardBuckets)
115 && Arrays.equals(mCustomBucketNames, other.mCustomBucketNames)
116 && Arrays.equals(mSupportedMultiStateBuckets,
117 other.mSupportedMultiStateBuckets)
118 && Arrays.equals(mStateNames, other.mStateNames);
119 }
logcat|grep -Ei "isCompatible|initEnergyConsumerStatsLocked"