你是否了解APP耗电问题?深入探索 Android 电量优化

本文探讨了Android应用中的电量优化重要性,分析电池技术包括充电安全与快充技术,详细介绍了电量检测方案如ACTION_BATTERY_CHANGED广播、dumpsys batterystats和Battery Historian。耗电优化难点在于后台任务和CPU时间片管理,提出JobScheduler等策略。最后讨论电量监控与优化常见问题,提供电量测试和优化手段。
摘要由CSDN通过智能技术生成

一、正确认识

1、为什么要做电量优化?

在 Android 应用开发中,我们需要考虑的是如何优化电量使用,让我们的 App 不会因为电量消耗过高被用户排斥,或者被其他安全应用报告,以此确保用户黏性。

2、电量重视度不够

开发中一直连接手机,不知道电量消耗有多快。

3、电量消耗线上难以量化

我们没有办法拿到每一个用户手机的组件能耗,其中不同的硬件模块使用了不同的参数,然后使用了不同的算法来进行估算。但是,具体的参数值根据手机所使用的硬件来说是不一样的。

二、电池技术

1、电池容量

现在一般手机的电池容量会占用内部组件将近一半的空间。

2、充电时间

1)、OPPO VOOC 闪充技术

  • 1、适配器中加入 MCU 智能芯片,得益于 MCU 对电流的精准调节,VOOC 实现了分段恒流和分档技术,起步时,VOOC 会挂上高速档,中间时会自动挂上中速档,让你快速前行,结尾时又会切换成低速挡,让你平稳到站。

  • 2、从适配器到接口再到手机内部的全端式五重防护技术。

  • 1)、适配器过载保护 电流进入适配器时,其中的传感器会实时检测电压电流,安全时, MOSFET(保护)开关会自动打开闪充。

  • 2)、闪充条件鉴定保护 电流通过适配器时,MCU 芯片会识别设备是否支持闪充,只有支持才开启闪充与第二级过载保护。

  • 3)、接口过载保护 电流进入手机时,在特别定制的 7pinUSB 接口处,手机内的 MCU 会控制第三个 MOSFET(保护)开关,实行第三级过载保护。

  • 4)、电池过载保护 电池内的特殊 IC 和 MOSFET(保护)开关负责对进入电池的电压电流实行过载保护。

  • 5)、电池熔丝保护 出现异常时,电池内的保险丝会立即熔断,物理性断绝电流输入。

  • 3、将充电安全指数从 PPM(百万分之一)提升至航天级别 DPM(十亿分之一)。

2)、快充技术

P=UI(电功率=电压 * 电流)

普通充电过程

  • 1)、先将 220V 电压通过充电头降至 5V。
  • 2)、然后,手机内部电路再把 5V 电压降至 4.2V。
  • 3)、最后,把电量输送给电池,而整个降压的过程中会产生热能。

分类

  • 1)、高压低电流快充方案:在充电过程中提升充电电压(7-20V)来提升充电功率。
  • 2)、低压大电流快充方案:在电压一定情况下,增加电流,通常使用并联电路的方式进行分流。
  • 3)、铝-石墨烯超级电池
  • 超高耐用性和安全性,快充充电1.1秒就能充满电。
  • 实验阶段。

3、寿命

通常使用充电循环次数衡量。

4、安全性

严格控制电池容量,例如 VOOC 就使用了各种安全检测技术。

5、电量和硬件

  • 手机耗电是通过使用相应的硬件模块来消耗电能。
  • CPU、屏幕、WIFI、数据网络、GPS、音视频通话在日常耗电量中占比最大。

6、Android 耗电演进

KITKAT

批处理传感器

分批有效地收集和传递传感器事件。

Alarm 对齐

批处理在合理的相似时间内的所有应用的闹铃,以便系统仅唤醒一次。

Lollipop

  • 开启 Volta 项目
  • Job Scheduler
  • dumpsys batterystats
  • Battery Historian
  • 修复 native fork 进程保活的 bug

Marshmallow

  • 省电功能
  • Doze 低功耗模式
  • App Standby 应用待机摸手机

