APP电量优化

2020-04-20  本文已影响0人  Coder_Sven

通过google的开源工具Battery-Historian来进行分析电量消耗

工具开源地址: [https://github.com/google/battery-historian]

安装Battery Historiany的方式有两种。

分别为Docker与源码编译安装。

Docker安装

Docker有Community Edition (CE 社区版) and Enterprise Edition (EE 企业版)两种版本。我们使用社区版就可以了。

1587347717446.png

安装好Docker之后,github上让我们运行

1587347836597.png

但是这个地址貌似需要翻墙。我们可以使用镜像

docker run --name=battery -d -p 9999:9999 bhaavan/battery-historian

一段漫长的等待……

然后

1587347945655.png

表示启动成功了

源码编译安装

需要存在go、git、python与java环境。

对于linux/Mac一般默认会携带python与git,如果不存在或者版本不正确也可以(brew install)。

sudo apt-get install golang

sudo apt-get install git

sudo apt-get install python2.7

安装go

Go 和java一样是一个编程语言,并且是开源的。因为Battery Historiany使用了go来开发,所以我们需要安装go环境。

​ 我们需要安装go,最低需要 1.8.1的版本

https://golang.org/dl/

选择自己需要安装的系统下载。第二列的Kind表示类型,有source源码(需要自己编译安装)、Installer安装器(下一步、下一步安装)与Archive编译好的(需要配置环境变量)。

1587348476126.png

安装完成后,使用go version

1587348537348.png

我们需要确保能够调起go工具,否则需要配置go环境变量。

Git工具

按照官网提示来进行安装就可以了

安装Python

python必须使用2.7的版本,

https://www.python.org/downloads/

1587348798108.png

安装完成可以使用python –V 检查是否安装成功。

安装 java

java没什么好说的了。下载安装,配置环境变量……

运行

4个工具都安装完成之后,我们就可以下载BH源码并运行了

我们进入GOPTAH目录,下载源码与其依赖:

1587348989899.png

然后我们运行bh

1587349015880.png

然后我们可以访问

[http://localhost:9999/]

1587349167519.png

如何进行电量优化

监听是否在充电

    /**
     * 是否正在充电
     * @return
     */
    public static boolean isPlugged(Context context){
        //发送个包含充电状态的广播,并且是一个持续的广播
        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent intent = context.registerReceiver(null,filter);
        //获取充电状态
        int isPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean acPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_AC;
        boolean usbPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_USB;
        boolean wifiPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
        return acPlugged || usbPlugged || wifiPlugged;
    }

我们可以通过判断当前手机充电状态去决定是否处理某些任务。比如:360 手机助手,当充上电的时候,才会自动清理手机垃圾,自动备份上传图片、联系人 等到云端,从而避免当用户手机低电量时,任然继续进行耗电操作。

WakeLock

wake_lock 锁主要是相对系统的休眠而言的,意思就是程序给 CPU 加了这个锁那系统就不会 休眠了,这样做的目的是为了全力配合我们程序的运行。有的情况如果不这么做就会出现一些 问题。
需要使用 PowerManager 这个系统服务的唤醒锁(wake locks)特征来保持 CPU 处于唤醒状 态。唤醒锁允许程序控制宿主设备的电量状态,创建和持有唤醒锁对电池的续航有较大的影 响,所以,除非是真的需要唤醒锁完成尽可能短的时间在后台完成的任务时才使用它。比如在 Acitivity 中就没必要用了。

只有一种合理的使用场景,使用后台服务在屏幕关闭情况下 hold 住 CPU 完成一些工作,需要 使用唤醒锁,如果不使用唤醒锁来执行后台服务,不能保证因 CPU 休眠未来的某个时刻任务 会停止,这不是我们想要的。

        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        //只唤醒cpu
       PowerManager.WakeLock locationLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "location_lock");
       //使CPU一直处于工作状态,手动调用release来关闭
        locationLock.acquire();

注意:在使用该类的时候,必须保证 acquire 和 release 是成对出现的。不然当我们业务已经不需要时, 当 CPU 处于唤醒状态,这个时候就会损耗多余的电量。

JobScheduler

自 Android 5.0 发布以来,JobScheduler 已成为执行后台工作的很好的方式,其工作方式有 利于用户在适当的时机执行正确的事情。应用可以在安排作业的同时允许系统基于内存、电源 和连接情况进行优化。JobSchedule 的宗旨就是把一些不是特别紧急的任务放到更合适的时机 批量处理。这样做有两个好处:

GPS

选择合适的 Location Provider

Android 系统支持多个 Location Provider:

如果 App 只是需要一个粗略的定位那么就不需要使用 GPS 进行定位,既耗费电量,定位的耗 时也久。

参考代码

[https://github.com/games2sven/Battery_Improve]

上一篇 下一篇

猜你喜欢

热点阅读