Android主线程耗时方法监控
前言
相信各位大佬肯定在开发中遇到过这个问题:一顿操作猛如虎之后,总感觉程序有时候有点卡顿;或者自己自测得好好的,但是测试妹子的机器上却卡成狗。
那么,能不能做到运行APP之后,能自动地列出哪些类的哪些方法在主线程比较耗时呢?并且对原工程代码低侵入性或者零侵入性呢?
开源插件推荐
答案当然是肯定的,为了方便大家使用,这里我先列出来自己刚写的一个开源项目,专门监听Android主线程耗时方法。传送门:
Android耗时方法监听插件 MethodTimeMonitor
集成这个插件后,可以手动输入希望过滤的耗时时间,比如过滤出来主线程耗时200ms的方法,然后以包级目录结构的方式展示出来。
原理方案
首先,我们聊聊能实现需求的几种方案
- 定义基类,在基类中相关方法预留埋点代码
- Java动态代理
- 插桩技术
第一种方式我们可以直接pass掉,因为这样会对原工程造成非常高的倾入性,并且根本不能满足实现所有类在主线程的监听。这种方式只适合固定类的监听,比如监听所有Activity的生命周期。
第二种方式稍微靠谱,但是有一个致命缺点就是,动态代理只能代理接口,而不能代理实体类。并且同样不能满足所有类在主线程的监听。
第三种方式才是解决问题之道,也是我这篇文章的核心。
插桩技术
目前适用于Android的插桩技术有几个,比如笔者常用的有 ASM 和 Javassist。
Javassist 使用起来比较方便,使用语法都是 Java 形式的,库内部会自动转换为虚拟机指令。
ASM 的话使用起来就较为复杂,并且需要熟悉 JVM 虚拟机指令,然后通过虚拟机指令编程的方式进行插桩。但是复杂的使用换来的却是灵活的方式,因为你使用的是虚拟机指令,因此几乎你可以做到任何你想做到的事。不过想要把 ASM 玩出花来还需要很长的一段路要走,笔者也仅仅是停留在“会用”的阶段。
之前我有一系列的文章讲过 Javassist,因此这次这个库我采用的是 ASM 来实现的。对于 ASM 的使用,网上资料较少,大家最好去官网去阅读英文文档。因为不是本文重点,这里就不介绍 ASM 的使用了。
监控效果
Android主线程耗时方法监控相关推荐
- Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿
原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...
- android切换线程的方法,android 主线程切换方法
子线程无法更新UI new Thread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this ...
- 【Android】子线程切回主线程的方法梳理
[Android]子线程切回主线程的方法梳理 view.post(Runnable action) textView.post(() -> {textView.setText("更新t ...
- iOS主线程耗时检测方案
前言 主线程耗时是一个App性能的重要指标.主线程阻塞,立马会引起用户操作的卡顿,这是最直接的反应,所以是我们必须关注的一个性能点. 检测方案 Instrument - Time Profiler T ...
- android主线程和子线程的区别
android 主线程和子线程有什么区别 本文较为深入的分析了android中UI主线程与子线程.分享给大家供大家参考. 具体如下:在一个Android 程序开始运行的时候,会单独启动一个Proces ...
- C#多线程下, 子线程如何让主线程执行方法
C#多线程下, 子线程如何让主线程执行方法 重现一下当时我的需求: 我开了多个线程, 来监视一个变量, 然后去执行一些方法. 看起来没什么毛病, 但是运行起来会报错 此对象被其他线程占用 一开始想着可 ...
- 【Android】Android主线程真的不让进行耗时操作吗?
默认情况下,Android主线程(UI线程)不让进行网络请求,否则会抛出NetworkOnMainThreadException. 但是主线程还可以让程序员进行其它类型的耗时操作,比如读写磁盘数据.遍 ...
- android主线程访问网络的方法
从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...
- RxJava开发精要7 - Schedulers-解决Android主线程问题
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...
最新文章
- mysql qadir_MySQL 及 SQL 注入
- 机器学习模型 知乎_机器学习中有哪些模型?
- 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable...
- Java Socket编程----通信是这样炼成的
- iPhone 不能读取plist文件!?
- JSP:Cookie实现永久登录(书本案例)
- 《掌控习惯》学习总结
- java table 增加行_使用POI给word中的表格增加行
- ubuntu使用meld/beyond compare 做git的diff工具
- 【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发
- R语言实现灰色预测模型gm11
- Apache Shiro RememberMe 1.2.4 反序列化过程命令执行漏洞【原理扫描】
- MAC OS 配置JDK环境变量
- mysql数据库之备份和恢复
- 基于Dotnetty和Protobuf的Unity客户端开发(一)
- vs中readfile的作用,readFile和readFileSync之间的区别
- 大牛们的讨论,非常棒,推荐推荐--微信支付能颠覆支付宝吗?传统企业如何互联网化?
- 远程访问同一局域网中的计算机
- 真有效值与有效值概念
- eclipse视图介绍