Android 电量优化

本文详细介绍了Android电量优化的基本概念,包括电能公式、电池容量、耗电测试方法等。探讨了Battery Historian工具的使用,以及显示屏、网络、CPU等方面的优化策略。强调了显示颜色、网络请求合并、CPU频率管理和WakeLock的正确使用对于电量节省的重要性。同时提供了实战案例,如显示屏的深色主题、网络请求优化和CPU利用率控制。

Android 电量优化

本文链接:https://blog.csdn.net/feather_wch/article/details/131648478

基本概念

1、手机耗电的元凶?

  1. 软件
  2. 硬件,功率计

2、App三大耗电模块

  1. 显示
  2. 网络
  3. CPU

3、电能公式
电能J = 电功率P * 时间t
电功率P = 电压U * 电流I
电量Q = 电流I * 时间t

4、电池容量是什么?
电池容量4000mah: 以4000ma放电可以放1h

如何测试耗电量

5、测试耗电量有哪些方法?

  1. Android API:registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED))
  2. 读取系统电池传感器设备节点:?/sys/class/power_supply_battery/uevent
  3. 使用外置电流仪器

原因分析

6、Android能耗统计文件

  1. 放置在frameworks/base/core/res/res/xml/power_profile.xml
  2. 每个手机都有framworks-res.apk 反编译后,可以找到res/xml/power_profile.xml
  3. 不同厂商的不同设备,都有不同,取决于硬件。最终电量计算来源于该xml
//power_profile 内容如下
<?xml version="1.0" encoding="utf-8"?>
<device name="Android">

  <item name="ambient.on">0.1</item>  <!-- ~100mA -->
  <item name="screen.on">0.1</item>  <!-- ~100mA -->
  <item name="screen.full">0.1</item>  <!-- ~100mA -->
  <item name="bluetooth.active">0.1</item> <!-- Bluetooth data transfer, ~10mA -->
  <item name="bluetooth.on">0.1</item>  <!-- Bluetooth on & connectable, but not connected, ~0.1mA -->
  <item name="wifi.on">0.1</item>  <!-- ~3mA -->
  <item name="wifi.active">0.1</item>  <!-- WIFI data transfer, ~200mA -->
  <item name="wifi.scan">0.1</item>  <!-- WIFI network scanning, ~100mA -->
  <item name="audio">0.1</item> <!-- ~10mA -->
  <item name="video">0.1</item> <!-- ~50mA -->
  <item name="camera.flashlight">0.1</item> <!-- Avg. power for camera flash, ~160mA -->
  <item name="camera.avg">0.1</item> <!-- Avg. power use of camera in standard usecases, ~550mA -->
  <item name="gps.on">0.1</item> <!-- ~50mA -->

  //省略很多..............
</device>

7、BatteryStatsHelper.java 帮助进行电量消耗计算,位于BatteryStatsService.java服务中

  1. 源码中可以看到通话、数据、wifi、传感器等所有功能的耗电量
  2. 移动网络虚弱的时候,需要停止网络请求 ==> 耗电量是每个信号强度耗电量累加

8、应用程序的耗电量计算是按照uid统计的

  1. 如果通过shareuid都加入到同一个uid中,那么电量消耗是算在一起的

9、WakeLock耗电量

  1. 进程wakelock事件 * cpu_awake(power_profile.xml中ccpu_awake)

10、WakeLock是什么?

  1. 有些App功能需要熄屏时还可以继续工作,比如音乐
  2. wakelock机制能让app继续运行
  3. 注意一定要及时释放:会导致耗电量统计非常大

电能统计

11、电能统计-重置+开启

  1. adb shell dumpsys batterystats --reset
  2. adb shell dumpsys --enable full-wake-history
  3. adb shell dumpsys --disable full-wake-history

12、电能统计-直接查看分析

  1. adb shell dumpsys batterystats --charge

13、电能统计-文本分析

  1. adb shell dumpsys batterystats > batterystats.txt
  2. adb shell dumpsys batterystats > com.xx.xxx > batterystats.txt

14、batterystats.txt分析:对实际优化有哪些帮助?

  1. 看到网络耗电量很大,需要关注网络请求部分,网络切换部分

15、AlramManager闹钟唤醒所持有的锁不合理,也会导致耗电量多

16、RIJ:通信上层需要向Modem(调制解调器)发送数据时,此时会获取名为RIJ 的锁

17、应用锁是什么?

18、JobScheduler调度的任务所持有的锁

  1. 可以看到淘宝有使用这个JobScheduler

19、分析各种复杂系统日志的技巧

  1. 先锁定时间点
  2. 再搜索关键字

BatteryHistorian

20、BatteryHistorian环境搭建有两种方式

  1. Docker + 镜像
  2. GoLang + Python2.7 + Git + Java + 拉取源代码 + 编译

