前言
本章我们主要是来手写一个 APM 框架;
上一章节补充
上一周我们讲解了包体积优化,讲到了 SO 的动态加载,另外我们在加载 SO 的时候,经常会遇到
UnSatisfiedLinkError
这个错误,主要的原因是兼容性问题,包 SO 的裁剪,由于国内厂商 Rom 的魔改,修改了 SO 的加载路径;
这里我们通常都是使用一个开源框架 ReLinker 来解决这个问题。
核心是:解析 so 的二进制文件,获取 so 的依赖属性(这个是 Android 系统行为导致,如果这个 so 有依赖其他的 so, 那么就要先加载依赖的 so 然后才能加载目标 so,这个能力在 7.0 及以后的版本解决掉了)
APM 重点关注指标
搭建 APM 框架,我们要重点关注一些指标
- 稳定性问题
- 流量/网络问题(Http的可达率、拦截器)
- 电量
- 流量消耗
- 内存(指标的统计、内存泄露)
- FPS
- 启动耗时监控
整体的 APM 框架,我们可以借助开源框架的思想来实现,这里大家可以深入学习了解下 ArgusAPM 和 Matrix
电量检测
整体的 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())

最低0.47元/天 解锁文章
3319

被折叠的 条评论
为什么被折叠?



