移动终端App电量测试与优化

作者: 袁宜霞

移动终端App电量测试与优化0

摘要:为了减少移动终端App电量消耗,提升用户在电量方面的体验,文章通过对移动终端的硬件系统架构的分析,总结出需要关注CPU计算类型、频率、屏幕亮度、UI界面颜色色系以及网络数据传输策略。通过对软件系统架构的休眠和唤醒的机制对电量消耗影响的分析,总结出App电量测试和优化的重点应该放在后台使用场景和后台耗电优化目标API的使用上。最后,通过对CPU频繁轮询、播放动画的显示和待机PUSH机制三个典型耗电案例的详细分析,进一步指导App电量优化实战。

关键词:移动终端;电量测试;电量优化

中图分类号:TP311      文献标识码:A

文章编号:1009-3044(2022)24-0067-02

1 引言

随着5G网络的普及带来了移动互联网的巨大发展,移动终端的App应用越来越多,使用场景越来越丰富,使用频率也越来越高,使得移动终端电量消耗过快的问题日益突出。移动终端的电池电量是非常有限的,保持持久的续航能力尤为重要。App研发团队必须慎重检查电量的使用,以免导致用户手机耗电发热,带来不良体验。

移动终端电池不耐用有两方面原因:一方面是手机硬件和操作系统的问题,另一方面是移动应用App的问题,例如:随意自启动,频繁在后台多次唤醒,抢占桌面、通知栏和悬浮窗等。本文着重于关注Android移动应用App对电量带来的影响,总结导致电量消耗过快的常见原因,介绍Android电量相关测试与优化技术,并以案例的方式,针对典型问题提出相应优化措施,进一步有效地提升App电量方面的用户体验。

2 耗电本质

2.1 硬件系统架构

图1是一个典型的智能手机硬件架构图[1]。

当智能手机待机时,主板可以直接关闭应用处理器、无线网卡和显示器等外设的供电电源,而基带处理器、蜂窝话音和射频设备等需持续供电,保证继续等待来电、搜索网络等功能[1]。

GPS、SD卡、相机、传感器、音频、蓝牙组件的耗电较少,而CPU、屏幕和射频通信(蜂窝话音、蜂窝数据和Wi-Fi) 的耗电量较大,需要特别关注[2]。

2.2 CPU

关于CPU,本文将从计算类型和频率方面进行分析。

1) 计算类型

缩短应用程序代码产生指令运行的时间,从而减少应用程序对CPU时间片的占用总时间,进而降低单位时间内目标应用程序在整台手机耗电的百分比。例如:在对算法性能要求高的应用程序中建议减少大整数除法的操作。

2) 频率

CPU在不同频率工作时,需要的电压是不同的,提高电压将直接提高CPU的耗电。电量=电流*时间,CPU工作的同时也会带着显示器等其他耗电组件一起运作,随着时长的增加,单位运算量所耗费的电量也跟着增加。因此,App运行时提高CPU利用率,减少sleep的使用将能减少耗电量。

2.3 显示屏与耗电

手机显示屏主要是LCD和OLED两个大类:LCD是背光源发光,在背光灯泡亮度一定的情况下,显示不同颜色时耗电是一样的;OLED是主动发光,显示不同颜色时,每个LED单元的功耗不同,所以整体功耗不同。全白颜色时OLED耗电是LCD的3倍,全黑颜色时LCD耗电是OLED的10倍,30%白色时OLED和LCD耗电一样[3]。

对于LCD屏幕,需要重点关注屏幕亮度(0-255) 的取值,值越大耗电量越大。一样的图片,最亮亮度下LCD屏幕的耗电量是最暗亮度下的2~3倍[3],所以选择适当的亮度将能给应用程序带来更优的省电效果;对于OLED屏幕,不但要关注屏幕亮度,还要关注每个像素的RGB值,例如:Super AMOLED最高亮度时全黑比全白节省电量60%[3],所以应用程序UI界面应多采用深色调。

2.4 网络

1) 蜂窝数据

