敞开生长之旅!这是我参加「日新计划 2 月更文挑战」的第 2 天,点击检查活动详情

节能减排,从我做起。一款Android运用假如十分耗电,是一定会被主人嫌弃的。自从Android手机的主人用了你开发的app,一天下来,也没干啥事,电就没了。那么他就会想尽方法找出耗电量杀手,当他找出后,很有或许你开发的app就被无情的卸载了。为了避免这种工作发生,咱们就要想想方法让咱们的运用不那么耗电,电都用在该用的时候和地方。

通过power_profile.xml检查各个手机硬件的耗电量

Google要求手机硬件生产商都要放入power_profile.xml文件到ROM里边。有些不太负责的手机生产商,就乱配,也没有真正测试过。但咱们还是能够大概知道耗电的硬件都有哪些。

先从ibotpeaches.github.io/Apktool/ 下载apktool反编译东西,然后履行adb指令,将手机framework的资源apk拉取出来。

adb pull /system/framework/framework-res.apk ./

然后咱们用下载好的反编译东西,将framework-res.apk进行反编译。

java -jar apktool_2.7.0.jar d framework-res.apk

apktool_2.7.0.jar换成你下载的详细的jar包名称。 power_profile.xml文件的目录如下:

framework-res/res/xml/power_profile.xml

<?xml version="1.0" encoding="utf-8"?>
<device name="Android">
    <item name="ambient.on">0.1</item>
    <item name="screen.on">0.1</item>
    <item name="screen.full">0.1</item>
    <item name="bluetooth.active">0.1</item>
    <item name="bluetooth.on">0.1</item>
    <item name="wifi.on">0.1</item>
    <item name="wifi.active">0.1</item>
    <item name="wifi.scan">0.1</item>
    <item name="audio">0.1</item>
    <item name="video">0.1</item>
    <item name="camera.flashlight">0.1</item>
    <item name="camera.avg">0.1</item>
    <item name="gps.on">0.1</item>
    <item name="radio.active">0.1</item>
    <item name="radio.scanning">0.1</item>
    <array name="radio.on">
        <value>0.2</value>
        <value>0.1</value>
    </array>
    <array name="cpu.active">
        <value>0.1</value>
    </array>
    <array name="cpu.clusters.cores">
        <value>1</value>
    </array>
    <array name="cpu.speeds.cluster0">
        <value>400000</value>
    </array>
    <array name="cpu.active.cluster0">
        <value>0.1</value>
    </array>
    <item name="cpu.idle">0.1</item>
    <array name="memory.bandwidths">
        <value>22.7</value>
    </array>
    <item name="battery.capacity">1000</item>
    <item name="wifi.controller.idle">0</item>
    <item name="wifi.controller.rx">0</item>
    <item name="wifi.controller.tx">0</item>
    <array name="wifi.controller.tx_levels" />
    <item name="wifi.controller.voltage">0</item>
    <array name="wifi.batchedscan">
        <value>.0002</value>
        <value>.002</value>
        <value>.02</value>
        <value>.2</value>
        <value>2</value>
    </array>
    <item name="modem.controller.sleep">0</item>
    <item name="modem.controller.idle">0</item>
    <item name="modem.controller.rx">0</item>
    <array name="modem.controller.tx">
        <value>0</value>
        <value>0</value>
        <value>0</value>
        <value>0</value>
        <value>0</value>
    </array>
    <item name="modem.controller.voltage">0</item>
    <array name="gps.signalqualitybased">
        <value>0</value>
        <value>0</value>
    </array>
    <item name="gps.voltage">0</item>
</device>

抓到不负责任的手机生产商一枚,好家伙,这么多0.1,明眼人一看就知道这是为了应付Google。虽然这样,咱们还是能够从中知道,耗电的有Screen(屏幕亮屏)、Bluetooth(蓝牙)、Wi-Fi(无线局域网)、Audio(音频播映)、Video(视频播映)、Radio(蜂窝数据网络)、Camera的Flashlight(相机闪光灯)和GPS(全球定位系统)等。

电量杀手简介

Screen

屏幕是十分耗电的一个硬件,不要问我为什么。屏幕主要有LCD和OLED两种。LCD屏幕白色光线从屏幕背后的灯管发出,虽然屏幕显现黑屏,依旧耗电,这种屏幕逐步被筛选,假如你翻出个早点的功用机,或许能看到。那么大部分Android手机都是OLED的屏幕,每个像素点都是独立的发光单元,屏幕黑屏时,一切像素都不发光。有必要时,让屏幕息屏很重要,当然手机也有自动息屏的时刻设置,这个不太需求咱们操心。

Radio数据网络和Wi-Fi无线网络

网络也是十分耗电的,其中又以数据网络的耗电更多于Wi-Fi的耗电。所以请尽量引导用户运用Wi-Fi网络运用app的部分功用,比如下载文件。

GPS

GPS也是很耗电的硬件,所以不要动不动就请求地理位置,GPS平常是要封闭的,除非你在运用定位和导航等功用,这样你的手机续航会更好。

WakeLock

假如运用了WakeLock,是能够有用防止息屏情况下的CPU休眠,但是假如不用了,你不释放掉锁的话,则会带来很大的电量的开销。

检查手机耗电的历史记录

// 上次拔掉电源到现在的耗电情况
adb shell dumpsys batterystats --unplugged

你在逗我?让我看指令行的输出?后边咱们来运用Battery Historian的图表进行剖析。

运用Battery Historian剖析手机耗电量

安装Docker

Docker下载网址 docs.docker.com/desktop/ins…

运用Docker容器编排

docker run -p 9999:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999

获取bugreport文件

Android7.0及以上

adb bugreport bugreport.zip

Android6.0及以下

adb bugreport > bugreport.txt

上传bugreport文件进行剖析

在浏览器地址栏输入http://localhost:9999

Android电量优化,让你的手机续航更持久
点击Browse按钮并上传bugreport.zip或bugreport.txt生成剖析图表。
Android电量优化,让你的手机续航更持久
咱们能够通过时刻轴来剖析运用当下的电池运用情况,比较耗电的是哪部分硬件。

运用JobScheduler来合理履行后台使命

JobScheduler是Android5.0版本推出的API,允许开发者在符合某些条件时创建履行在后台的使命。比如接通电源的情况下才履行某些耗电量大的操作,也能够把一些不紧急的使命在合适的时候批量处理,还能够避开低电量的情况下履行某些使命。