如何应对 Android 面试官 -> 手写 APM 核心实现

前言


本章我们主要是来手写一个 APM 框架;

上一章节补充


上一周我们讲解了包体积优化,讲到了 SO 的动态加载,另外我们在加载 SO 的时候,经常会遇到

UnSatisfiedLinkError

这个错误,主要的原因是兼容性问题,包 SO 的裁剪,由于国内厂商 Rom 的魔改,修改了 SO 的加载路径;

这里我们通常都是使用一个开源框架 ReLinker 来解决这个问题。

核心是:解析 so 的二进制文件,获取 so 的依赖属性(这个是 Android 系统行为导致,如果这个 so 有依赖其他的 so, 那么就要先加载依赖的 so 然后才能加载目标 so,这个能力在 7.0 及以后的版本解决掉了)

APM 重点关注指标


搭建 APM 框架,我们要重点关注一些指标

  • 稳定性问题
  • 流量/网络问题(Http的可达率、拦截器)
  • 电量
  • 流量消耗
  • 内存(指标的统计、内存泄露)
  • FPS
  • 启动耗时监控

整体的 APM 框架,我们可以借助开源框架的思想来实现,这里大家可以深入学习了解下 ArgusAPMMatrix

电量检测

整体的 APM 框架,我们通常需要定义一些核心接口类,让各个检测模块分别来实现,我们简单定义一个接口 ITracker 用来规范相关采集接口

public interface ITracker {
    
    void destroy(Application application);

    void startTrack(Application application);

    void pauseTrack(Application application);
}

再来定义一个生命周期接口处理类,我们在所需要的采集模块复写对应的生命周期接口即可

public abstract class ActivityLifeCycleCallbacks implements Application.ActivityLifecycleCallbacks {
    @Override
    public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
        
    }

    @Override
    public void onActivityStarted(@NonNull Activity activity) {

    }

    @Override
    public void onActivityResumed(@NonNull Activity activity) {

    }

    @Override
    public void onActivityPaused(@NonNull Activity activity) {

    }

    @Override
    public void onActivityStopped(@NonNull Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(@NonNull Activity activity) {

    }
}

电量检测这块,本质就是接收电量信息的 receiver 发过来的电量信息,这个我们可以在页面的 onActivityStarted 和 onActivityStoped 的时候出来相关获取信息;

我们先来定一个电量信息类

public class BatteryInfo {
    public boolean charging;
    public String activityName;
    public float cost;
    public long duration;
    public String display;
    public int total;
    public int voltage;
    public float screenBrightness;
}

接下来我们来定义采集类 BatteryStatsTracker 我们在 onSctivityStarted 的时候获取电量的百分比,在 onActivityStoped 的时候采集相关信息,并将采集的信息回调出去;

回调接口定义类:

public interface IBatteryListener {
    void onBatteryCost(BatteryInfo batteryInfo);
}

BatteryStatsTracker 实现

public class BatteryStatsTracker  extends ActivityLifeCycleCallbacks implements ITracker {
    private static BatteryStatsTracker sInstance;
    private Handler mHandler;
    private String display;
    private int mStartPercent;
    private HandlerThread handlerThread;

    private BatteryStatsTracker() {
        handlerThread = new HandlerThread("BatteryStats",Thread.NORM_PRIORITY);
        mHandler = new Handler(handlerThread.getLooper());
    }

    public static BatteryStatsTracker getInstance() {
        if (sInstance == null) {
            synchronized (BatteryStatsTracker.class) {
                if (sInstance == null) {
                    sInstance = new BatteryStatsTracker();
                }
            }
        }
        return sInstance;
    }

    @Override
    public void destroy(Application application) {

    }

    @Override
    public void startTrack(Application application) {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
    }

    @Override
    public void pauseTrack(Application application) {

    }

    @Override
    public void onActivityStarted(@NonNull Activity activity) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
                Intent batteryStatus = activity.getApplication().registerReceiver(null, filter);
                // 获取电量百分比
                mStartPercent = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            }
        });
    }


    @Override
    public void onActivityStopped(@NonNull Activity activity) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if (mListeners.size() > 0) {
                    BatteryInfo batteryInfo = getBatteryInfo(activity.getApplication())
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值