Android--耗电优化

  1. 谁在消耗手机电池的电量

我们写的应用程序不会直接消耗手机电池的电量,而会通过使用手机的硬件模块来消耗电量。例如:CPU,WIFI 模块, GPS 模块,NetWork 模块, WakeLock 模块, 音视频,Screen…, 每个硬件模块的单位耗电量也不一样。

  1. 电量与应用程序

电量计算公式:** 电量 = 电压 * 电流 * 时间 **。

一般,手机的电压是恒定的,所以,电量只与电流和时间的乘积有关。所以,模块电量计算公式:**模块电量= 模块电流 * 模块使用时长 **。
不同的模块,单位时间内消耗的电流不一样。如何获取模块单位时间内消耗的电流那?

Android 系统要求手机厂商必须在 /frameworks/base/core/res/res/xml/power_profile.xml 中配置不同模块的电流值。另外,Android提供了API PowerProfile 用于获取电量,其原理也是通过读取 power_profile 配置的值来计算。同时,我们也可以不使用API,通过以下的步骤也可以获取:

1. 从手机中导出 /system/framework/framework.apk
    adb pull /system/framework/framework.apk 
2. 使用工具 apktool 或 jadx 
    apktool d framework.apk // 在当前目录生成一个framework文件夹
    jadx 直接查看 apk 文件
3. 查看 res/xml/power_profile.xml 文件

如果我们想直接查看详细的耗电情况,可以使用以下的命令

// 当需要单独测试某一场景时,调用此命令,并断开电源(防止其他条件,导致数据不准),
adb shell dumpsys batterystats --reset // 重置电量统计

// 在使用 bugreport 命令生成 zip 文件前,调用此命令
adb shell dumpsys batterystats > batterystats.txt // 将耗电情况输入到 batterystats.txt 中
  1. 耗电分析

想要做耗电优化,要知道哪些模块耗电严重,必须有的放矢,否则,无头苍蝇式的乱猜一气,浪费时间和感情,还没有效果。如何做耗电分析那?

想要做耗电分析,就要使用 bugreport+historian 生成电量消耗的网页。

1. bugreport
    Android提供的工具,用于统计手机在某一时间内的所有信息。所以,它的size不会小,10几M算是少的。如果我们为了分析一个电量消耗,就要从10几M的文件中查找定位,效率太低了。因此,Android又开发了 historian 工具用于帮助我们分析电量消耗。
2. historian
    Android提供的分析电量消耗的工具。它会根据bugreport生成的文件,生成一个html网页,我们可以直观的看到每一模块的耗电情况,甚至可以看到指定应用的模块耗电情况。

historian 工具的环境安装以及使用

1. 访问[historian](https://github.com/google/battery-historian),查看 reademe
2. [下载docker](https://docs.docker.com/engine/install/ubuntu/#installation-methods)
    这一步按照官网的步骤,一步步来,不要急。
    ````
    adb apt-get update 
    adb apt-get install docker-ce // 安装 docker 引擎
    apt-cache madison docker-ce // 查看当前 docker 的版本
    sudo apt-get install docker-ce="5:20.10.9~3-0~unbuntu-focal" docker-ce-cli="5:20.10.9~3-0~ubuntu-focal" containerd.io // 安装指定版本的 docker引擎
    sudo docker run -p 9999:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999 // 将端口号 9999 置为 historian 分析工具的专用端口。 这一步我使用了 VPN。
    ````
3. 使用 bugreport 生成 zip或txt文件
    android 7.0以后使用 *adb bugreport bugreporty_xx.zip*, android 7.0以前使用 *adb bugreport bugreportxx.txt*。
4. 在浏览器输入: localhost:9999 打开 historian 网页。
5. 将第三步生成的 bugreporty_xx.zip或bugreportxx.txt放进第四步打开的网页,然后 submit,最后生成电量消耗的直观图。
  1. 耗电优化

所谓的耗电优化,其实就是减少应用的耗电,增加用户的续航时间。根据前面的电量计算公式,发现电量只与电流和时间有关。另外,电流是厂商制定的,所以我们只能从时间纬度来进行耗电优化。

使用时间:这里的使用时间包含两个方面:后台使用时间和前台使用时间

  1. 后台耗电
    顾名思义,号台耗电对用户是无感知的,是在用户不知道的情况下,悄咪咪的偷走了手机电量。有哪些情况下会导致后台耗电那?例如:广告SDK会在后台一直尝试获取定位,以便为我们推准确度高的广告;推送服务也会在后台持有WakeLock,以便在规定的时间发送通知;下载服务在后台下一些东西…对于这些业务,我们也只能望洋兴叹。但是对于可能造成后台耗电的业务,我们应该多思考一下技术的替代方案。
  • 后台Alerm闹钟唤醒
  • 后台请求网络
  • 后台进行WIFI扫描
  • 部分长时间的 WakeLock阻止系统休眠
  1. 前台耗电
    相比于后台耗电,前台耗电比较容易分析一些,也容易定位问题。例如:当我们在 historian 中看到 CPU 消耗的电量比较多时,就看一下我们的代码哪些会造成CPU使用过渡,能不能减少一些?哪些行为会造成CPU使用率过高那,下面列一些:
    1. 反复进行网络请求
    2. UI布局过于复杂
    3. 动画忘记停止,或动画导致整个页面重绘 (可以使用手机自带的 显示界面更新 功能查看 更新情况 )
    4. 加载大图片
    5. 。。。
    前台的耗电,一般是我们的代码漏洞导致的,所以,提交代码前多review几遍是有必要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值