Android方法耗时监控工具

Android方法耗时计算监控工具1、背景为了监控一些方法耗时2、需求要实现以下功能:Application onCreate()方法耗时Activity生命周期方法耗时Fragment生命周期方法耗时(TODO)自定义方法耗时…3、实现3.1、技术方案利用Transform + ASM字节码修改技术动态插入代码3.2、Application onCreate()方法耗时考虑到App多重继承的情况,即App继承BaseApp,BaseApp继承Application;或者
摘要由CSDN通过智能技术生成

Android方法耗时监控工具

1、背景

为了监控一些方法耗时

2、需求

要实现以下功能:

  1. Application onCreate()方法耗时
  2. Activity生命周期方法耗时
  3. Fragment生命周期方法耗时(TODO)
  4. 自定义方法耗时
  5. webview网页加载耗时

3、实现

3.1、技术方案

利用Transform + ASM字节码修改技术动态插入代码

3.2、Application onCreate()方法耗时

考虑到App多重继承的情况,即App继承BaseApp,BaseApp继承Application;或者三方库需要代理App类,如Tinker。因此为了方便、统一处理,通过注解的方式,显示指定App类。

/**
 * @description app类注解,用于指定启动的App类
 * @Author pxq
 * @Date 2020/8/7 17:44
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface App {
   
}

@App
public class MyApp extends BaseApp {
   
    
    @Override
    public void onCreate() {
   
     	//todo ...   
    }
    
}
3.3、Activity生命周期方法耗时
3.3.1、理论

1、Hook Instrumentation

优点:可以精确到各个生命周期

缺点:很多框架都Hook,比如插件化,需要重写大量方法兼容

2、Hook Handler或者Looper的Printer

优点:简单

缺点:只能无法精确到各个生命周期,只能计算onCreate 到 onResume的时间、存在Android版本兼容问题

参考https://segmentfault.com/a/1190000020262028?utm_source=tag-newest

3.3.2、 Hook Instrumentation

Hook Instrumentation是比较完美的方案,这里使用这种方式。

/**
 * @description 自定义代理Instrumentation,统计Activity生命周期耗时
 * @Author panxq
 * @Date 2020/8/7 17:59
 */
public class ProxyInstrumentation extends Instrumentation {
   

    private Instrumentation baseIns;
	// 控制一些变量,如打印阈值,是否重复打印等
    private ActivityWire activityWire;

    public ProxyInstrumentation(Instrumentation baseIns, ActivityWire activityWire) {
   
        this.baseIns = baseIns;
        this.activityWire = activityWire;
    }

    @Override
    public void callActivityOnCreate(Activity activity, Bundle icicle) {
   
        // 计算onCreate执行耗时
        callOnPrev(activity, Trace.TRACE_ON_CREATE);
        baseIns.callActivityOnCreate(activity, icicle);
        callOnPost(activity, Trace.TRACE_ON_CREATE);
    }
    ...下同
        
}

/**
 * @description ActivityThread hook类
 * @Author pxq
 * @Date 2020/8/7 17:50
 */
public class ActivityThreadHooker {
   

    private static final String TAG = "ActivityThreadHooker";

    public static void hookIns(ActivityWire activityWire) throws Exception {
   
        // 获取ActivityThread类
        @SuppressLint("PrivateApi")
        Class<?> activityThreadClass = Class.forName("android.app.ActivityThread")
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值