前言

相信各位大佬肯定在开发中遇到过这个问题:一顿操作猛如虎之后,总感觉程序有时候有点卡顿;或者自己自测得好好的,但是测试妹子的机器上却卡成狗。
那么,能不能做到运行APP之后,能自动地列出哪些类的哪些方法在主线程比较耗时呢?并且对原工程代码低侵入性或者零侵入性呢?

开源插件推荐

答案当然是肯定的,为了方便大家使用,这里我先列出来自己刚写的一个开源项目,专门监听Android主线程耗时方法。传送门:

Android耗时方法监听插件 MethodTimeMonitor

集成这个插件后,可以手动输入希望过滤的耗时时间,比如过滤出来主线程耗时200ms的方法,然后以包级目录结构的方式展示出来。

原理方案

首先,我们聊聊能实现需求的几种方案

  1. 定义基类,在基类中相关方法预留埋点代码
  2. Java动态代理
  3. 插桩技术

第一种方式我们可以直接pass掉,因为这样会对原工程造成非常高的倾入性,并且根本不能满足实现所有类在主线程的监听。这种方式只适合固定类的监听,比如监听所有Activity的生命周期。
第二种方式稍微靠谱,但是有一个致命缺点就是,动态代理只能代理接口,而不能代理实体类。并且同样不能满足所有类在主线程的监听。
第三种方式才是解决问题之道,也是我这篇文章的核心。

插桩技术

目前适用于Android的插桩技术有几个,比如笔者常用的有 ASM 和 Javassist。

Javassist 使用起来比较方便,使用语法都是 Java 形式的,库内部会自动转换为虚拟机指令。

ASM 的话使用起来就较为复杂,并且需要熟悉 JVM 虚拟机指令,然后通过虚拟机指令编程的方式进行插桩。但是复杂的使用换来的却是灵活的方式,因为你使用的是虚拟机指令,因此几乎你可以做到任何你想做到的事。不过想要把 ASM 玩出花来还需要很长的一段路要走,笔者也仅仅是停留在“会用”的阶段。

之前我有一系列的文章讲过 Javassist,因此这次这个库我采用的是 ASM 来实现的。对于 ASM 的使用,网上资料较少,大家最好去官网去阅读英文文档。因为不是本文重点,这里就不介绍 ASM 的使用了。

监控效果

Android主线程耗时方法监控相关推荐

  1. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  2. android切换线程的方法,android 主线程切换方法

    子线程无法更新UI new Thread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this ...

  3. 【Android】子线程切回主线程的方法梳理

    [Android]子线程切回主线程的方法梳理 view.post(Runnable action) textView.post(() -> {textView.setText("更新t ...

  4. iOS主线程耗时检测方案

    前言 主线程耗时是一个App性能的重要指标.主线程阻塞,立马会引起用户操作的卡顿,这是最直接的反应,所以是我们必须关注的一个性能点. 检测方案 Instrument - Time Profiler T ...

  5. android主线程和子线程的区别

    android 主线程和子线程有什么区别 本文较为深入的分析了android中UI主线程与子线程.分享给大家供大家参考. 具体如下:在一个Android 程序开始运行的时候,会单独启动一个Proces ...

  6. C#多线程下, 子线程如何让主线程执行方法

    C#多线程下, 子线程如何让主线程执行方法 重现一下当时我的需求: 我开了多个线程, 来监视一个变量, 然后去执行一些方法. 看起来没什么毛病, 但是运行起来会报错 此对象被其他线程占用 一开始想着可 ...

  7. 【Android】Android主线程真的不让进行耗时操作吗?

    默认情况下,Android主线程(UI线程)不让进行网络请求,否则会抛出NetworkOnMainThreadException. 但是主线程还可以让程序员进行其它类型的耗时操作,比如读写磁盘数据.遍 ...

  8. android主线程访问网络的方法

    从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...

  9. RxJava开发精要7 - Schedulers-解决Android主线程问题

    原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...

最新文章

  1. mysql qadir_MySQL 及 SQL 注入
  2. 机器学习模型 知乎_机器学习中有哪些模型?
  3. 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable...
  4. Java Socket编程----通信是这样炼成的
  5. iPhone 不能读取plist文件!?
  6. JSP:Cookie实现永久登录(书本案例)
  7. 《掌控习惯》学习总结
  8. java table 增加行_使用POI给word中的表格增加行
  9. ubuntu使用meld/beyond compare 做git的diff工具
  10. 【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发
  11. R语言实现灰色预测模型gm11
  12. Apache Shiro RememberMe 1.2.4 反序列化过程命令执行漏洞【原理扫描】
  13. MAC OS 配置JDK环境变量
  14. mysql数据库之备份和恢复
  15. 基于Dotnetty和Protobuf的Unity客户端开发(一)
  16. vs中readfile的作用,readFile和readFileSync之间的区别
  17. 大牛们的讨论,非常棒,推荐推荐--微信支付能颠覆支付宝吗?传统企业如何互联网化?
  18. 远程访问同一局域网中的计算机
  19. 真有效值与有效值概念
  20. eclipse视图介绍

热门文章

  1. 欲登千层楼,又何惧寒风
  2. Vue.js如何获得兄弟元素,子元素,父元素(DOM操作)
  3. ubuntu下安装 julia-1.4.2
  4. 一文了解无聊猿(BAYC)的 NFT 帝国是如何形成的
  5. 树莓派最新最快更新源2020.06.06
  6. 智慧时代,如何让路口交通安全又高效?
  7. 地下通信管道的管孔都快占满了,新增光缆怎么布放?
  8. SLAM中双目三角化
  9. 再见了,IE浏览器!微软决定明年停止对IE浏览器的支持
  10. 面向对象程序设计——埃拉托色尼筛法(C++)(已更新)