目录

一、三大耗电模块

二、显示

2.1 Overdraw简介

2.2 Overdraw检测

2.3 UI优化优化

三、网络

3.1 移动网络

3.2 Wi-Fi

3.3 网络优化

四、CPU

4.1 变频

4.2 CPU优化

4.2.1 计算优化

4.2.2 避免WakeLock使用不当

4.2.3 避免Alarm Manager使用不当

4.2.4 使用Job Scheduler(WorkManager)

五、其他

5.1 GPS优化

5.2 精简冗余的服务(Service), 避免长时间执行耗电操作。

5.3 避免与服务器建立长连接。

5.4 减少 CPU 资源使用(滑动或动画)。

5.5 减少 View 的 background 使用,特别是不明显的 background。增加性能、也减少功耗。


一、三大耗电模块

  • 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

  • 在理想情况下,吞吐量大,延迟低,通常是不计费。

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都全速运行,很费电。

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」:在指定的某段时间做事。若当时手机处于休眠,「会唤醒手机做事」,同时休眠期间被延迟的事也会一起执行。通常用于闹钟、记事提醒等。

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。增加性能、也减少功耗。

11-21 06:47