21、电能统计-Battery Historian 2.0 分析

  1. adb bugreport xxx_bugreport.zip
  2. zip上传至 http://localhost:9999
  3. 上传成功会显示图形化页面

实战

显示屏

22、OLED屏幕 => 深色会比浅色更省电

  1. 通过开关控制深色
  2. 使用的时候建议亮度最大。如果是80%的亮度,就是开80%的时间,关80%的时间

23、LCD => 影响功耗的只有亮度

  1. 底层有个发光模块,去照射中间的颜色层。
  2. 亮度越高,耗电越大

24、显示优化方案

  1. 不影响应用场景的情况下,尽量使用深色主题

网络

25、网络的影响

  1. 大部分耗电都和网络有关
  2. 尤其是弱网场景下:网络差时进入偏向状态,以最大功率获取信号

26、3G模式下状态机,新建一次请求消耗多少电量?

  1. 一共20s电量消耗:(总结在三种状态中切换)
  2. Low Power1.5s后进入最佳状态Full Power
  3. 5s后进入Low Power
  4. 12s后进入Standby

27、4G下RRC状态机 4G(LTE)状态机

  1. 尽量合并网络请求,减少状态机切换

28、Wifi优化

  1. Wifi状态下尽量把数据都请求了
  2. 通常情况wifi功耗低于移动网络
  3. 有时候Wifi很卡不是因为别人用了Wifi,而是不同wifi频率相同,共享了带宽

29、GPS优化

  1. GPS使用时开启,不用时关闭
  2. 使用时要检测GPS信号强度,强度很弱会增加功耗和发热

30、网络优化总结

  1. 增量拉取数据
  2. 界面展示的数据非wifi下不预先取
  3. 实时信息上报在后台时改成非实时
  4. 合并网络请求,减少请求次数
  5. 尽量利用wifi请求数据
  6. 有功能需要频繁拉取网络信息,非wifi情况下不要那么频繁

CPU

31、CPU时间片是什么

  1. 计算机中每相隔N个高电频脉冲,时钟计数器+1,自然分割成小块
  2. 时间片,10ms,单位jiffies(1/Hz)内核时钟单位

32、变频

  1. CPU根据需求有多重变频方案:快升快降,慢升快降,快升慢降

33、CPU利用率越高越耗电? => 错误的,CPU功耗只和频率有关。

34、CPU优化方案总结

  1. 计算优化
  2. 避免浮点
  3. 除法变乘法
  4. 利用位移
  5. 查表法:使用映射关系,但会增加内存
  6. 用arm neon指令集做并行运算
  7. 避免WakeLock使用不当:根据需求选择CPU运转+是否屏幕常亮+是否有键盘灯
  8. 避免AlarmManager使用不当:能不用就不用,选择好策略(是否唤醒设备)
  9. 使用Job Scheduler(WorkManager)
  10. 定时数据库更新和上报
  11. 充电时才需要执行备份数据
  12. Wifi预加载数据
  13. 可以批量执行任务

35、Doze模式

  1. 判断用户连续一段时间没有使用手机,延缓App中后台的CPU和网络活动

总结

36、设计和编码时如何进行电量优化(避免)

  1. 阻止手机休眠
  2. 经常唤醒手机
  3. 后台频繁运行
  4. 过度绘制

37、WakeLock使用

WakeLock wakelock = powerManager.newWakeLock(xxx);
wakelock.acquire();
...
if(wakelock.isHeld()){
wakelock.release();
}
wakelock.acquire(timeout) // 可以多少毫秒后,自动释放
wakelock.setRefrenceCounted(false) // 可以直接关闭引用计数,一次release就直接完全释放
  1. WakeLock适合熄屏后还要执行的任务(音乐)
  2. WakeLock acquire和release要配对使用,一一对应
  3. WakeLock 只支持Service组件使用
  4. 使用Partial WakeLock需要设定timeout,超过时间后自动释放。避免无法释放导致问题。

38、Alarm使用

  1. 场合:App进程不存在了,也需要在某短时间在后台做事(闹钟、记事提醒、给服务器上传数据)
  2. 耗电元凶

39、广播

  1. 尽量不要使用常驻静态广播
  2. 关闭广播:
  3. 使用时开启,使用完关闭:pm.setComponentEnableSetting(receiver,…)
  4. 尽量注册动态广播
  5. 尽量避免注册有序广播
  6. 用LocalBroadcastManager(Handler实现,同进程广播)
  7. 用包名去限定广播接收的范围
  8. 跨进程频繁通信:要使用bindService或者ContentResolver.call

40、Activity pause释放/暂停不必要资源

  1. 位置更新
  2. 传感器
  3. 动画、滑动 停止
  4. unregister一些资源,如果不能unregister就设置flag标志,到前台时才真正更新数据
  5. 减少View的background

41、网络报错处理

  1. 优先检测网络是否联通
  2. 增加失败重试机制,重试次数越多,间隔时间越长
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值