【Android -- 性能优化】耗电优化

不断学习,做更好的自己!💪

视频号CSDN简书
欢迎打开微信,关注我的视频号:程序员朵朵点我点我

一、前言

在移动设备开发中耗电量是一个非常重要的指标,如果用户一旦发现我们的应用非常耗电,不好意思,他们大多会选择卸载来解决此类问题,所以耗电量是一个十分重要的问题。

常见耗电量最大原因都是因为网络数据交互、GPS定位、大量内存性能问题、冗余的后台线程以及Service等造成的。

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

二、耗电量优化建议:

  • 在需要网络的应用中,执行某些操作前尽量先进行网络状态判断。

  • 在网络应用传输中使用高效率的数据格式和解析方法,譬如JSON等。

  • 在传输用户反馈或者下载OTA升级包等不是十分紧急的操作时尽量采用压缩数据进行传输且延迟到设备充电和WIFI状态时进行。

  • 在有必要的情况下尽量通过PowerManager.WakeLock和JobScheduler来控制一些逻辑操作达到省电优化。

  • 对定位要求不太高的场景尽量使用网络定位,而不是GPS定位。

  • 对于定时任务尽量使用AlarmManager,而不是sleep或者Timer进行管理。

  • 尽可能的减少网络请求次数和减小网络请求时间间隔。

  • 后台任务要尽可能少的唤醒CPU,譬如IM通信的长连接心跳时间间隔、一些应用的后台定时唤醒时间间隔等要设计合理。

  • 特殊耗电业务情况可以进行弹窗等友好的交互设计提醒用户该操作会耗用过多电量。

三、电量优化常见问题

1、怎么做电量测试?

电量相关的测试相对来说难度较大,因为 App 在具体手机上的耗电量无法准确统计,每一个手机所使用的硬件不一样,那么它相应的功耗就不一样。而且这个功耗值我们只能在线下通过导出手机的 power_profile.xml 文件拿到。

由于我们无法获取准确的耗电量,所以我们只能增加多个维度来辅助判断 App 是否耗电。

最后,我们可以分场景各个突破。

关于电量测试,我们可以针对各个功能场景进行针对性的专项测试。操作一段时间后,我们可以在手机设置—电量消耗里面,利用其数据作为判断依据。这样虽然直观,但精确度不行。

介绍 Battery Historian:

  • Google 推出的一款 Android 电量分析工具,它支持 Android 5.0 及以上系统的电量分析。
  • 它获取到的各个耗电模块的耗电信息要相对精确、丰富地多。例如 GPS、WaleLock、蓝牙 等的工作时间以及耗电量。
  • 此外,它不仅可以针对单个 App 进行选择,也可以比对不同的电量场景的信息,比如 优化前、优化后 的信息。
  • Battery Historian 的缺点在于它只能在线下使用。因此除了使用其在线下测试之外,我们还需要在线上增加一些电量的辅助监控,统计例如:耗电组件的使用次数、调用堆栈以及访问时间。这些都是与用户相关的基础电量消耗数据,如果有用户反馈,我们就可以通过这些信息来判断用户是不是有耗电的操作。

2、有哪些有效的电量优化手段?

因为我们不能在线上统计出 App 的电量消耗,因此需要在尽量保证 App 在正常使用下的耗电。对此我们采取了一系列的电量优化措施:

1)、网络相关
网络请求的时机以及次数,将可以延迟的网络请求批量发送,减少网络被激活的时机与次数。
此外,我们可以对网络传输数据进行压缩,以降低传输的时间与流量。
最后,一定要禁止使用轮询的方式来做业务操作。

2)、传感器相关
根据场景谨慎地选择传感器使用的模式,比如说在使用 GPS 的时候一般要避免使用高精度的模式,或者是尽量复用上一次的定位结果。

3)、WakeLock
我们在实际项目中使用 WakeLock 有几个注意事项,第一,acquire、release 要成对地释放,第二,尽量使用 acquire 的超时方法来设置超时时间,避免因为异常情况从而导致 WakeLock 而无法释放的情况,第三,关于 WakeLock 的释放一定要写在 try-catch-finally 的 finally 当中,保证 WakeLock 在异常情况下的释放。

4)、JobScheduler
JobScheduler 可以允许开发者在符合某些条件下创造执行在后台的任务,我们可以设置执行一些耗电操作的场景,比如说 处于 WIFI 状态下同时连接电源 的情况下。同时,要注意用户在离开界面后,要避免耗电的操作,比如说停止播放动画。通过这些操作,我们的 App 就不会比之前耗电了。

四、电量检测方案

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

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

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

1、设置—耗电排行

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

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));

缺点

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

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
  • 6.0和6.0之前:adb bugreport > bugreport.txt
  • 通过 historian 图形化展示结果:python historian.py -a bugreport.txt > battery.html
上传分析

1)、打开 http://localhost:
在这里插入图片描述
如果打不开,可以使用备用网站 bathist

2)、上传 bugreport 文件,点 Submit 提交即可。

Battery Historian 数据分析

Hitorian V2 — 电量统计图表

Add Metrics
在这里插入图片描述
在 Add Metrics 中我们可以增加更多的测量项。

CPU running
在这里插入图片描述
如果一直处于 running,则表明电量消耗比较高。

JobScheduler
在这里插入图片描述
选中 Job Scheduler 的某一个工作时间片,我们可以查看具体的 发生的时间、耗时以及次数,最重要的是它统计出来了是哪一个进程在使用这个 JobScheduler。

App Selection
在这里插入图片描述
1)、选择要分析电量的指定 App。
2)、点击右边区域的 System Stats 一栏可以在下方查看各个系统组件的电量百分比消耗详情,例如 Userspace Wakelocks。

主入口处的 Switch to Bugreport Comparison
在这里插入图片描述
选择多个文件进行上传对比。

5、电量专项测试

1)、耗电场景测试

  • 复杂计算。
  • 音视频播放。

2)、传感器相关

  • 使用时长
  • 耗电量
  • 发热

3)、后台静默测试

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kevin-Dev

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

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

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

打赏作者

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

抵扣说明:

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

余额充值