一、总体耗电量测试

1.1、软件测试方法

电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播 主动把数据传送给所关心的应用程序。

应用如果想要接收到BatteryService发送出来的电池信息,则需要注册一个Intent为Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver。

1IntentFilter mIntentFilter = new IntentFilter(); 2            mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 3            registerReceiver(mIntentReceiver, mIntentFilter);查看源码打印?01private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 02        @Override 03        public void onReceive(Context context, Intent intent) { 04            // TODO Auto-generated method stub 05            String action = intent.getAction(); 06            if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { 07   08                // 电池状态,返回是一个数字 09                // BatteryManager.BATTERY_STATUS_CHARGING 表示是充电状态 10                // BatteryManager.BATTERY_STATUS_DISCHARGING 放电中 11                // BatteryManager.BATTERY_STATUS_NOT_CHARGING 未充电 12                // BatteryManager.BATTERY_STATUS_FULL 电池满 13                int status = intent.getIntExtra("status", 0); // 电池状态 14   15                // 电池健康情况,返回也是一个数字 16                // BatteryManager.BATTERY_HEALTH_GOOD 良好 17                // BatteryManager.BATTERY_HEALTH_OVERHEAT 过热 18                // BatteryManager.BATTERY_HEALTH_DEAD 没电 19                // BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE 过电压 20                // BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE 未知错误 21                int health = intent.getIntExtra("health", 0); //电池健康情况 22   23                int scale = intent.getIntExtra("scale", 0); // 电池最大容量 24                int nVoltage = intent.getIntExtra("voltage", 0); // 电池的电压 25                int level = intent.getIntExtra("level", 0); // 电池的电量,数字 26                int temperature = intent.getIntExtra("temperature", 0); // 电池的温度 27   28                if (nVoltage != 0) { 29   30                    tv_status.setText("电池电量:" + level + "%"); 31   32                    Log.i(TAG, "voltage = " + nVoltage + " level = " + level 33                            + " temperature = " + temperature + "...success"); 34                } else { 35                    Log.i(TAG, "voltage = " + nVoltage + "...failed"); 36                } 37            } 38        } 39    };

1.2 硬件测试方法   耗电量 测试背景 耗电量测试是手机测试中必不可少的一项,当前的手机耗电量测试主要为手工测试,随着手机产品线的增多,人力的投入非常大。为解决多产品线耗电量测试耗费的大量人力及时间成本,采用了 自动化测试方案,完成 测试 用例的自动选择和组合,并自动产生数据记录、分析以及生成报告,大大减少了测试的人力成本,提高了测试效率。  测试环境搭建  PC与测试仪使用USB连接,PC控制测试仪进行电流输出并采集测试数据及波形图;待测手机不安装电池,由Agilent测试仪进行供电并记录手机的工作电流;手机与PC间并无连接,通过预设的时间戳完成操作间严格同步。设备连接图如下:

  实现原理

耗电量自动化测试工具由手机端和PC端两部分组成,PC端和手机端同步运行。手机端使用Café自动化测试框架,对不同测试CASE进行测试环境的设置和清理。PC端负责与设备连接,记录测试数据并保存,测试完毕后分析测试结果并自动生成报告。流程图如下:

  注:Cafe测试框架是一款具有开创性意义的Android平台的自动化测试框架,框架覆盖了Android自动化测试的各种需求。框架致力于实现跨进程测试、快速测试、深度测试,解决了Android自动化测试中的诸多难题,比如业界一直没有解决的跨进程测试问题

二、单个app耗电量测试

Android软件耗电量测试方法

安卓系统自带有电池使用情况列表,用户可进入“设置”自行查看,但是由于厂商不同,有些手机无法获取到所有应用的耗电排行信息。但可参考以下逻辑,计算出各应用的耗电百分比:

软件运行总时间 = 软件在Linux内核态运行时间 + 软件在Linux用户态运行时间

软件运行期间CPU在每个频率下工作的时间

CPU工作总时间 = 软件运行期间CPU每个频率下工作的时间之和比例

软件运行期间CPU在每个频率下工作消耗的电量

软件消耗的电量 = CPU每个频率等级下工作的时间比例/CPU工作总时间 * 软件总时间 * 不同频率下消耗的电量 + 数据传输消耗的电量(WI-FI或者移动网络)+ 使用所有传感器消耗的电量

天天动听本地播放耗电量

三、耗电量测试工具

这里介绍6个免费而又好用的小工具。

(一)Google强大的功耗测试工具:PowerTutor。1.显示系统电量消耗水平,包括LCD/OLED,CPU,WiFi,3G,GPS和Audio;2.查看某段时间内所有运行中的应用程序的耗电量。详见http://ziyang.eecs.umich.edu/projects/powertutor/

PowerTutor is an application for Google phones that displays the power consumed by major system components such as CPU, network interface, display, and GPS receiver and different applications. The application allows software developers to see the impact of design changes on power efficiency. Application users can also use it to determine how their actions are impacting battery life. PowerTutor uses a power consumption model built by direct measurements during careful control of device power management states. This model generally provides power consumption estimates within 5% of actual values. A configurable display for power consumption history is provided. It also provides users with a text-file based output containing detailed results. You can use PowerTutor to monitor the power consumption of any application.

PowerTutor's power model was built on HTC G1, HTC G2 and Nexus one. It will run on other versions of the GPhone, but when used with phones other than the above phone models, power consumption estimates will be rough. We plan to provide power models for other phones in the future.

(二)Battery Monitor Widget。高度可定制化的电量监控小工具,不仅可以显示当前电量,估算剩余电量支撑时间,还可以一目了然地检测出各个APP的耗电历史,从而方便进行比较。详见https://play.google.com/store/apps/details?id=ccc71.bmw

(三)Smart Battery Monitor。除了可以在状态栏显示电池消耗百分比外,还可以显示电池的温度,以及已充电时间。详见https://play.google.com/store/apps/details?id=at.aauer1.battery

(四)Battery Indicator。亮点是轻便、小巧,甚至使用它时不会消耗电池。当然,它可以显示电池的电量百分比、电池的温度、以及电池的健康信息。详见https://play.google.com/store/apps/details?id=com.darshancomputing.BatteryIndicator

(五)Battery Widget。这个工具不仅是一个电池Widget,还可以作为显示选项,GPS,WiFi,蓝牙选项等的快捷方式。详见https://play.google.com/store/apps/details?id=com.geekyouup.android.widgets.battery

(六)Battery Saver。被称为管理电池的最强大应用之一。除了显示电量信息,电池温度和健康信息外,它还可以快速管理一些耗电量大的应用如:GPS,WiFi,蓝牙等。另外:该工具可以查看一天之内的哪个时间点电池的耗电量最大!详见https://play.google.com/store/apps/details?id=com.antutu.powersaver

四、Android手机耗电深度解析 转载自:http://news.mydrivers.com/1/282/282933.htm

1)灭屏待机最省电:

