美文网首页Android开发经验谈Android开发Android技术知识
史上最全!Android程序性能优化之耗电优化(二)

史上最全!Android程序性能优化之耗电优化(二)

作者: 小陈不爱敲代码 | 来源:发表于2020-04-22 20:28 被阅读0次

前言:

在上一篇文章已经给大伙把耗电优化的一些概念整明白了,错过的朋友可以关注我,在我的个人主页补习一下。这篇文章咱直接上代码,用实践来检验真理。话不多说,直接上干货!

Java Hook

Hook 方案的好处在于使用者接入非常简单,不需要去修改自己的代码。下面我以几个比较常用的规则为例,看看如果使用 Java Hook 达到监控的目的。

开始编码

下面开始lib_battery_hook的编写,这个框架花了两天时间完成,主要是里面代理Hook的实现,需要翻阅相关的源码并分析,最终实现了IAlarmManagerHook、IPowerManagerHook、ILocationManagerHook这三那个代理,分别实现对AlarmManager、PowerManager、LocationManager的监听。

 /**
 * @date on 2019/2/19
 * @author  lyg-hhy1
 * @email  yueshao6800@163.com
 * @describe
 */
public class BatteryHookManager {

    /**
     * 初始化
     * @param context
     */
    public void initHook(Context context){
        //初始化日志
        BatteryLogUtil.init(context);

        //初始化Hook
        new IAlarmManagerHook(context).onInstall();
        new IPowerManagerHook(context).onInstall();
        new ILocationManagerHook(context).onInstall();
    }

    private BatteryHookManager(){}
    private static class BatteryHookManagerHolder{
        private static final BatteryHookManager INSTANCE= new BatteryHookManager();
    }

    public static BatteryHookManager getImp(){
        return BatteryHookManagerHolder.INSTANCE;
    }

} 

在项目的application里面初始化BatteryHook,


public class BatteryApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        BatteryHookManager.getImp().initHook(this);

    }
} 

发现问题

集成后,迫不及待跑了一下,果然看到了下面这些日志:

这个好像是高德地图SDK的定位,每次项目启动app都会触发一次,

还发现一处比较诡异的,IMPushService长期持有设备唤醒锁,看了一下代码


 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {
            if (wakeLock != null && !wakeLock.isHeld()) {
                wakeLock.acquire();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        ……
    }

    @Override
    public void onDestroy() {
        if (wakeLock != null && wakeLock.isHeld()) {
            wakeLock.release();
        }
        wakeLock = null;
        ……
    } 

很奇怪,从IM的服务启动,到销毁,一直持有设备唤醒锁,这肯定非常的耗电。接下来我们采用的是Battery Historian2.0验证了一下,Historian2.0这是Google推出的一款Android系统电量分析工具,支持5.0(API 21)及以上系统手机的电量分析。

修复并验证

这是优化之前的好定分析:

下面是去掉IMService中长期唤醒设备,这是优化之后的结果:

统计结果如下:

从测试结果可以看出,没有优化前耗电是优化后的9倍。

版权声明:本文为CSDN博主「yueshao6800」的原创文章,转载附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq980106800/article/details/87801488

如果对您有帮助,请给我点个关注,每天分享知识干货,共同进步!

相关文章

网友评论

    本文标题:史上最全!Android程序性能优化之耗电优化(二)

    本文链接:https://www.haomeiwen.com/subject/ouxgihtx.html