最近遇到一个bug,手机充电到90%提示还剩18分钟充满,充到91%时,提示还剩20分钟充满,这一点也不符合逻辑,怎么越充越久。
先看下剩余充电时间的计算
frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
@Override
public long computeChargeTimeRemaining(long curTime) {
if (mOnBattery) {
// Not yet working.
return -1;
}
/* Broken
int curLevel = mCurrentBatteryLevel;
int plugLevel = mDischargePlugLevel;
if (plugLevel < 0 || curLevel < (plugLevel+1)) {
return -1;
}
long duration = computeBatteryRealtime(curTime, STATS_SINCE_UNPLUGGED);
if (duration < 1000*1000) {
return -1;
}
long usPerLevel = duration/(curLevel-plugLevel);
return usPerLevel * (100-curLevel);
*/
if (mChargeStepTracker.mNumStepDurations < 1) {
return -1;
}
long msPerLevel = mChargeStepTracker.computeTimePerLevel();
if (msPerLevel <= 0) {
return -1;
}
return (msPerLevel * (100-mCurrentBatteryLevel)) * 1000;
}
原理比较简单,先算上一次充1%电量的时间t,然后算出剩余充电时间t*(100-x),x为当前电量。
这种方法没有直接从内核层获取数据,完全就是根据之前的充电数据,估算出来的剩余充电时间。
电池接近满电的时间(也就是从恒流充电阶段进入恒压充电阶段 不同的电池也有差异,有的是80%,有的是90%),由于物理特性,流入电池的电流会越来越小,也就是越往上充,越难充(变现为充电慢)。
那可能就是充电越来越慢,导致算出来的充电时间越来越久,就下来需要抓kernel log,来证明自己的猜想。