a)任何App包括后台Service应该尽可能减少唤醒CPU的次数,比如IM类业务的长连接心跳、QQ提醒待机闹钟类业务的alarm硬时钟唤醒要严格控制;

b)每次唤醒CPU执行的代码应该尽可能少,从而让CPU迅速恢复休眠,比如申请wake lock的数量和持有时间要好好斟酌;

2)Wi-Fi比蜂窝数据,包括2G(GPRS)、3G更省电:

a)尽量在Wi-Fi下传输数据,当然这是废话,不过可以考虑在有Wi-Fi的时候做预加载,比如应用中心的zip包、手Q web类应用的离线资源等;

b)非Wi-Fi下,尽量减少网络访问,每一次后台交互都要考虑是否必须。虽然WiFi接入方式已经占到移动互联网用户的50%,但是是有些手机设置为待机关闭WiFi连接,即便有Wi-Fi信号也只能切换到蜂窝数据;

测试分析:

1)灭屏的情况:

a)灭屏待机,CPU处于休眠状态,最省电(7mA);

b)灭屏传输,CPU被激活,耗电显著增加,即便是处理1K的心跳包,电量消耗也会是待机的6倍左右(45mA);

c)灭屏传输,高负载download的时候WiFi最省电(70mA),3G(270mA)和2G(280mA)相当,是WiFi的4倍左右;

2)亮屏的情况:

a)亮屏待机,CPU处于激活状态,加上屏幕耗电,整机电量消耗不小(140mA);

b)亮屏传输,如果只是处理1K的心跳包,耗电增加不多(150mA),即便是很大的心跳包(64K),消耗增加也不明显(160mA);

c)亮屏传输,高负载download的时候WiFi最省电(280mA),3G(360mA)和2G(370mA)相当,是WiFi的1.3倍左右;

3)Alarm唤醒频繁会导致待机耗电增加:

手机灭屏后会进入待机状态,这时CPU会进入休眠状态。Android的休眠机制介绍的文章很多,这里引用一段网络文章:

Early suspend是android引进的一种机制,这种机制在上游备受争议,这里 不做评论。这个机制作用在关闭显示的时候,在这个时候,一些和显示有关的 设备,比如LCD背光,比如重力感应器,触摸屏,这些设备都会关掉,但是系统可能还是在运行状态(这时候还有wake lock)进行任务的处理,例如在扫描SD卡上的文件等.在嵌入式设备中,背光是一个很大的电源消耗,所以android会加入这样一种机制.

