电池寿命:Android“电池”工具是如何工作的,以及为什么开发人员需要吗?
Android有一种工具叫做“电池”设置应用中显示了一个估算电池的使用能耗最多的应用程序在设备上。 这允许最终用户看这个页面快速识别哪些应用程序对手机产生的最大影响电池寿命。 因为很多手机几乎最后一天充满电,消费者变得非常意识到应用程序影响电池的寿命。
事实上,甚至有一个按钮卸载应用程序直接从细节页面,这是一个可怕的特性为开发人员和项目经理。 你不希望你的用户考虑删除应用程序来改善他们的电池寿命。 你要尽你所能让你的应用程序这个屏幕。 安卓系统如何计算这个号码吗?

深入研究Android代码
由于开源Android项目,我们可以看一眼看到进入应用程序的面向公众的工具电池消耗的计算。
应用程序的消费取决于所使用的硬件资源,多长时间使用它们,使用它们的频率,他们推多么困难。 大多数智能手机硬件组件不只是坐在那里消费力量——现代芯片有非常先进的电源管理技术,将硬件资源投入低功率状态不使用的时候。
大部分的计算归结为<你使用了多长时间> * <硬件功耗每单位时间>近似一个特定应用的电池使用(以mAh)。 我们可以看看Android源代码的精确公式的所有硬件资源进入公式。
Total_Power_Consumed (mAh) = Bluetooth_mAh + WiFi_mAh + GPS_mAh + CPU_mAh + Sensors_mAh + Modem_mAh+ Wakelock_mAh + Camera_mAh + Flashlight_mAh
组件分解公式
这里是一个崩溃的九进入整个应用程序的组件电池消费总额。 你可以看看源代码遵循Git存储库的链接和搜索下面列出的变量名。 我们包括根公式源代码负责mAh消费计算为每个这些组件。
mobileRadioPowerMah
它代表什么:移动无线电(又名调制解调器)
来源: MobileRadioPowerCalculator.java
// We are tracking when the radio is up, so can use the active time to determine power use.
app.mobileRadioPowerMah = (app.mobileActive * mPowerRadioOn) / (1000*60*60);
// We are not tracking when the radio is up, so must approximate power use
// based on the number of packets.
app.mobileRadioPowerMah = (app.mobileRxPackets + app.mobileTxPackets)
* app.getMobilePowerPerPacket(rawRealtimeUs, statsType);
usagePowerMah
它代表什么:蓝牙
来源: BluetoothPowerCalculator.java
app.powerMah = ((idleTimeMs * mIdleMa) + (rxTimeMs * mRxMa) + (txTimeMs * mTxMa)) / (1000*60*60);
wifiPowerMah
它代表什么:无线网络
app.powerDrainMah = ((idleTimeMs * mIdleCurrentMa) + (txTimeMs * mTxCurrentMa) + (rxTimeMs * mRxCurrentMa)) / (1000*60*60);
gpsPowerMah
它代表什么:全球定位系统(GPS)
来源: SensorPowerCalculator.java
app.gpsPowerMah = (app.gpsTimeMs * mGpsPowerOn) / (1000*60*60);
sensorPowerMah
它代表什么:传感器
来源: SensorPowerCalculator.java
foreach (sensor)
app.sensorPowerMah += (sensorTime * s.getPower()) / (1000*60*60);
wakeLockPowerMah
它代表什么: Wakelock
“Wakelock”是一个在Android操作系统的电源管理服务机制,可以用来保持CPU清醒(部分Wakelock)和屏幕(全Wakelock)。 (源]
来源: WakelockPowerCalculator.java
// Only care about partial wake locks since full wake locks are canceled when the user turns the screen off.
app.wakeLockPowerMah = (app.wakeLockTimeMs * mPowerWakelock) / (1000*60*60);
cameraPowerMah
它代表什么:相机
来源: CameraPowerCalculator.java
app.cameraPowerMah = (totalTime * mCameraPowerOnAvg) / (1000*60*60);
flashlightPowerMah
它代表什么:手电筒
来源: FlashlightPowerCalculator.java
app.flashlightPowerMah = (totalTime * mFlashlightPowerOnAvg) / (1000*60*60);
cpuPowerMah
它代表什么: CPU
虽然大多数这些元素是相当简单的,电力消耗的CPU是更复杂的。
所有现代芯片组支持动态电压和频率扩展的CPU。 这允许硬件能够调节而不使用和动力需求完全在短时间由操作系统或应用程序。 在全功率运行的CPU会耗尽电池非常迅速这种技术是必不可少的,使现代智能手机应用程序和运行仍然一天最后一次充电。 不同的性能水平的芯片可以在可以被称为‘速度的步骤,也就是一个抽象的术语的不同频率和电压水平集群中的核心可以运作。

现代智能手机cpu不再是“简单”单核设计。 手臂大。 小概念,已成为众多高、中档Android智能手机芯片组在过去两年内,允许多个CPU核的集群。 每个集群可以包含两个或两个以上相同的核心,和坐与其他集群由完全不同的核心。 而不是简单的单一或多核处理器,您现在有多个集群的ARM核的核心芯片。
一般来说,智能手机芯片将会有一个高功率集群,用于CPU密集型任务像游戏,和低功耗集群使用能力但相对节能的CPU核相对密集的任务。 集群连接在一起使用超高速缓存互联,可以开启和关闭工作负载变化(源)。
所有的这些都是考虑而计算CPU使用量。 算法首先检查程序花了多长时间使用集群每个CPU速度每一步和骨料总总时间。 对于每个集群,它将检查的时间速度每一步。 然后构建一个在每一步的时间总比整体时间。 一旦比例,然后考虑平均能耗率每一步产生近似mAh的消耗。 总而言之,更多的内核,更高的频率,和更长的使用直接影响你的应用的电池消耗。
