目录
4.2.4 使用Job Scheduler(WorkManager)
5.2 精简冗余的服务(Service), 避免长时间执行耗电操作。
5.5 减少 View 的 background 使用,特别是不明显的 background。增加性能、也减少功耗。
1.显示
2.网络
3.CPU
避免时常唤醒屏幕
不要阻止手机休眠
过度绘制
Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布 局导致一些像素会被多次绘制,而每次绘制都会对应到CPU的一组绘图命令和GPU的一些操作,当这个操作耗时超过16.67ms时,就会出现掉帧现象,表现为应用卡顿,所以对重叠不可见元素的重复绘制会产生额外的开销,需要尽量减少Overdraw的发生。
Android提供了测量Overdraw的选项,在开发者选项-调试GPU过度绘制(Show GPU Overdraw),打开选项就可以看到当前页面Overdraw的状态,就可以观察屏幕的绘制状态。该工具会使用三种不同的颜色绘制屏幕,来指示 overdraw发生在哪里以及程度如何,其中:
没有颜色: 意味着没有overdraw。像素只画了一次。
蓝色: 意味着overdraw 1倍。像素绘制了两次。大片的蓝色还是可以接受的(若整个窗口是蓝色的,可以摆脱一层)。
绿色: 意味着overdraw 2倍。像素绘制了三次。中等大小的绿色区域是可以接受的但你应该尝试优化、减少它们。
浅红: 意味着overdraw 3倍。像素绘制了四次,小范围可以接受。
暗红: 意味着overdraw 4倍。像素绘制了五次或者更多。这是错误的,要修复它们。
1.使用RelativeLayout和ConstraintLayout减少层级嵌套。
2.去掉Window的默认背景。
3.去掉其他不必要的背景。
4.自定义View处理。
5.ViewStub高效占位符。
6.Merge。
大数据量的网络传输
不停的网络切换
Full power: 能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进行操作。
Low power:一种中间状态,对电量的消耗差不多是Full power状态下的50%。
Standby: 最低的状态,没有数据连接需要传输,电量消耗最少。
在理想情况下,吞吐量大,延迟低,通常是不计费。
通常情况下,使用Wi-Fi连接网络的功耗要低于移动网络。所以大数据量的网络传输(例如版本升级等使用WiFi更好)
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主频越快,耗时越短。
在计算机中,每隔N个高电频脉冲,时钟计算器加1,可以把自然时间分成固定的小块这个就是。
时间片:CPU时间片「10ms」 单位是jiffies。
CPU分「用户态,系统态,空闲态」,利用率 = (执行用户态 + 系统态的jiffies )/ 总jiffies。
Ondemand:官方内核默认使用这种调速器,规则是有高需求,迅速跳到最大频率,有低需求时迅速降到最小频率。
Conservative:规则是慢升快降,注重省电,有高需求,逐渐提高频率,有低需求时,迅速跳到最小频率。
Interactive:规则是快升慢降,有高需求,逐渐提高频率,有低需求时,逐渐减低频率Lulzactive:根据负载逐级升高或者降低频率。
Powersave:把频率锁定在设定范围的最小值,负载再高也不升高频率,很省电。
Performance:把频率锁定在设定范围的最大值,无论负载如何,CPU都全速运行,很费电。
注: 「CPU的频率高才越耗电」 。
计算优化;
避免WakeLock使用不当;
避免Alarm Manager使用不当;
使用Job Scheduler(WorkManager)。
尽量避开浮点运算
除法变乘法
充分利用位移(源码中有大量位移运算)
查表法,直接使用映射关系,但会增加内存,视具体场景来定
利用arm neon指令集做并行运算,需要ARM V7及以上架构CPU才能支持
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 循环时的闪烁情况。
ELAPSED REALTIME: 在多少 ms 后呼叫指定的 PendingIntent。若当时手机处于休眠,会延迟到手机醒来时(屏幕可能还是关的)才做。
「ELAPSED REALTIME WAKEUP」:在多少 ms 后呼叫指定的 PendingIntent。若当时手机处于休眠,会唤醒手机做事,同时休眠期间被延迟的事也会一起执行。「是最常见的耗电凶手」。
RTC:在指定的某段时间做事。若当时手机处于休眠,会延迟到手机醒来时 (屏幕可能还是关的)才做。
「RITC WAKEUP」:在指定的某段时间做事。若当时手机处于休眠,「会唤醒手机做事」,同时休眠期间被延迟的事也会一起执行。通常用于闹钟、记事提醒等。
Alarm能不用最好不用。
ELAPSED_REALTIME_WAKEUP是精准闹钟,能不用最好不用。
重要不紧急的任务,可以延迟执行,如定期数据库更新和数据上报。
耗电量较大的任务,比如充电时才希望执行备份数据操作。
不紧急可以不执行的网络任务,如在Wi-Fi环境预加载数据。
可以批量执行的任务。
精准度要求不高 不用需要开启GPS,蜂窝无线提供的数据足以
避免在信号弱(地下室)开启GPS