Late Resume是和suspend配套的一种机制,是在内核唤醒完毕开始执行的.主要就是唤醒在Early Suspend的时候休眠的设备.

Wake Lock在Android的电源管理系统中扮演一个核心的角色. Wake Lock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠,可以被用户态程序和内核获得.这个锁可以是有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁.如果没有锁了或者超时了,内核就会启动休眠的那套机制来进入休眠.

当用户写入mem或者standby到/sys/power/state中的时候, state_store()会被调用,然后Android会在这里调用request_suspend_state()而标准的Linux会在这里进入enter_state()这个函数.如果请求的是休眠,那么early_suspend这个workqueue就会被调用,并且进入early_suspend

简单的说,当用户按power键,使得手机进入灭屏休眠状态,Android系统其实是做了前面说的一些工作:关闭屏幕、触摸屏、传感器、dump当前用户态和内核态程序运行上下文到内存或者硬盘、关闭CPU供电,当然为了支持语音通讯,modern等蜂窝信令还是工作的。

这种情况下,应用要唤醒CPU,只有两种可能:

a)通过服务器主动PUSH数据,通过网络设备激活CPU;

b)设置alarm硬件闹钟唤醒CPU;

这里我们重点分析第二种情况。首先来看看什么是alarm硬件闹钟。Google官方提供的解释是:Android提供的alarm services可以帮助应用开发者能够在将来某一指定的时刻去执行任务。当时间到达的时候,Android系统会通过一个Intent广播通知应用去完成这一指定任务。即便CPU休眠,也不影响alarm services的服务,这种情况下可以选择唤醒CPU。

显然唤醒CPU是有电量消耗的,CPU被唤醒的次数越多,耗电量会越大。现在很多应用为了维持心跳、拉取数据、主动PUSH会不同程度地注册alarm服务,导致Android系统被频繁唤醒。这就是为什么雷军说Android手机在安装了TOP100的应用后,待机时间会大大缩短的重要原因。

比较简单评测CPU唤醒次数的方法是看dumpsys alarm,这里会详细记录从开机到当前的各个进程和服务唤醒CPU的次数和时间。通过对比唤醒次数和唤醒时间可以帮助我们分析后台进程和服务的耗电情况。Dumpsys alarm的输出看起来像这样:


其中544代表唤醒次数,38684ms代表唤醒时间。

4)Wake locks持有时间过长会导致耗电增加:

Wake locks是一种锁机制,有些文献翻译成唤醒锁。简单说,前面讲的灭屏CPU休眠还需要做一个判断,就是看是否还有任何应用持有wake locks。如果有,CPU将不会休眠。有些应用不合理地申请wake locks,或者申请了忘记释放,都会导致手机无法休眠,耗电增加。

原始数据:

测试方法:硬件设备提供稳压电源替代手机电池供电,在不同场景下记录手机平均电流。

测试设备:Monsoon公司的Power Monitor TRMT000141

测试机型:Nexus One


灭屏benchmark(CPU进入休眠状态):7mA


灭屏WiFi:70 mA


灭屏3G net:270 mA


灭屏2G net GPRS:280mA


亮屏benchmark:140mA


亮屏Wi-Fi:280mA


亮屏3G net:360mA


亮屏2G:370mA


亮屏待机:140mA


亮屏Wi-Fi ping 1024包:150mA


亮屏Wi-Fi ping 65500包:160mA


灭屏 屏1024:45mA


灭屏ping 65500:55mA


关闭所有数据网络待机:7mA


更多相关文章

  1. Android电池控制的检测和修改
  2. Android(安卓)4.0开发环境搭建和测试
  3. Android系统工具之Monkey自动化测试
  4. Android(安卓)URL scheme
  5. RadioButton 左侧显示文字,右侧显示按钮时文字不靠边的问题解决
  6. Android官方技术文档翻译——Gradle 插件用户指南(5)
  7. Android上打包jar并在真机上运行
  8. Android单元测试之Robolectric
  9. Android(安卓)Studio真机测试时生成的程序出现闪退

随机推荐

  1. Android(安卓)列表中设置Button后setOnIt
  2. Android中摇一摇效果的实现
  3. android 导航总结
  4. Flutter(Android(安卓)混合开发)
  5. Flutter中高级培训
  6. java.net.SocketTimeoutException: Conne
  7. android 多点触摸实例
  8. Android开发实战一之搭建开发环境(最新版
  9. Android 代码设置RelativeLayout元素居中
  10. Android(安卓)篡改apk文件的可行性分析