原文:http://www.cnblogs.com/hyddd/p/4402621.html
ruby
总结:
(1)ActivityManagerService 创建并初始化 BatteryStatsService,并传入耗电量记录文件batterystats.bin;
(2)BatteryStatsService 在内部创建 BatteryStatsImpl 实例,并传入耗电量记录文件batterystats.bin;
(3)ActivityManagerService 执行 mBatteryStatsService.getActiveStatistics().readLocked();导致 BatteryStatsService 的 BatteryStatsImpl 加载batterystats.bin数据;
(4)在PowerUsageSummary计算App耗电量时,PowerUsageSummary从BatteryStatsService 中获取BatteryStatsImpl 实例,从而获得App的相关数据。
比较简单,见 PowerProfile.java
com.android.internal.R.xml.power_profile 在哪里?
每个 OEM 厂商有自己独立的 power_profile.xml 配置
PowerProfile 关键 API:
ruby
总结:
(1)Android部件电流信息存于:power_profile.xml
(2)每个OEM厂商有私有power_profile.xml
(2)PowerProfile读取power_profile.xml,并提供API访问部件电流数值。
【1】processAppUsage 耗电量统计的 时间段 是?
【2】processAppUsage 的统计对象真的是 App?
【3】耗电量计算公式 - 部分 1:计算 Uid 属下每个 Process 的耗电量数据,并求和。
【4】耗电量计算公式 - 部分 2:计算 Uid 的 wake lock 耗电量
【5】耗电量计算公式 - 部分 3:计算 Uid 的数据流量(data traffic)耗电量
【6】耗电量计算公式 - 部分 4:计算 Uid WIFI 耗电量。
【7】耗电量计算公式 - 部分 5:计算 Uid 其他传感器耗电量。
ruby
总结App耗电量计算公式:
Uid_Power(App耗电量,单位:mAh) = Uid_Power1 + Uid_Power2 + Uid_Power3 + Uid_Power4 + Uid_Power5
Uid_Power1 = (Process1_Power + … + ProcessN_Power);
- Process_Power = (CPUSpeed_Time * POWER_CPU_ACTIVE);
Uid_Power2 = PartialWakeLock_Time * POWER_CPU_WAKE
Uid_Power3 = ( tcpBytesReceived + tcpBytesSent ) * averageCostPerByte
Uid_Power4 = wifiRunningTimeMs * POWER_WIFI_ON
Uid_Power5 = (Sensor1_Power + … + SensorN_Power)
- Sensor_Power = Sensor_Time * Power_Sensor
说这么多,来一发……不,来一个统计耗电量的 App 吧,其实,之前已有人把这段 Android 系统代码抠出来,做了一个 App,可以到 http://www.eoeandroid.com/thread-255696-1-1.html下载。