100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Android电量优化全解析 赶快收藏备战金九银十

Android电量优化全解析 赶快收藏备战金九银十

时间:2023-08-10 01:24:52

相关推荐

Android电量优化全解析  赶快收藏备战金九银十

作为开发者,我们很想知道我的应用执行的哪些任务消耗的电量是最多的?这个问题确实会很棘手。因为电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情(所以很多设备都把这个监测电量的功能阉割掉了)。

唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗(因为第三方硬件监测的时候是用的自己的供电而不是用的手机的电量)。

耗电情况,例如:打开屏幕,所有要使用CPU/GPU工作的动作都会唤醒屏幕,都会消耗电量。这和应用程序唤醒设备还不一样。比如使用叫醒闹钟(wake clock)、AlarmManager、JobSchedulerAPI。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mmZSDRb-1630654848689)(https://user-gold-cdn.xitu.io//2/19/16904494d4b73834?imageView2/0/w/1280/h/960/ignore-error/1)]

手机哪些地方最耗电?

唤醒屏幕

当用户点亮屏幕的时候,意味着系统的各组件要开始进行工作,界面也需要开始执行渲染。

待机状态的电量消耗:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yc51MEeO-1630654848691)(https://user-gold-cdn.xitu.io//2/19/16904494d8e08b81?imageView2/0/w/1280/h/960/ignore-error/1)]

使用和唤醒屏幕后:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11KsKYd7-1630654848692)(https://user-gold-cdn.xitu.io//2/19/16904494d8f47c41?imageView2/0/w/1280/h/960/ignore-error/1)]

当设备从休眠状态中,被应用程序唤醒时,可以看到在第一次唤醒时,出现一条电量使用高峰线。

CPU唤醒使用

CUP 唤醒时的高峰线:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sar5zK51-1630654848694)(https://user-gold-cdn.xitu.io//2/19/1690449502c37a5a?imageView2/0/w/1280/h/960/ignore-error/1)]

接下来就是后续的一些执行的消耗了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GXsrp7Z-1630654848695)(https://user-gold-cdn.xitu.io//2/19/16904494d902b4bf?imageView2/0/w/1280/h/960/ignore-error/1)]

当工作完成后,设备会主动进行休眠,这非常重要,在不使用或者很少使用的情况下,长时间 保持屏幕唤醒会迅速消耗电池的电量。

蜂窝式无线

当设备通过无线网发送数据的时候,为了使用硬件,这里会出现一个唤醒耗电高峰。接下来还 有一个高数值,这是发送数据包消耗的电量,然后接受数据包也会消耗大量电量 也看到一个峰值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntU4qfZ3-1630654848696)(https://user-gold-cdn.xitu.io//2/19/1690449500830c48?imageView2/0/w/1280/h/960/ignore-error/1)]

通常情况下,使用3G移动网络传输数据,电量的消耗有三种状态:

Full power:能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进 行操作。Low power:一种中间状态,对电量的消耗差不多是 Full power 状态下的 50%。Standby:最低的状态,没有数据连接需要传输,电量消耗最少。

Battery-Historian 电量分析工具的使用

要进行电量优化,我们首先得知道电都消耗到哪里去了,我们可以通过 google 开源的 Battery-Historian 来进行分析。

工具开源地址: /google/batt…

Battery History 工具安装

根据 gitbub 上面介绍,Battery History 工具的安装有两种方式:

方式1:通过安装 Docker 环境来安装。(这种方式很简单,Docker 真心好用)

按照 Docker 网站上的说明安装 Docker Community Edition。使用以下命令运行 Battery Historian 镜像:

docker --run -p port_number:9999 gcr.io/android-battery-historian:2.1 --port 9999

方式2通过编译 gitbub 上面的源码来安装。

GO 环境安装:具体可以参考Mac os 安装 golang 开发环境(/p/79bdd20c4…)安装 git.安装 Python。仅支持 python2.7 (/ )安装Java环境

下载 Battery Historian 源码并且运行

输入如下命令行 下载到GOPATH 配置目录下。

go get -d -u /google/battery-historian/...

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEXkyePL-1630654848697)(https://user-gold-cdn.xitu.io//2/19/169044950f7ff0c9?imageView2/0/w/1280/h/960/ignore-error/1)]

进入到$GOPATH/src//google/battery-historian目录下方

cd $GOPATH/src//google/battery-historian

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMbbG35Y-1630654848698)(https://user-gold-cdn.xitu.io//2/19/1690449521c619b4?imageView2/0/w/1280/h/960/ignore-error/1)]

运行 Battery Historian 1.执行命令:

go run setup.go

Compile Javascript files using the Closure compiler

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6dpDK3S-1630654848698)(https://user-gold-cdn.xitu.io//2/19/169044952bff31cf?imageView2/0/w/1280/h/960/ignore-error/1)]

2.接着在执行命令:

go run cmd/battery-historian/battery-historian.go [--port <default:9999>]

Run Historian on your machine (make sure [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2drI9ujB-1630654848699)(https://juejin.im/equation?tex=PATH%20contains)]GOBIN) 3.登录网址http://localhost:9999查看battery-historian是否运行。

到此Battery-historian的环境就整好了。

电量数据收集

Android 5.0 及以上的设备, 允许我们通过 adb 命令 dump 出电量使用统计信息。 1.因为电量统计数据是持续的, 会非常大, 统计待测试的 App 之前需要连上设备,因此需要reset(重置)电池数据收集。命令行执行:

$ adb shell dumpsys batterystats --resetBattery stats reset

2.断开usb连接的测试设备, 操作要测试的App。

3.重新连接设备, 使用 adb 命令导出相关统计数据:

Android 7.0 及以上执行如下命令:

adb bugreport > [path/]bugreport.zip

Android 5.0/ 6.0执行如下命令:

adb bugreport > [path/]bugreport.txt

导出的统计数据存储到 bugreport.zip(bugreport.txt), 借助 battery-historian 工具来图形化 展示电池的消耗情况.

上传 bugreport.zip(bugreport.txt)文件至 http://localhost:9999:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkDZ4ILQ-1630654848700)(https://user-gold-cdn.xitu.io//2/19/16904495415d3f21?imageView2/0/w/1280/h/960/ignore-error/1)]

battery-historian电量分析结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PBUsFxaf-1630654848700)(https://user-gold-cdn.xitu.io//2/20/16908e42f78a7e7d?imageView2/0/w/1280/h/960/ignore-error/1)]

分析指标

下图是使用 adb 命令将采集的电量数据上传至 Battery Historian 而得到电量的分析情况。(我们可以通过包名过滤具体应用的耗电情况)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FytRGiKy-1630654848701)(https://user-gold-cdn.xitu.io//2/20/16908e42f78a7e7d?imageView2/0/w/1280/h/960/ignore-error/1)]

各指标的含义

横坐标:横坐标就是一个时间范围,咱们的例子中统计的数据是以重置为起点,获取 bugreport 内容时 刻为终点。我们一共采集了多长时间的数据;纵坐标:关键数据点说明如下。

如何进行电量优化?

了解手机关键耗电的地方及分析耗电的工具后。接下来就是我们的核心,如何来进行电量的优 化?首先我们先简单总结汇总一下耗电的相关因素

屏幕亮暗相关设备 awake,sleep 的切换,尤其是唤醒.CPU 运行相关网络传感器

我们都知道屏幕的渲染及 CPU 的运行是耗电的主要因素之一。所以当我们在做内存优化、渲染优化、计算优化的时候,就已然在做电量优化。所以在平时的开发中,我们要注意点滴性能 的优化积累,实际上当我们来做电量分析的时候,也是在找自己挖的坑。所以尽量有意识在项 目的开发过程中尽量少挖坑,这一点是我们在分析其他优化项首先要提到的一个点。

监听手机充电状态

我们可以通过下面的代码来获取手机的当前充电状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gFSxTxx8-1630654848702)(https://user-gold-cdn.xitu.io//2/19/16904495484320f7?imageView2/0/w/1280/h/960/ignore-error/1)]

得到充电状态信息之后,我们可以有针对性的对部分代码做优化。比如我们可以判断只有当前 手机为 AC 充电状态时 才去执行一些非常耗电的操作。可以通过下面的方法判断手机当前的充 电状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AK6ZUtjx-1630654848702)(https://user-gold-cdn.xitu.io//2/19/1690449548fb6b47?imageView2/0/w/1280/h/960/ignore-error/1)]

这里我们就需要思考,根据具体的业务,考虑将一些不需要及时地和用户交互的操作放到充电 的时候去做。比如:360 手机助手,当充上电的时候,才会自动清理手机垃圾,自动备份上传图片、联系人 等到云端,从而避免当用户手机低电量时,任然继续进行耗电操作。

屏幕唤醒

当 Android 设备空闲时,屏幕会变暗,然后关闭屏幕,最后会停止 CPU 的运行,这样可以防 止电池电量掉的快。但有些时候我们需要改变 Android 系统默认的这种状态:比如玩游戏时我 们需要保持屏幕常亮,比如一些下载操作不需要屏幕常亮但需要 CPU 一直运行直到任务完成。

保持屏幕常亮比较好的方式是在 Activity 中使用 FLAG_KEEP_SCREEN_ON 的 Flag。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iuxKnkxh-1630654848703)(https://user-gold-cdn.xitu.io//2/19/16904495558a8e3a?imageView2/0/w/1280/h/960/ignore-error/1)]

这个方法的好处是不像唤醒锁(wake locks),需要一些特定的权限(permission)。并且能 正确管理不同 app 之间的切换,不用担心无用资源的释放问题。

另一个方式是在布局文件中使用 android:keepScreenOn 属性:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6xkdgUF0-1630654848703)(https://user-gold-cdn.xitu.io//2/19/16904495828e4789?imageView2/0/w/1280/h/960/ignore-error/1)]

android:keepScreenOn = “true”的作用和 FLAG_KEEP_SCREEN_ON 一样,使用代码的好 处是你允许你在需要的地方关闭屏幕。

注意:一般不需要人为的去掉 FLAG_KEEP_SCREEN_ON 的 flag,windowManager 会管理好程序进入 后台回到前台的的操作。如果确实需要手动清掉常亮的 flag,使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pW8zylqX-1630654848704)(https://user-gold-cdn.xitu.io//2/19/169044957b65ed32?imageView2/0/w/1280/h/960/ignore-error/1)]

所以这里我们需要根据自己的 APP 实际情况,根据业务来控制好是否保持屏幕常量。比如 APP 需要支持视频播放。那么在播放的界面需要控制好不熄屏,当退出播放时,当然就没有了 这个设置。

LAG_KEEP_SCREEN_ON 的 flag,windowManager 会管理好程序进入 后台回到前台的的操作。如果确实需要手动清掉常亮的 flag,使用

[外链图片转存中…(img-pW8zylqX-1630654848704)]

所以这里我们需要根据自己的 APP 实际情况,根据业务来控制好是否保持屏幕常量。比如 APP 需要支持视频播放。那么在播放的界面需要控制好不熄屏,当退出播放时,当然就没有了 这个设置。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。