安卓性能测试(四)----耗电量(功耗计算)
这里说的是通过cpu,wifi,屏幕之类的功耗来
计算公式:
功耗的计算=CPU消耗+数据传输消耗+GPS消耗+Wi-Fi连接消耗+Wi-Fi连接消耗+Wake lock消耗+屏幕亮度的功耗
首先说CPU的耗电:
1 获取power_profile.xml文件:
每台android手机都在power_profile.xml中定义了各个硬件的单位时间的耗电量,单位mAh,意思是一个小时,能耗电多少mAh:
(1)power_profile.xml 存放在 /system/framework/framework-res.apk 包里;
(2)使用apktool将apk反编译,然后在 $output/res/xml 文件夹下找到该文件
power_profile.xml文件如下:
2 获取app的cpu时间(jiffies,1jiffies = 10ms):
(1)获取app的pid:adb shell ps | grep packagename
(2)获取pid执行时间:adb shell cat /proc/${pid}/stat
这个文件中的第14列到17列相加得到的就是从开机到此刻,app一共占用多少cpu时间,这里的单位是jiffies(记为systime)
(3)在测试场景下,两次systime相减得到的时间即为app的进程占用的cpu的时间,注意jiffies转换成s(app_total_time);
3 计算cpu的耗电量:
(1)获得测试时间内在各个频率下的占用时间,这个是整个系统占用时间:
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
(2)计算测试时间内每个频率的占用时间:
如:频率a占用了3s,频率b占用了2s,
则频率a的占用时间为 3 / 5 * app_total_time
(3)在power_profile.xml中定义该频率下的耗电,将对应时间转换成h,相乘即可得到该频率下的耗电;
(4)将各频率下的耗电相加就得到了该进程的耗电;
接下来计算network,screen,sensor的耗电,相加就是app的耗电。
ps:这种方法可以直接插着usb线来计算,(可能有人会说连usb线的话,会不会cpu的频率一直会高速运行就不准了,这里试验过在连接usb和不连usb线进行对比,发现cpu的功耗差别很低,可以忽略,所以插usb线对cpu的耗电测试没有影响)