Android 电量优化

这篇具有很好参考价值的文章主要介绍了Android 电量优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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、网络报错处理文章来源地址https://www.toymoban.com/news/detail-547235.html

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

到了这里,关于Android 电量优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 可测含多进程的app-- python调用adb命令获取Android App应用的性能数据:CPU、GPU、内存、电池、耗电量(含python源码)

    python脚本通过os.popen()方法运行adb命令,获取性能数据,将性能数据保存在csv文件并算出均值、最大值、最小值。 本脚本可测试一个app包含多个进程的场景,可以获取 每个进程的性能数据 。 2.1 软件环境 具备python环境,Android环境 需要python库:os, csv, time, datetime, sys,time,panda

    2024年02月13日
    浏览(35)
  • Android 性能优化系列:启动优化进阶

    应用的速度优化是我们使用最频繁,也是应用最重要的优化之一,它包括启动速度优化、页面打开速度优化、功能或业务执行速度优化等等,能够直接提升应用的用户体验。 大部分人谈到速度优化,只能想到一些零碎的优化点,比如使用多线程、预加载等等,没有一个较为体

    2024年02月13日
    浏览(31)
  • Android 性能优化——APP启动优化

            首先在《Android系统和APP启动流程》中我们介绍了 APP 的启动流程,但都是 FW 层的流程,这里我们主要分析一下在 APP 中的启动流程。要了解 APP 层的启动流程,首先要了解 APP 启动的分类。 冷启动         应用从头开始启动,即应用的首次启动。需要做大量的工

    2024年04月12日
    浏览(35)
  • Android性能优化系列篇(二):启动优化

    汇总了一下众多大佬的性能优化文章,知识点,主要包含: UI优化/启动优化/崩溃优化/卡顿优化/安全性优化/弱网优化/APP深度优化等等等~ 本篇是第二篇:启动优化!  [非商业用途,如有侵权,请告知我,我会删除] 强调一下: 性能优化的开发文档跟之前的面试文档一样,想要的

    2023年04月11日
    浏览(44)
  • Android 性能优化(六):启动优化的详细流程

    书接上文,Android 性能优化(一):闪退、卡顿、耗电、APK 从用户体验角度有四个性能优化方向: 追求稳定,防止崩溃 追求流畅,防止卡顿 追求续航,防止耗损 追求精简,防止臃肿 卡顿的场景通常与用户交互体验最直接,分别为UI、启动、跳转、响应四个方面,如下图所示

    2024年04月17日
    浏览(46)
  • Android性能优化—ViewPagers + Fragment缓存优化

    大家看标题,可能会有点儿懵,什么是ViewPagers,因为在很久之前,我们使用的都是ViewPager,但是现在更多的是在用ViewPager2,因此用ViewPagers(ViewPager、ViewPager2)来代替两者,主要介绍两者的区别。 ViewPagers嵌套Fragment架构,在我们常用的App中随处可见,抖音的首页、各大电商

    2024年02月01日
    浏览(50)
  • Android启动速度优化

    本节主要内容:了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求; ②system_server进程接收到

    2024年02月15日
    浏览(32)
  • Android启动流程优化 中篇

    本文链接:https://blog.csdn.net/feather_wch/article/details/131587046 1、我们可以优化部分 Application构建到主界面onWindowFocusChanged 2、启动方式(官方) 冷启动 热启动 温启动 3、怎么样算是卡顿? 卡顿:2-5-8原则 2秒以内:流程 2-5秒:可以接受 5-8秒:有些卡顿 8秒以上:非常卡顿,没办法接

    2024年02月12日
    浏览(40)
  • Android 应用启动过程优化

    应用启动流程: 1、startActivity 交给AMS判断处理(Binder通信) 2、AMS匹配到对应的应用信息后通知zygote去fork进程(socket通信) 3、反射调用ActivityThreadd的main函数之后,将匿名binder(ApplicationThread)交由AMS,建立了app的binder通信基础。 4、AMS通知App进程(binder通信)去创建启动Activity(on

    2024年02月07日
    浏览(34)
  • Android中级——性能优化

    画面流畅需要帧数为60帧每秒 Android通过VSYNC信号触发对UI的绘制,其间隔时间是1000ms/60=16ms(即1000ms内显示60帧画面的单位时间) 故需在16ms之内完成绘制才可以保证画面的流畅 否则会造成丢帧,如一次绘制耗时20ms,当16ms时系统发出VSYNC信号还未绘制完,下一个帧就会被丢弃,

    2023年04月20日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包