Android 电量优化概览
一、三大耗电模块
-
1.显示
-
2.网络
-
3.CPU
二、显示
-
避免时常唤醒屏幕
-
不要阻止手机休眠
-
过度绘制
2.1 Overdraw简介
Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布 局导致一些像素会被多次绘制,而每次绘制都会对应到CPU的一组绘图命令和GPU的一些操作,当这个操作耗时超过16.67ms时,就会出现掉帧现象,表现为应用卡顿,所以对重叠不可见元素的重复绘制会产生额外的开销,需要尽量减少Overdraw的发生。
2.2 Overdraw检测
Android提供了测量Overdraw的选项,在开发者选项-调试GPU过度绘制(Show GPU Overdraw),打开选项就可以看到当前页面Overdraw的状态,就可以观察屏幕的绘制状态。该工具会使用三种不同的颜色绘制屏幕,来指示 overdraw发生在哪里以及程度如何,其中:
-
没有颜色: 意味着没有overdraw。像素只画了一次。
-
蓝色: 意味着overdraw 1倍。像素绘制了两次。大片的蓝色还是可以接受的(若整个窗口是蓝色的,可以摆脱一层)。
-
绿色: 意味着overdraw 2倍。像素绘制了三次。中等大小的绿色区域是可以接受的但你应该尝试优化、减少它们。
-
浅红: 意味着overdraw 3倍。像素绘制了四次,小范围可以接受。
-
暗红: 意味着overdraw 4倍。像素绘制了五次或者更多。这是错误的,要修复它们。
2.3 UI优化优化
-
1.使用RelativeLayout和ConstraintLayout减少层级嵌套。
-
2.去掉Window的默认背景。
-
3.去掉其他不必要的背景。
-
4.自定义View处理。
-
5.ViewStub高效占位符。
-
6.Merge。
三、网络
-
大数据量的网络传输
-
不停的网络切换
3.1 移动网络
-
Full power: 能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进行操作。
-
Low power:一种中间状态,对电量的消耗差不多是Full power状态下的50%。
-
Standby: 最低的状态,没有数据连接需要传输,电量消耗最少。
3.2 Wi-Fi
-
在理想情况下,吞吐量大,延迟低,通常是不计费。
通常情况下,使用Wi-Fi连接网络的功耗要低于移动网络。所以大数据量的网络传输(例如版本升级等使用WiFi更好)
3.3 网络优化
-
1.网络请求之前,检查网络连接。没有网络连接不进行请求。
-
2.判断网络类型,针对特定的数据在特定的网络下请求。例如:大量数据传输的时候,在wifi下请求。wifi下下载数据耗电量只有2、3、4、5G的1/3。
-
3.界面展示的数据非Wi-Fi下不预取。
-
4.使用效率高的解析工具。根据具体业务数据量的大小,选择合适的解析工具。例如Android上面的协议解析一般推荐json。
-
5.使用GZIP压缩方式下载数据,能减少网络流量,缩短下载时间。
-
6.合理使用缓存,避免重复操作。
-
7.使用推送,代替循环请求。
-
8.触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求打包进行一次操作,避免过多的无线信号引起的电量消耗。
-
9.实时的信息上报后台运行时改成非实时上报。
-
10.合并网络请求,减少请求次数。
-
11.尽量利用Wi-Fi传输信息。
四、CPU
- CPU频率
-
CPU频率表示CPU的计算能力,频率决定CPU周期,互为倒数,CPU主频越快,耗时越短。
-
- CPU时间片
-
在计算机中,每隔N个高电频脉冲,时钟计算器加1,可以把自然时间分成固定的小块这个就是。
-
时间片:CPU时间片「10ms」 单位是jiffies。
-
- CPU利用率
-
CPU分「用户态,系统态,空闲态」,利用率 = (执行用户态 + 系统态的jiffies )/ 总jiffies。
-
4.1 变频
-
Ondemand:官方内核默认使用这种调速器,规则是有高需求,迅速跳到最大频率,有低需求时迅速降到最小频率。
-
Conservative:规则是慢升快降,注重省电,有高需求,逐渐提高频率,有低需求时,迅速跳到最小频率。
-
Interactive:规则是快升慢降,有高需求,逐渐提高频率,有低需求时,逐渐减低频率Lulzactive:根据负载逐级升高或者降低频率。
-
Powersave:把频率锁定在设定范围的最小值,负载再高也不升高频率,很省电。
-
Performance:把频率锁定在设定范围的最大值,无论负载如何,CPU都全速运行,很费电。
注:「CPU的频率高才越耗电」。
4.2 CPU优化
-
计算优化;
-
避免WakeLock使用不当;
-
避免Alarm Manager使用不当;
-
使用Job Scheduler(WorkManager)。
4.2.1 计算优化
-
尽量避开浮点运算
-
除法变乘法
-
充分利用位移(源码中有大量位移运算)
-
查表法,直接使用映射关系,但会增加内存,视具体场景来定
-
利用arm neon指令集做并行运算,需要ARM V7及以上架构CPU才能支持
4.2.2 避免WakeLock使用不当
WakeLock策略
-
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
-
SCREEN_DIM_WAKE LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯。
-
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,允许关闭键盘灯。
-
FULL_WAKE_LOCK: 保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度。
-
ACOUIRE CAUSES WAKEUP:不会唤醒设备,强制屏幕马上高亮显示,键盘灯开启。有一个例外,如果有notification弹出的话,会唤醒设备。
-
ON_AFTER_RELEASE: WakeLock 被释放后,维持屏幕亮度一小段时间,减少WakeLock 循环时的闪烁情况。
4.2.3 避免Alarm Manager使用不当
-
ELAPSED REALTIME: 在多少 ms 后呼叫指定的 PendingIntent。若当时手机处于休眠,会延迟到手机醒来时(屏幕可能还是关的)才做。
-
「ELAPSED REALTIME WAKEUP」:在多少 ms 后呼叫指定的 PendingIntent。若当时手机处于休眠,会唤醒手机做事,同时休眠期间被延迟的事也会一起执行。「是最常见的耗电凶手」。
-
RTC:在指定的某段时间做事。若当时手机处于休眠,会延迟到手机醒来时 (屏幕可能还是关的)才做。
-
「RITC WAKEUP」:在指定的某段时间做事。若当时手机处于休眠,「会唤醒手机做事」,同时休眠期间被延迟的事也会一起执行。通常用于闹钟、记事提醒等。
Alarm能不用最好不用。
ELAPSED_REALTIME_WAKEUP是精准闹钟,能不用最好不用。
4.2.4 使用Job Scheduler(WorkManager)
-
重要不紧急的任务,可以延迟执行,如定期数据库更新和数据上报。
-
耗电量较大的任务,比如充电时才希望执行备份数据操作。
-
不紧急可以不执行的网络任务,如在Wi-Fi环境预加载数据。
-
可以批量执行的任务。
五、其他
5.1 GPS优化
-
精准度要求不高 不用需要开启GPS,蜂窝无线提供的数据足以
-
避免在信号弱(地下室)开启GPS
5.2 精简冗余的服务(Service), 避免长时间执行耗电操作。
5.3 避免与服务器建立长连接。
5.4 减少 CPU 资源使用(滑动或动画)。
5.5 减少 View 的 background 使用,特别是不明显的 background。增加性能、也减少功耗。
- 点赞
- 收藏
- 关注作者
评论(0)