蜂窝数据组件在以下三种状态中切换:①高功率状态:在这个状态下蜂窝数据需申请使用专享信道与基站进行通讯。当数据传输活动停止超过一个固定时间阈值时,状态迁移至低功率状态;②低功率状态:在这个状态下蜂窝组件释放了专享信道资源,使用共享公用信道与基站进行信令通讯。这个状态下耗电比高功率状态低20%以上。当传输空闲时间超过特定阈值时,状态迁移至空闲状态;③空闲状态:这个状态下蜂窝组件只接收寻呼信息。这个状态的功耗为高功率状态的六十分之一。

经测试,传输3秒的数据,蜂窝数据组件需要约16秒时间才能回到耗电量最低的空闲状态。因此,在蜂窝数据下,采用将大量碎片数据一起打包后,等待较大的时间间隔再进行依次整体传输的策略,将会更省电。

2) Wi-Fi

Wi-Fi耗电需要关注2个因素:每秒发送和接收的包数(包率) 和网速(通道率) 。Wi-Fi组件在活动状态下有四种模式:低功率、高功率、低传输、高传输。当Wi-Fi组件从低或高功率状态开始传输数据时,短暂地进入相应的低或高传输状态,发送完毕就回到之前相应的状态。当进行高速传输时,Wi-Fi组件在高传输状态维持的时间非常短。

综上,用Wi-Fi传输数据时,在不超过最大传输单元的情况下,增大每个包的大小并降低发包的频率能够节省电量。

2.5 软件系统架构

为了适应嵌入式设备省电的需要,Linux操作系统实现了一套休眠和唤醒的机制,Android沿用了这套机制并有新的改进。Early suspend:一种新的系统状态。显示器被关闭,重力感应器、触摸屏进入挂起状态,但是其他设备继续工作,系统依然进行任务处理,比如扫描SD卡文件。Late resume:一种新的系统操作。唤醒进入Early suspend状态的设备。

当系统进入休眠时,CPU挂起,所有用户态应用程序和内核态的进程全部被冻结,按照各个设备注册的顺序调用外围设备的suspend回调函数,执行每个外围设备的suspend,使核心设备和CPU进行休眠,直到系统被某种原因唤醒才会解除。此时系统只有系统时钟RTC(Real-Time Clock) 在进行工作。

为了唤醒CPU,终端软件需要设置闹钟alarm。底层系统提供了两种类型的时钟,软时钟Timer与硬时钟RTC。Android系统提供AlarmManager这个API,其对应AlarmManagerServie服务程序,该服务程序在系统启动时被启动并初始化闹铃设备,一共有四种Alarm类型:RTC_WAKEUP、RTC、ELAPSED_REALTIME_WAKEUP、ELAPSED_REALTIME[4]。

在特定使用场景下(例如:资源下载) ,应用程序需要唤醒系统并且让系统在一段时间内保持唤醒。因此,Android系统提供了一种锁机制,只要进程持有wake lock,系统就无法进入休眠状态,这将会带来较大的耗电量。所以,关注应用程序中alarm和wake lock的使用是否合理对于节省电量十分重要。

2.6 耗电的本质

目前,各种应用程序耗电量评估系统主要都是通过CPU利用率来估算每个应用程序所消耗的电量,部分系统也会根据其他硬件设备(屏幕、蜂窝数据、Wi-Fi等) 使用时长来修正应用程序的耗电量。

3 移动终端App省电优化措施与案例详析

移动终端App电量测试是为了找出被测试的应用程序中不合理消耗电量的场景,从而进行代码优化,达到省电的目的。省电优化需要尽可能减少对各类资源占用的时间,例如:CPU、网络、屏幕、GPS、相机、SD卡等。而不合理耗电的场景往往并不是在应用程序前台操作的过程中,而是在后台使用场景。

典型的后台使用场景:当用户按返回键或者HOME键时,终端应用程序退出UI界面,UI主线程会停止运行。如果应用程序进程中不含service,等待3秒后,该进程会进入“缓存进程”列表,点选“显示缓存进程”或者执行PS命令才能看见这个进程。“缓存进程”与正在运行的进程相比,仅仅是UI主线程是否运行的区别,创建出来的子线程仍然可以继续执行,从而为后台执行逻辑代码进行不合理耗电带来了可能性。以下是需要重点关注的会在后台执行的耗电API和对象:java.lang.Thread.new()、ThreadPool.addTask()、run()、Handler.sendMessageDelayed()、java.util.Timer、Thread.sleep、AlarmManager。

