android 7.0 电量使用情况分析
2017-08-18 本文已影响0人
拉赫曼
主要概括为如下四点
- 单项耗电百分比=(单项耗电量/总共耗电量)*总计耗电百分比
- 小于0.5%的项不显示在列表中,采用四舍五入显示百分比
- 当处于充电状态满足以下四个条件时清空电量使用记录:
(1)没有自动重置且之前充满过电
(2)当前电量大于90%
(3)上次掉电时(充电前)的电量小于20%,当前电量大于80%
(4)总共耗电 大于200%,且电池记录缓存已满( 256*1024; // 256KB) - 当电池充满电不再充电时,停止记录电量使用记录,并在下一次拔出USB/电源时清空记录
代码分析
Settings模块 PowerUseageSummary.java
refreshStats()方法:
//某一项(屏幕\WIFI\BT..)耗电量的百分比计算公式 = (该项耗电量(mah)/总共耗电量(mah)) * 总计百分比
final double percentOfTotal = ((sipper.totalPowerMah / totalPower) * dischargeAmount);
...
if (((int) (percentOfTotal + .5)) < 1) { // 小于0.5%的耗电项不显示
continue;
}
// 将该百分比设置到视图中
pref.setPercent(percentOfMax, percentOfTotal);
// setPercent 实现如下:
mProgress = Utils.formatPercentage((int) (percentOfTotal + 0.5));//四舍五入
清空电量使用记录
frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
1. setOnBatteryLocked 方法 (该方法只有在充电状态变化时调用)
if (onBattery) { //在充电状态进行如下判断
// We will reset our status if we are unplugging after the
// battery was last full, or the level is at 100, or
// we have gone through a significant charge (from a very low
// level to a now very high level).
boolean reset = false;
// 满足如下四个条件则清空电量使用记录
if (!mNoAutoReset && (oldStatus == BatteryManager.BATTERY_STATUS_FULL //没有自动重置且之前充满过电
|| level >= 90 //当前电量大于90%
|| (mDischargeCurrentLevel < 20 && level >= 80) //上次掉电时(充电前)的电量小于20%,当前电量大于80%
|| (getHighDischargeAmountSinceCharge() >= 200 && mHistoryBuffer.dataSize() >= MAX_HISTORY_BUFFER))) { // 总共耗电 大于200,且电池记录缓存已满( 256*1024; // 256KB)
...
reset = true;
...
}
...
if (reset) {
mRecordingHistory = true;
startRecordingHistory(mSecRealtime, mSecUptime, reset);//重置电量使用记录,开始新的记录
}
}
2. setBatteryStateLocked 方法
...
// 当电池充满电不再充电时,停止记录电量使用记录,并在下一次拔出USB/电源时清空记录
if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
// We don't record history while we are plugged in and fully charged.
// The next time we are unplugged, history will be cleared.
mRecordingHistory = DEBUG;// DEBUG = false
}