Nougat

  • 优化省电功能
  • Doze 加强版
  • implicit broadcasts 显示
  • 混合编译

Oreo

  • 更多优化省电功能
  • 后台执行限制
  • 后台位置限制

P(电压管理严格限制)

应用待机分组(App Standby Bueckets)

  • 从应用安装开始。
  • 分组决定后台被限制的程度。
  • 不常用的应用将被限制地更加严格。

应用后台限制(Background Restrictions)

  • 用户开启。
  • 停止后台运行。
  • 提示用户后台耗电严重的应用,用户可选择停止它们的后台运行。

省电模式(Battery Saver)

  • 用户开启。
  • 所有应用进入待机模式。
  • 更加严格的后台限制,而且无视应用的 Target API。

三、电量检测方案

对于电量的统计有一个公式,如下所示:

模块电量(mAh) = 模块电流(mA)* 模块耗时(h)

Android 系统要求 ROM 厂商必须在 /frameworks/base/core/res/res/xml/power_profile.xml 提供组件的电源配置文件。而 Android 系统的电量计算 PowerProfile 正是通过读取 power_profile.xml 的数据。

1、设置—耗电排行

  • 1)、直观,但没有详细数据,对解决问题帮助不大。
  • 2)、需要找特定场景专项测试,比如在某一个界面操作一段时间,然后来判断这个页面是否耗电。

2、使用广播监听电量变化—ACTION_BATTERY_CHANGED

获取电池电量、充电状态、电池状态等信息。

实战案例

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
Intent intent = registerReceiver(null, filter);
LogUtils.i("battery " + intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1));

缺点

  • 1)、价值不大:针对手机整体的耗电量,而非单个 App。
  • 2)、实时性差、精度较低,被动通知。

3、dumpsys batterystats

batterystats 是 Android 5.0 提供的工具,它可以获取各个 App 的 WakeLock、CPU 时间占用等信息,同时增加了一个 Estimated power use(mAh)功能,预估耗电量。

作用

将电量测量转化为功能模块的使用时间或者次数。

adb shell dumpsys batterystats > battery.txt

在 battery.txt 搜索 ‘Estimated power use’ 关键字,下面粗略统计了各个 Uid 的总耗电量。

Estimated power use (mAh):
Capacity: 3350, Computed drain: 2767, actual drain: 3752-3853
Uid 1000: 1014 ( cpu=999 wake=1.36 radio=11.4 wifi=1.24 gps=0.435 sensor=0.808 ) Excluded from smearing
Unaccounted: 985 ( ) Including smearing: 0 ( ) Excluded from smearing
Uid 0: 416 ( cpu=157 wake=210 radio=38.8 wifi=9.51 ) Excluded from smearing
...

batterystats 所记录的电量统计数据源自于 BatteryStatsService-电量统计服务,其实现类为 BatteryStatsImpl,内部正是使用的 PowerProfile 。

BatteryStatsImpl 为每一个应用创建与之对应的 UID 来监控器系统资源的使用情况,其统计了 12 大模块的电量消耗,如下所示:

  • Camera、Audio、Video
  • Bluetooth、Network、Wakelock
  • Sensor、Radio、Screen
  • WIFI、CPU、GPS

4、Battery Historian

特点

  • 1)、查看自设备上次充电以来各种汇总统计信息,而且可以选择对应的 App 查看详细信息。

  • 2)、可视化展示指标:

  • 耗电比例。

  • 执行时间、次数。

  • 3)、仅适合线下使用。

安装

  • 1)、安装 Docker
  • 2)、docker – run -p:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999 (需要翻墙)

导出电量信息

  • 1)、使用 batterystats 命令重置手机电量:adb shell dumpsys batterystats --reset

  • 2)、使用 batterystats 命令获取电池数据权限并开启记录全面的电量信息:adb shell dumpsys batterystats --enable full-wake-history

  • 3)、测试完成后,使用 bugreport 导出电量信息:

  • 7.0和7.0以后:adb bugreport bugreport.zip

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值