手机灭屏后进入的休眠状态是移动终端大部分时间所处的状态。timer和sleep底层都是通过线程信号量来控制调度的,用的是软时钟的计数器,只统计CPU运行过的相对时间间隔,所以在手机休眠后,java.util.Timer和Thread.sleep会停止。但是,alarm在系统休眠后使用的是RTC的硬时钟闹钟,即可以通过RTC芯片引脚信号唤醒系统执行逻辑,所以,即使手机休眠了,AlarmManager还是会持续工作。综上,如果AlarmManager使用不当将会带来终端的极大耗电。

本文将分别通过CPU、屏幕显示和网络三个方面的案例,对典型问题提出电量测试方法和相应优化措施,从而有效地提升App的电量方面的用户体验。

3.1 CPU耗电优化案例

如下为CPU相关概念,CPU频率:执行相同周期个数时,CPU主频越快,那么耗时就越短;CPU时间片:每隔N个高电频脉冲,时钟计数器加1,把自然时间分成固定的小块,每一块为一个时间片,手机一般是10ms,单位是jiffies。于是,机器时间都转化为用时间片的个数来衡量;CPU利用率:指CPU执行非系统空闲进程的时间除以CPU总的执行时间。

通过CPU利用率来估算应用程序占移动终端系统耗电的百分比是可行的,但操作应用程序时,CPU利用率是一段比值波动的曲线,表示进程占用CPU的百分比,不能定量地评估CPU的具体消耗,精准度不高。电量=电流*时间,CPU利用率高手机电流就高,但是不一定电量大,还需要看占用CPU运行的时间长短。为了精准量化应用程序对CPU的消耗,测试人员需要固定CPU频率后获取执行操作进程所占用的CPU时间片总数。具体操作为:

首先,修改/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_ freq的设置来固定CPU频率;然后,电量测试开始前和结束后,通过如下命令获得被测试的应用程序的进程在用户态和系统态消耗的CPU时间片总数:cat /proc/1/stat 。此命令会显示进程处于用户态的时间utime和进程处于内核态的时间stime,单位是jiffies。最后,电量测试开始前和结束后得到的utime+stime总数相减的差值就是被测试应用程序所消耗的CPU时间片。

1) 典型案例——CPU频繁轮询耗电的问题分析:①应用程序的线程频繁监听桌面事件:无论移动终端是否关闭屏幕以及应用程序是否正在被使用,线程一直在轮询检测栈顶task(耗时0.2秒) ,每秒发出2次广播,5个监听者轮流去判断栈顶task是否为桌面(耗时1秒) ;②应用程序的线程频繁检测前台服务是否活着:每5秒进行1次检查。

2) 典型案例——CPU频繁轮询耗电的解决办法:①移动终端开启屏幕且不再使用应用程序,应用程序的线程0.5s轮询一次,栈顶发生变化再对外广播;②移动终端开启屏幕且正在使用应用程序,应用程序的线程30s轮询一次,栈顶发生变化再对外广播;③移动终端灭屏的时候停止应用程序的轮询线程。

测试结论:在用户退出应用程序以及移动终端灭屏的时候,停止频繁的轮询能大大减少电量的消耗。

3.2 屏幕显示优化案例

Android系统的动画性能不高,在进行Android应用程序开发时,遵循以下措施将能减少不必要的电量消耗:减少动画的长时间展示;合理控制动画绘制帧率,测试数据表明:动画绘制帧率为每秒40帧时CPU占比50%,绘制帧率为每秒10帧时CPU占比10%,两者的耗电量相差1倍;仅在显示动画的时候才执行渲染逻辑,当移动终端灭屏或动画消失的时候立刻停止渲染逻辑避免不必要的电量消耗;提高动画绘制效率,减少绘制次数和单次耗时;合理选择动画的亮度,因为最亮亮度下LCD屏幕的耗电量是最暗亮度下的2~3倍;合理使用暗配色动画,因为OLED屏幕为全黑颜色比全白颜色要节电60%。

上一篇 点击页面呼出菜单 下一篇