常被忽略的Android电量优化

前言:

做为一个Android应用的开发人员,有时你可能并不关心手机电量的使用情况,认为这是手机厂商或者系统开发人员所该关心的事儿,其实不然,对于用户体验来说,最重要的是能够使用设备,一个没电的手机和一块板砖没有什么区别。一旦用户发现是你的应用非常耗电,导致电池使用时间大大降低,可能会毫不犹豫的卸载掉。因此电池电量的优化也是我们所必须要关心和解决的性能优化问题之一。废话不多说,开撸......

 

工欲善其事必先利其器:

要想对电池电量进行优化,首先你得了解应用电量的使用情况,从来才能来分析耗电原因。Google官方推荐使用Batterystats和Battery Historian来分析电池用量。

Batterystats是包含在Android框架中的一种工具,用于收集设备上的电池数据。我们可以通过adb命令来收集并取出数据。

Battery Historian是一款强大的电池数据分析工具,能够分析Batterystats所收集到的数据并在浏览器中以HTML视图的方式来直观的查看。但很遗憾的是它并没有被集成到Android Tool中去,因此需要我们自己去下载安装它。安装Battery Historian最好的方式是使用Docker,因此首先我们需要去Docker官网来安装Docker(对于window用户而言,目前Docker hub只支持win10,如果你不是win10系统,那么很抱歉,只能通过https://github.com/google/battery-historian上的第二种方式来安装Battery Historian了)。

安装完成后可通过cmd进入到battery-historian目录下,然后输入go run cmd/battery-historian/battery-historian.go [port](默认端口号为9999)来启动battery-historian,最后登录 http://localhost:9999查看。

接下来就是通过Batterystats来收集电量使用报告了。

1.打开设备开发者模式,连接设备 通过adb devices命令来查看设备是否正常连接。

 

2.通过adb shell dumpsys batterystats --reset命令来重置电量使用报告。

3.断开设备连接,开始使用应用,消耗电量。

4.重新连接设备,通过adb bugreport  [path]/bugreport.zip (android 7.0以上)或者adb bugreport > [path]/bugreport.txt(android 7.0以下)导出电量使用报告 。

 

通过Battery historian分析:

讲上面获取到的bugreport.zip或者bugreport.txt上传并提交给Battery Historian。可以在浏览器上得到直观的分析报告(下面这张是网图,我的图片被墙了,难受ing)。

可以看到这里的横坐标是时间轴,纵坐标是一堆指标包括Battery Level(电量)、Long Wakelocks(长唤醒锁)、Screen(屏幕点亮情况)、Top app(栈顶app即哪个app正在被使用)、JobScheduler(后台工作)、GPS(定位是否开启)等等。通过这些指标我们可以分析出这段时间内是哪些app或者哪些功能耗电情况。

 

如何优化:

网络请求

通常情况下频繁的网络请求是耗电的主要原因,因此我们需要考虑优化网络请求。对于即时性不高的请求比如后台的下载任务之类的尽量在手机充电状态下进行批处理。我们可以通过以下代码来监听设备充电状态:

        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = registerReceiver(null,filter);
        int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
        boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
        if (acCharge){
            //正在充电中...
        }

Wakelock

Wake_lock是系统唤醒锁,当程序给CPU加了这个锁之后系统就不会休眠了。这么做的目的是为了让我们的程序全力工作。有时候不这么做会出现一些问题,这时候我们需要通过PowerManager的唤醒锁(Wake_lock)来保持CPU处于唤醒状态。唤醒锁允许程序控制宿主设备的电量状态,创建和持有唤醒锁对电池的续航有较大的影响,所以,除非是真的需要唤醒锁完成尽可能短的时间在后台完成的任务时才使用它。

后台任务

在执行后台任务的时候,我们应该像网路请求那样,基于内存、电源和网络连接情况等进行优化,对于一些非即时性的任务,我们应该放在更合适的时机进行批处理。

GPS

对于android系统定位一般分为3种:GPS_PROVIDER(gps定位),是利用gps芯片通过卫星来进行定位的,这种方式定位精度高,但是由于需要激活gps芯片,所以耗电量大,而且在室内或者阴雨天气GPS定位会受到较大影响。NETWORK_PROVIDER(网络定位),是利用手机网络和基站进行定位的,这种定位方式取决于将基站或WIFI节点信息翻译成位置信息的服务器的能力。PASSIVE_PROVIDER(被动定位)是通过缓存上次定位来定位的,即不主动获取定位信息。

当我们不需要精确定位时,比如只需要定位城市之类的,就没必要开启GPS定位而增加耗电。

当我们结束定位需求后,应该及时的关闭定位服务,避免不必要的耗电。

当多个模块使用定位的时候,我们应该尽量复用上次结果,从而节省电量消耗。

 

总结:

本文首先介绍了目前来说常用的电量分析工具Battery Historian,其次介绍了部分耗电的指标和如何省电,但这绝对不是电量优化的全部,只是一种解决思路,对于电量优化而言是个复杂的问题,它涉及到很多方面,只要你使用设备就一直在耗电。电量优化的核心思想就一个字:省,能省则省,能批处理就批处理,能用耗电小的方法代替就绝对不用耗电多的。更多的电量优化方案需要我们沿着核心思想继续摸索学习...

 

补充:

Battery Historian在Win10上的详细安装过程可以参考这篇文章:Battery-Historian在win10上的详细环境搭建过程

Battery Historian在非Win10上的安装过程较为复杂,github上可能不够详细,可以参考这篇文章:电量分析工具 Battery Historian 的配置及使用

 

猜你喜欢

转载自blog.csdn.net/ledding/article/details/107185653
今日推荐