手机应用的耗电量计算
通过计算每个uid从最后一次充电结束后在各个硬件模块上消耗电量求和,得到总的耗电量。
耗电类型 | 计算公式 | 备注 |
CPU | 1.CPU活跃耗电量=单位活跃耗电量*活跃时长 2.耗电量=Sum(每个cluster的单位耗电量*进程cluster占用时长) 3.耗电量=Sum(每个频点单位耗电量*频点工作时长) | 存在丢失系统binder调用部分耗电量 |
Wakelock | 耗电量=单位wakelock耗电*WAKE_TYPE_PARTICAL持锁时长 | |
数据流量 | 计算方式1:通过时间计算 耗电量=单位时间数据流量耗电量*数据流量模块使用时长 计算方式2:通过发送、接收包总量计算 耗电量=单位包耗电量*数据总包(接收包+发送包) | 存在网络信号差异,尤其是弱信号,则包统计不准确 |
Wifi | 计算方式1:通过时间计算 耗电量=单位时间wifi耗电量*wifi模块使用时长 计算方式2:通过发送、接收包总量计算 耗电量=单位包耗电量*wifi总包(接收包+发送包) | |
蓝牙 | 耗电量=发送数据包*单位发送包耗电量 + 接收数据包*单位接收包耗电量 + 空闲时间耗电量 | |
Sensor | Sum{Ti * Pi} Ti:第i个sensor的使用时长 Pi:第i个sensor的单位时间耗电量 i:表示Sensor序号 | |
GPS | 耗电量=GPS持有时长*单位时间GPS耗电量 | 存在不同信号强度差异 |
Camera | 耗电量=Camera持有时长*单位时间Camera耗电量 | 存在算法差异影响 |
闪关灯 | 耗电量=闪关灯持有时长*单位时间闪关灯耗电量 | 存在档位差异 |
音频 | 耗电量=音频持有时长*单位时间音频耗电量 | 存在音效差异 |
视频 | 耗电量=音频持有时长*单位时间音频耗电量 | |
屏幕 | 1.计算总的屏幕耗电量 screenPower = Sum{i档位单位耗电 * i 档位单位耗电时长},i=0,1,2,3 2.计算所有应用前台总时长 totalFgTime = Sum{Ti} 3.按比例分配每个app的屏幕耗电量 Pi = Ti * screenPower/totalFgTime Pi表示第i个app的屏幕耗电量 | 悬浮窗可能无法统计 |
设备挂起/空闲 | 计算规则如下 1.计算suspendPower suspendPower = 时长*单位时间suspend耗电量 2.计算idlePower=时长*单位时间idle耗电量 总耗电=suspendPower+idlePower | |
AOD | 耗电量=AOD持有时长*单位时间AOD耗电量 | |
SystemServer | 计算步骤: 1.计算系统部分耗电量 sysPower=计算规则同1中CPU计算方法,但是时间是统计系统binder调用时长数据 2.将SystemServer binder耗电分配出去 Pi = sysPower*Si/C Pi:表示单个进程的binder耗电量 Si:表示单个进程的binder调用数量 C:表示所有进程的binder调用数量 | 依据binder call数量分配会有较大误差。例如绘制数据量的进程比后台小数据量计算的进程引起systemsrver的耗电更高 |
每个Uid的耗电量包括以下部分或所有的模块:CPU、WakeLock、Modem、Wifi、Ble、Sensor、Gps、Camera、FlashLight、Audio、Video、Screen等。
计算公式:
Pk表示每个模块的耗电量,n表示耗电模块总数