当前位置:首页 > Android BatteryStatsHelper深入理解(and5.1)
Log.e(\ continue; }
if (\ continue; } } final UserHandle userHandle = new UserHandle(UserHandle.getUserId(sipper.getUid()));
final BatteryEntry entry = new BatteryEntry(getActivity(), mHandler, mUm, sipper);
final Drawable badgedIcon = mUm.getBadgedIconForUser(entry.getIcon(), userHandle); final CharSequence contentDescription = mUm.getBadgedLabelForUser(entry.getLabel(), userHandle);
final PowerGaugePreference pref = new PowerGaugePreference(getActivity(), badgedIcon, contentDescription, entry);
final double percentOfMax = (sipper.value * 100) / mStatsHelper.getMaxPower(); sipper.percent = percentOfTotal; pref.setTitle(entry.getLabel()); pref.setOrder(i + 1);
pref.setPercent(percentOfMax, percentOfTotal); if (sipper.uidObj != null) {
pref.setKey(Integer.toString(sipper.uidObj.getUid())); }
addedSome = true;
mAppListGroup.addPreference(pref);
if (mAppListGroup.getPreferenceCount() > (MAX_ITEMS_TO_LIST + 1)) { break; } } }
if (!addedSome) {//如果走到这里会显示\没有电池数据\,要么power_profile.xml没有配置,要么每项都continue
addNotAvailableMessage(); }
BatteryEntry.startRequestQueue(); }
碰到一个问题当电池电量到90%,拔去usb线,settings会显示“没有电池使用数据”,带着这个问题,我们再来看看BatteryStatsImpl:
我们先来看看BatteryStatsHelper中refreshStats函数中的一段代码,如何统计mTotalPower,先会计算一个mComputedPower,会把每个usage的power累计相加,然后下面还有一段代码,mStats.getLowDischargeAmountSinceCharge是什么意思呢?带着这个问题再去看BatteryStatsImpl的代码。 [java] view plain copy
public void refreshStats(int statsType, SparseArray
mTotalPower = mComputedPower;
if (mStats.getLowDischargeAmountSinceCharge() > 1) {// if (mMinDrainedPower > mComputedPower) {
double amount = mMinDrainedPower - mComputedPower; mTotalPower = mMinDrainedPower;
addEntryNoTotal(BatterySipper.DrainType.UNACCOUNTED, 0, amount); } else if (mMaxDrainedPower < mComputedPower) {
double amount = mComputedPower - mMaxDrainedPower;
addEntryNoTotal(BatterySipper.DrainType.OVERCOUNTED, 0, amount); } }
Collections.sort(mUsageList); }
先看BatteryStatsImpl中getLowDischargeAmountSinceCharge函数,直接从代码中找哪里改变了这个变量mLowDischargeAmountSinceCharge [java] view plain copy @Override
public int getLowDischargeAmountSinceCharge() { synchronized(this) {
int val = mLowDischargeAmountSinceCharge;
if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { val += mDischargeUnplugLevel-mDischargeCurrentLevel-1; }
return val; } }
发现在setOnBatteryLocked函数中会改变其值,而setOnBatteryLocked函数是有BatteryService调用,只有当充电方式改变才会掉,而我们这段代码代表,只有插上usb线会调用,level代表当前电量,mDischargeUnplugLevel代表上一次拔去usb线的电量,这就代表上次拔去usb线后,电量level减少了,就是耗电了,在这次充电的时候把之前的耗电统计下,放在mLowDischargeAmountSinceCharge 和mHighDischargeAmountSinceCharge 这两个变量中,这两个变量差1,就是有一个误差的范围而已。
[java] view plain copy
void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, final boolean onBattery,
final int oldStatus, final int level) { else {
mOnBattery = mOnBatteryInternal = onBattery; pullPendingStateUpdatesLocked();
mHistoryCur.batteryLevel = (byte)level;
mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, \ + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(mSecRealtime, mSecUptime); mDischargeCurrentLevel = mDischargePlugLevel = level;
if (level < mDischargeUnplugLevel) {//level代表当前电量,mDischargeUnplugLevel代表上一次拔去usb线的电量
mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;//累计消耗的电量
mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; }
updateDischargeScreenLevelsLocked(screenOn, screenOn); updateTimeBasesLocked(false, !screenOn, uptime, realtime); mNumChargeStepDurations = 0; mLastChargeStepLevel = level; mMaxChargeStepLevel = level; mLastChargeStepTime = -1;
mInitStepMode = mCurStepMode; mModStepMode = 0; }
现在我们再来看看getLowDischargeAmountSinceCharge函数。 [java] view plain copy @Override
public int getLowDischargeAmountSinceCharge() { synchronized(this) {
int val = mLowDischargeAmountSinceCharge;
if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {//表示现在正在用电状态,mDischargeCurrentLevel 变量代表用电的时候的电量,会时时更新,mDischargeUnplugLevel代表上一次拔去usb线的一个电量,也就是最近的一次消耗电量 val += mDiscwww.sm136.comhargeUnplugLevel-mDischargeCurrentLevel-1; }
return val; } }
最近一次的消耗电量加上之前累计的消耗电量就是总的消耗电量了。 下面看看几个关键变量
[java] view plain copy
void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, final boolean onBattery,
final int oldStatus, final int level) { boolean doWrite = false;
Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); m.arg1 = onBattery ? 1 : 0; mHandler.sendMessage(m);
final long uptime = mSecUptime * 1000; final long realtime = mSecRealtime * 1000;
final boolean screenOn = mScreenState == Display.STATE_ON; if (onBattery) { 。。。。。。。。。。
addHistoryRecordLocked(mSecRealtime, mSecUptime);
mDischargeCurrentLevel = mDischargeUnplugLevel = level;//刚拔去usb线的时候统计下mDischargeCurrentLevel和mDischargeUnplugLevel值 if (screenOn) {
mDischargeScreenOnUnplugLevel = level; mDischargeScreenOffUnplugLevel = 0; } else {
mDischargeScreenOnUnplugLevel = 0; mDischargeScreenOffUnplugLevel = level; }
mDischargeAmountScreenOn = 0; mDischargeAmountScreenOff = 0;
updateTimeBasesLocked(true, !screenOn, uptime, realtime); } else {
mOnBattery = mOnBatteryInternal = onBattery; pullPendingStateUpdatesLocked();
mHistoryCur.batteryLevel = (byte)level;
mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, \ + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(mSecRealtime, mSecUptime);
mDischargeCurrentLevel = mDischargePlugLevel = level;//刚插上usb线的时候统计下mDischargeCurrentLevel和mDischargePlugLevel值
setBatteryState是BatteryService时时调的,而setOnBatteryLocked只有充电方式改变后才会调用。
[java] view plain copy
public void setBatteryState(int status, int health, int plugType, int level, int temp, int volt) { synchronized(this) {
final boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
共分享92篇相关文档