Android APP电量问题
由之前讲的android 电量情况,我们可以得出一个结论,手机的耗电量 与 电流*时间正相关。在测试时间内,是要能获取电流值,就能得到当前手机耗电情况。
手机耗电模块
- CPU
- WakeLock
- DataTransmit
- WifiScan
Sensor
Bluetooth
Camera
- Flashlight
通用的电流测试方法,如下:
方法1
硬件测试:稳压电源+电流仪
(a)直流恒压电源(Agilent 66319D)
(b)GPIB(通用接口总线)
(c)模拟电池
(d)PC端电流软件
以上方法适用于测试整机电流。但是缺点也很明显,条件比较苛刻,受手机硬件条件的限制。并且这种方法测试手机app 的耗电量,需要相对纯净的rom支持。
方法2
获取电量信息:
一种方法可以直接定时读取uevent,电池驱动文件
/sys/class/power_supply/battery/uevent
http://blog.csdn.net/xubin341719/article/details/8709838
另一种方法可以注册电池广播
registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED))
方法缺陷:
驱动可能因rom不同,信息不一致,只能获取整机电池电量和剩余值,不能精细到某个app
读取系统文件或采用工具获取整体手机电流值的方法,受影响的因素多,数据波动大,可信度不高,同时从开发角度说,告诉一个简单的电流值,对他们定位问题的帮助,也不够。
使用GT提供的PowerStat工具
PowerStat APP 优化和细化了Settings 应用中的电量模块,使用到了com.android.internal.os.中的类,因此需要system app 权限,作为系统预置应用使用
Android 电量测试工具 Powerstat V1.x 版本支持 Android4.1~4.4 的系统(4.4 及以上系统上 需要系统签名,在已获取 root 权限的情况下,可将 apk 包置于/system/priv-app/目录下,作 为系统应用运行)。 工具的 V1.x2 版本在 V1.x 版本的基础上进行开发,细分耗电项,增加定时自动保存功能, 适配 Android5.0。同样,在 Android4.4 及以上系统也需要 root 权限才能安装使用。
依次执行如下命令:
>adb root
>adb shell #mount -o rw,remount /system #exit
>adb push Powerstat.apk /system/priv-app/Powerstat.apk
>adb shell
#cd /system/priv-app
#chmod 755 Powerstat.apk
#reboot
主界面如下:
(2)使用详情 在首界面列表中点击单个 app,进入 app 相应的详情界面,显示该 app 的耗电详情。显示 的耗电项包括:
【CPU】:app 使用 CPU 的时长和耗电量
【Screen】:根据 app 前台时长,将屏幕耗电分摊到 app
【DataTransmit】:app 数据传输(发送、接收)字节数和耗电量
【PartialWakelock】:PartialWakelock 时长、次数和耗电量
【FullWakelock】:FullWakelock 次数 【WindowWakelock】:WindowWakelock 次数
【Wakeup】:Wakelup 次数 【WifiRunning】:app 使用 Wifi 的时长和耗电量
【WifiScan】:app 进行 Wifi 扫描的时长和耗电量
【GPS】:app 使用 GPS 的时长、次数和耗电量
【Sensor】:app 使用各传感器的时长、次数和耗电量(没有使用则不显示)
【Audio】:app 使用音频设备的时长和耗电量 【Video】:app 使用视频设备的时长和耗电量
通过以上精细化的分析:
“这个版本,我们APP耗电量高。”
就可以变成:
“这个版本,我们APP占用CPU时间过高。”
“……”
与此同时,CPU、wakeLock、移动网络耗电量等细分指标,则都可以成为专项测试项。
其中流量在流量优化的方面,我们wakelock 使用也不多并且都及时释放,应用于团队或者众包,可以说CPU 是我们目前要减少耗电量,有两个方面,一个是在业务允许的范围内,减少传感器使用。另一个是在业务允许范围内减少CPU 使用。
如何再细化
传感器使用
比如wifi 耗电,或者GPS耗电,只能从业务逻辑上看
CPU使用
可以通过某个线程占用的时间看。
/proc/<pid>/task/<tid>/stat文件
该文件包含了某一进程所有的线程活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。该文件的内容格式以及各字段的含义同/proc/<pid>/stat文件。
结论4:线程Cpu时间threadCpuTime = utime + stime
通过这种方式我们可以定位到具体线程耗时。
团队和众包测试
团队版本APP 待机测试54分钟,耗电分析
众包 和 美团众包对比
10分钟后
##WiFi 74602.85mAs 620663ms 1.49%
##美团众包(UID=10678) 54762.56mAs 1.09%
【CPU】 power(mAs)=2026.8590137962867 time(ms)=21850
【FgTime】 time(ms)=0
【FullWakelock】 time(ms)=0 count=0
【WindowWakelock】 time(ms)=0 count=0
【PartialWakelock】 power(mAs)=0.0 time(ms)=28516 count=29
【Wakeup】 count=24
【WifiRunning】 power(mAs)=0.0 time(ms)=0
【WifiScan】 power(mAs)=0.0 time(ms)=0
【DataTransmit】 power(mAs)=0.0 bytesSent=0 bytesReceived=0 costPerByte(mAs/byte)=0.0
【Gps】 power(mAs)=52735.7 time(ms)=310210 count=0
【Sensors】
【Audio】 power(mAs)=0.0 time(ms)=0
【Video】 power(mAs)=0.0 time(ms)=0
##蜂鸟众包(UID=10679) 53330.85mAs 1.07%
【CPU】 power(mAs)=595.3221513944223 time(ms)=7200
【FgTime】 time(ms)=0
【FullWakelock】 time(ms)=0 count=0
【WindowWakelock】 time(ms)=0 count=0
【PartialWakelock】 power(mAs)=0.0 time(ms)=53638 count=21
【Wakeup】 count=8
【WifiRunning】 power(mAs)=0.0 time(ms)=0
【WifiScan】 power(mAs)=0.0 time(ms)=0
【DataTransmit】 power(mAs)=0.0 bytesSent=0 bytesReceived=0 costPerByte(mAs/byte)=0.0
【Gps】 power(mAs)=52735.53 time(ms)=310209 count=0
【Sensors】
【Audio】 power(mAs)=0.0 time(ms)=0
【Video】 power(mAs)=0.0 time(ms)=0
10分钟前
##屏幕 3661.38mAs 20341ms 0.07%
##WiFi 2444.79mAs 20341ms 0.05%
##美团众包(UID=10678) 1724.90mAs 0.03%
【CPU】 power(mAs)=16.567113813574714 time(ms)=190
【FgTime】 time(ms)=0
【FullWakelock】 time(ms)=0 count=0
【WindowWakelock】 time(ms)=0 count=0
【PartialWakelock】 power(mAs)=0.0 time(ms)=1 count=1
【Wakeup】 count=1
【WifiRunning】 power(mAs)=0.0 time(ms)=0
【WifiScan】 power(mAs)=0.0 time(ms)=0
【DataTransmit】 power(mAs)=0.0 bytesSent=0 bytesReceived=0 costPerByte(mAs/byte)=0.0
【Gps】 power(mAs)=1708.33 time(ms)=10049 count=0
【Sensors】
【Audio】 power(mAs)=0.0 time(ms)=0
【Video】 power(mAs)=0.0 time(ms)=0
##蜂鸟众包(UID=10679) 1708.16mAs 0.03%
【CPU】 power(mAs)=0.0 time(ms)=0
【FgTime】 time(ms)=0
【FullWakelock】 time(ms)=0 count=0
【WindowWakelock】 time(ms)=0 count=0
【PartialWakelock】 power(mAs)=0.0 time(ms)=6185 count=2
【Wakeup】 count=0
【WifiRunning】 power(mAs)=0.0 time(ms)=0
【WifiScan】 power(mAs)=0.0 time(ms)=0
【DataTransmit】 power(mAs)=0.0 bytesSent=0 bytesReceived=0 costPerByte(mAs/byte)=0.0
【Gps】 power(mAs)=1708.16 time(ms)=10048 count=0
【Sensors】
【Audio】 power(mAs)=0.0 time(ms)=0
【Video】 power(mAs)=0.0 time(ms)=0
增量:
美团众包 0.03% ~ 1.09% 消耗 10分钟电量的1.06%
饿了么众 0.03% ~1.07% 消耗 10分钟电量的1.04%
GPS
美团众包 power(mAs)=1708.33 time(ms)=10049 ~ power(mAs)=52735.7 time(ms)=310210
蜂鸟众包 power(mAs)=1708.16 time(ms)=10048 ~ power(mAs)=52735.53 time(ms)=310209
CPU
美团众包【CPU】 power(mAs)=16.567113813574714 time(ms)=190 ~【CPU】 power(mAs)=2026.8590137962867 time(ms)=21850
蜂鸟众包 【CPU】 power(mAs)=0.0 time(ms)=0 ~【CPU】 power(mAs)=595.3221513944223 time(ms)=7200
可以看到,关键指标上美团众包和蜂鸟众包持平。
电量测试方案和局限
1.不能线上追踪
2.团队如何对比,对比测试指标
- 待机状态 对比, back后台或者home后台 查看消耗
- 操作类 自动化测试对比,是否能支持竞对比较
3.纵向对比
4.powerstat 需要完善,如没有统计振动耗电等