已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android BatteryStatsHelper深入理解(and5.1)BatteryStatsHelper这个类主要是统计各个应用,多用户的每个用户,以及蓝牙,屏幕等耗电统计。一般使用BatteryStatsHelper这个类,先要new一个实例,然后再调用create函数:下面我们就先从create分析,两种create方法,其中sStatsXfer是静态的java view plain copypublic void create(BatteryStats stats) mPowerProfile = new PowerProfile(mContext); mStats = stats; public void create(Bundle icicle) if (icicle != null) mStats = sStatsXfer; mBatteryBroadcast = sBatteryBroadcastXfer; mBatteryInfo = IBatteryStats.Stub.asInterface( ServiceManager.getService(BatteryStats.SERVICE_NAME); mPowerProfile = new PowerProfile(mContext); mPowerProfile是从power_profile.xml读取的各个器件的电源消耗参数,文件如下:java view plain copy 0 100 200 90.5 2.5 1.25 130 100 30.5 72.5 135 5.3 30 3.5 2.4 624000 699563 799500 899438 999375 1099313 1199250 1299188 1399125 1499063 1599000 2.2 /各个cpu频段的功耗 54 63 72 80 90 100 109 115 121 127 135 2000 接下来说下refreshStats是用来更新电池最新状态的,statsType是指充电状态还是非充电状态,asUsers指的是userId(多用户)java view plain copypublic void refreshStats(int statsType, List asUsers) final int n = asUsers.size(); SparseArray users = new SparseArray(n); for (int i = 0; i n; +i) UserHandle userHandle = asUsers.get(i); users.put(userHandle.getIdentifier(), userHandle); refreshStats(statsType, users); /* * Refreshes the power usage list. */ public void refreshStats(int statsType, SparseArray asUsers) refreshStats(statsType, asUsers, SystemClock.elapsedRealtime() * 1000, SystemClock.uptimeMillis() * 1000); 接下来分析下refreshStats函数java view plain copypublic void refreshStats(int statsType, SparseArray asUsers, long rawRealtimeUs, long rawUptimeUs) / Initialize mStats if necessary. getStats(); mMaxPower = 0; mMaxRealPower = 0; mComputedPower = 0; mTotalPower = 0; mWifiPower = 0; mBluetoothPower = 0; mAppMobileActive = 0; mAppWifiRunning = 0; mUsageList.clear(); mWifiSippers.clear(); mBluetoothSippers.clear(); mUserSippers.clear(); mUserPower.clear(); mMobilemsppList.clear(); if (mStats = null) return; mStatsType = statsType; mRawUptime = rawUptimeUs; mRawRealtime = rawRealtimeUs; mBatteryUptime = mStats.getBatteryUptime(rawUptimeUs); mBatteryRealtime = mStats.getBatteryRealtime(rawRealtimeUs); mTypeBatteryUptime = mSputeBatteryUptime(rawUptimeUs, mStatsType); mTypeBatteryRealtime = mSputeBatteryRealtime(rawRealtimeUs, mStatsType); mBatteryTimeRemaining = mSputeBatteryTimeRemaining(rawRealtimeUs);/获取电池剩余时间 mChargeTimeRemaining = mSputeChargeTimeRemaining(rawRealtimeUs);/获取充电剩余时间 if (DEBUG) Log.d(TAG, Raw time: realtime= + (rawRealtimeUs/1000) + uptime= + (rawUptimeUs/1000); Log.d(TAG, Battery time: realtime= + (mBatteryRealtime/1000) + uptime= + (mBatteryUptime/1000); Log.d(TAG, Battery type time: realtime= + (mTypeBatteryRealtime/1000) + uptime= + (mTypeBatteryUptime/1000); mMinDrainedPower = (mStats.getLowDischargeAmountSinceCharge() * mPowerProfile.getBatteryCapacity() / 100; mMaxDrainedPower = (mStats.getHighDischargeAmountSinceCharge() * mPowerProfile.getBatteryCapacity() / 100; processAppUsage(asUsers);/计算每个uid的耗电情况 / Before aggregating apps in to users, collect all apps to sort by their ms per packet. for (int i=0; imUsageList.size(); i+) BatterySipper bs = mUsageList.get(i); puteMobilemspp(); if (bs.mobilemspp != 0) mMobilemsppList.add(bs); for (int i=0; imUserSippers.size(); i+) List user = mUserSippers.valueAt(i); for (int j=0; juser.size(); j+) BatterySipper bs = user.get(j); puteMobilemspp(); if (bs.mobilemspp != 0) mMobilemsppList.add(bs); Collections.sort(mMobilemsppList, new Comparator() Override public int compare(BatterySipper lhs, BatterySipper rhs) if (lhs.mobilemspp rhs.mobilemspp) return -1; return 0; ); processMiscUsage();/计算比如屏幕、wifi、蓝牙等耗电 if (DEBUG) Log.d(TAG, Accuracy: total computed= + makemAh(mComputedPower) + , min discharge= + makemAh(mMinDrainedPower) + , max discharge= + makemAh(mMaxDrainedPower); 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);/加一个over统计 Collections.sort(mUsageList); 下面先看processAppUsage函数,这个函数是看uid的耗电信息。java view plain copyprivate void processAppUsage(SparseArray asUsers) final boolean forAllUsers = (asUsers.get(UserHandle.USER_ALL) != null); . SparseArray uidStats = mStats.getUidStats(); final int NU = uidStats.size(); for (int iu = 0; iu NU; iu+) /遍历各个uid Uid u = uidStats.valueAt(iu); double p; / in mAs double power = 0; / in mAs double highestDrain = 0; String packageWithHighestDrain = null; Map processStats = u.getProcessStats(); long cpuTime = 0; long cpuFgTime = 0; long wakelockTime = 0; long gpsTime = 0; . if (cpuFgTime cpuTime) /先就算每个uid的cpu耗电 if (DEBUG & cpuFgTime cpuTime + 10000) Log.d(TAG, WARNING! Cputime is more than 10 seconds behind Foreground time); cpuTime = cpuFgTime; / Statistics may not have been gathered yet. power /= (60*60*1000); / Process wake lock usage Map wakelockStats = u.getWakelockStats(); for (Map.Entry wakelockEntry : wakelockStats.entrySet() Uid.Wakelock wakelock = wakelockEntry.getValue(); / Only care about partial wake locks since full wake locks / are canceled when the user turns the screen off. BatteryStats.Timer timer = wakelock.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL); if (timer != null) wakelockTime += timer.getTotalTimeLocked(mRawRealtime, which); appWakelockTimeUs += wakelockTime; wakelockTime /= 1000; / convert to millis / Add cost of holding a wake lock/计算uid的wakelock耗电 p = (wakelockTime * mPowerProfile.getAveragePower(PowerProfile.POWER_CPU_AWAKE) / (60*60*1000); if (DEBUG & p != 0) Log.d(TAG, UID + u.getUid() + : wake + wakelockTime + power= + makemAh(p); power += p; / Add cost of mobile traffic/计算uid移动数据耗电 . if (DEBUG & p != 0) Log.d(TAG, UID + u.getUid() + : mobile packets + (mobileRx+mobileTx) + active time + mobileActive + power= + makemAh(p); power += p; / Add cost of wifi traffic/计算wifi数据耗电 final long wifiRx = u.getNetworkActivityPackets(NETWORK_WIFI_RX_DATA, mStatsType); final long wifiTx = u.getNetworkActivityPackets(NETWORK_WIFI_TX_DATA, mStatsType); final long wifiRxB = u.getNetworkActivityBytes(NETWORK_WIFI_RX_DATA, mStatsType); final long wifiTxB = u.getNetworkActivityBytes(NETWORK_WIFI_TX_DATA, mStatsType); p = (wifiRx + wifiTx) * wifiPowerPerPacket; if (DEBUG & p != 0) Log.d(TAG, UID + u.getUid() + : wifi packets + (mobileRx+mobileTx) + power= + makemAh(p); power += p; / Add cost of keeping WIFI running. long wifiRunningTimeMs = u.getWifiRunningTime(mRawRealtime, which) / 1000; mAppWifiRunning += wifiRunningTimeMs; p = (wifiRunningTimeMs * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON) / (60*60*1000); if (DEBUG & p != 0) Log.d(TAG, UID + u.getUid() + : wifi running + wifiRunningTimeMs + power= + makemAh(p); power += p; / Add cost of WIFI scans long wifiScanTimeMs = u.getWifiScanTime(mRawRealtime, which) / 1000; p = (wifiScanTimeMs * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_SCAN) / (60*60*1000); if (DEBUG) Log.d(TAG, UID + u.getUid() + : wifi scan + wifiScanTimeMs + power= + makemAh(p); power += p; for (int bin = 0; bin = Process.FIRST_APPLICATION_UID) List list = mUserSippers.get(userId); if (list = null) list = new ArrayList(); mUserSippers.put(userId, list); list.add(app); if (power != 0) Double userPower = mUserPower.get(userId); if (userPower = null) userPower = power; else userPower += power; mUserPower.put(userId, userPower); else /或者直接加到mUsageList,mUsageList管理所有的耗电信息list mUsageList.add(app); if (power mMaxPower) mMaxPower = power; if (power mMaxRealPower) mMaxRealPower = power; mComputedPower += power; if (u.getUid() = 0) osApp = app; processMiscUsage函数是统计屏幕、wifi耗电等等java view plain copyprivate void processMiscUsage() addUserUsage(); addPhoneUsage(); addScreenUsage(); addFlashlightUsage(); addWiFiUsage(); addBluetoothUsage(); addIdleUsage(); / Not including cellular idle power / Dont compute radio usage if its a wifi-only device if (!mWifiOnly) addRadioUsage(); java view plain copyp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论