Android 应用CPU耗电监控分析
前言:
智能手机电量的消耗是由多种因素造成的,如屏幕的材质、大小、亮度,通信组件的功率,cpu,电池等。本文仅从软件应用对电量的消耗这个角度对耗电控制进行探索。
获取手机当前电量:
Android以广播的形式通知应用当前的电量使用情况,开发者可以很方便的获取到当前的电池电量信息:
首先,注册一个接收者:
在自定义的receiver中获取电量信息:
CPU使用率:
软件的耗电主要是由于CPU的工作引起的。因此,如果计算出每个软件某一时段的cpu占用率,即可对各个软件的耗电程度有一个基本的了解。
Android的API中没有直接提供可查询cpu使用率相关的接口,但是作为android的底层,linux系统中却可以很方便地查询到当前的cpu信息以及实时的cpu使用情况。在得到相关数据后,经过计算,就可以得到每个软件的cpu使用率。
以下为具体的实现:
1. 通过程序访问/proc/stat获取cpu总体使用情况;
如:
~$ cat /proc/stat
cpu 38082 627 27594 893908 12256 581 895 0 0
...
其中,每个字段分别代表user、nice、system 、idle、iowait、irq、softirq、 stealstolen、guest这几个参数自系统启动以来所产生的节拍数。
当前总的节拍数为Total = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest;
如:
在相对较小的间隔内,先后取两次总节拍数,如Total1和Total2.
2 访问/proc/<pid>/stat获取某一进程cpu使用情况。
如:
~$ cat /proc/14020/stat
14020 (doujia.phoenix2) S 120 120 0 0 -1 4194624 181165 3227 211 2 22817 4810 7
25 20 0 40 0 9902620 346767360 12470 4294967295 1 1 0 0 0 0 4612 0 38120 4294967
295 0 0 17 0 0 0 0 0 0
其中,第14~17字段分别为utime, stime, cutime, cstime。它们的总和及当前进程的cpu总节拍数。
当前进程自系统启动以来所产生的总节拍数为pt = utime+stime+cutime+cstime
如:
在相对较小的间隔内,先后去两次总节拍书,如pt1和pt2.
3 计算进程的cpu使用率
某进程的cpu使用率 = (pt2-pt1) * 100 / (Total2-Total1)
如:
如果要获取所有程序的使用率,只要简单ps出进程并以grep或其他形式过滤下,取到pid后,遍历计算即可。
这样,就基本得出了当前系统内各软件的cpu使用率。Cpu使用率高的程序,耗电量自然也相对较大。
剩余电量使用时间的计算思路
由于电量的消耗的是由多种因素造成的,因此剩余时间一般只能是估值。
以如下方式估算剩余时间:
剩余时间 = 电池容量 / 硬件(屏幕/cpu等)的功耗
假设在电池容量固定的情况下,硬件的功耗就决定了电量的剩余使用时间。
Android手机中,耗电最大的模块一般有屏幕、cpu、wifi、GPS等。
a) 屏幕的功耗:
1) 获取当前手机型号:android.os.Build.MODEL
2) 获取屏幕尺寸:getWindowManager().getDefaultDisplay()
3) 获取屏幕亮度:
通过以上素材,配合相应的硬件资料,以估算屏幕的功耗。
b)CPU功耗:
1) 获取当前手机型号:android.os.Build.MODEL
2) 获取cpu信息:/proc/cpuinfo
如:
shell@android:/ $ cat /proc/cpuinfo
cat /proc/cpuinfo
Processor : ARMv7 Processor rev 3 (v7l)
processor : 0
BogoMIPS : 2007.19
processor : 1
BogoMIPS : 2007.19
Features : swp half thumb fastmult vfp edsp neon vfpv3
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x1
CPU part : 0xc09
CPU revision : 3
Hardware : T1 Samsung board
Revision : 0007
Serial : 000090423c62b4ce
通过以上素材,配合相应的硬件资料,以估算CPU的最大理论功耗。
3) 在得到最大功耗后,根据cpu使用率,可以对当前的cpu耗电情况作一个基本的估算
在得到所有主要耗电硬件的功耗、电池的理论上的最高容量、当前电量百分比后,就可以估算出剩余电量的使用时间了。