5. StrictMode带来的思考

StrictMode总的来说,是一个插桩思想的体现,也是AOP常用到的技术,在系统的各个可能产生问题的函数埋上桩子,等问题发生,将问题暴露到StrictMode。同种思想可以运用到计算函数执行时间,超过某个数值即进行暴露

常用的代码插桩方式有两种,分别是类似StrictMode这种的静态插桩,另一种这是在编译时,通过ASM等框架,自动插桩的。

5.1 自动插桩

ASM动态插桩,可以避免开发者自己每个函数都进行插桩,还是举计算函数时间的例子,我们完全可以写好两个静态函数,之后再函数开始前与结束来插入。

fun sum(){CalculateTime.start()for loop(0 .. 100)CalculateTime.start()  }

类似此种,对于一些不需要统计的函数,则可以卸载配置文件的黑名单里面,进行过滤,当然实际使用到时,细节会更多,但是大体如此

5.2 动态插桩

动态插桩,可以理解为动态代理,也可以理解为Hook技术,我们以分析内存的LeakCanary为例,分析Service泄漏时,其实就运用到了动态代理,当发生泄漏,桩子就起作用了,我们稍微来看一下源代码

//获取一个ActivityThread对象
private val activityThreadClass by lazy { Class.forName("android.app.ActivityThread") }//执行ActivityThread的currentActivityThread方法
private val activityThreadInstance by lazy {activityThreadClass.getDeclaredMethod("currentActivityThread").invoke(null)!!
}//函数变量,存储卸载uninstallActivityThreadHandlerCallback函数
private var uninstallActivityThreadHandlerCallback: (() -> Unit)? = null
//函数变量,存储uninstallActivityManager函数
private var uninstallActivityManager: (() -> Unit)? = null
//替换callbackswapActivityThreadHandlerCallback { mCallback -> //调用处返回的mCallback//赋值uninstallActivityThreadHandlerCallback这个函数变量,用来做uninstalluninstallActivityThreadHandlerCallback = {swapActivityThreadHandlerCallback {mCallback}}//将Handler.Callback作为swap的返回值,传递给swapActivityThreadHandlerCallback       //kotlin的隐式返回,最后一个语句Handler.Callback { msg ->if (msg.what == STOP_SERVICE) {val key = msg.obj as IBinderactivityThreadServices[key]?.let {onServicePreDestroy(key, it)}}mCallback?.handleMessage(msg) ?: false}}

其实这里面的代码主要是,将自己的CallBack替换ActivityThread里面的CallBack从而达到监听ActivityThread里面监听STOP_SERVICEd的消息,之后在进行内存泄漏的一个分析

好了,StrictMode整个系列就分析完了。希望您能有所收获

StrictMode带来的思考-StrictMode原理(5)相关推荐

  1. 30岁成不了技术专家就应该转做管理?希望通过本文给大家带来一点思考

    很多程序员都有一点技术情节,喜欢"专心搞技术",不喜欢管理,尤其管人.甚至为自己是"专注于技术"而自感清高,有点看不起那些"外行管理内行"或 ...

  2. 微信8.0全心全意考虑用户需求为企业开展网络营销带来全新思考

    当前微信已然拥有12亿用户,远超其他同类型软件,而微信也并非一成不变,在2021年初正式推出了8.0版本,从新版本中可以更多地发现当下微信再一次将用户需求作为重点,有针对性的对不同需求群体做出了改变, ...

  3. 量子计算机的系统论思考,量子计算机发展带来的思考..doc

    量子计算机发展带来的思考 --科学技术的创新与发展 一.引言 自从20世纪30年代以来,图灵机.计算这些重要的概念在科学的天空中就一直闪烁着无限的光彩.尤其是近年来量子计算机.生物计算机.DNA计算等 ...

  4. 12306 抢票,极限并发带来的思考

    点击上方"蓝色字体",选择"置顶或者星标" 你关注的就是我关心的! 来源:https://juejin.im/post/5d84e21f6fb9a06ac824 ...

  5. 中国铁路 12306 网站的高并发架构带来的思考?研究分析后,果然超牛逼…

    >>号外:关注"Java精选"公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料.开源项目. 12306 抢票,极限并发带来的思考 虽然现在大多数情 ...

  6. Object._proto_指向谁?带来的思考

    //由问题带来的思考

  7. 运营笔记:站长之家改版之后,给站长带来哪些思考?

    站长之家,一夜之前换新衣了. 站长之家改版之后,给站长带来哪些思考? 只能用几个词来形容,牛逼.大气.优秀. 但跟我们站长有毛线关系呢?或许还真的有关系,因为站长之家终于意识到,内容是多么重要了. 从 ...

  8. POS共识机制竟然漏洞这么多 | 分析POS共识机制的原理带来的思考

    序言 上文深入比特币.以太坊源码带你解读POW共识机制我们学习探讨了POW共识机制,看完得童鞋们应该就知道POW是有几大缺点的:出块慢,共识时间长.开销大等等,那么有没有其它的共识机制能够解决这些问题 ...

  9. StrictMode分析Activity泄漏-StrictMode原理(3)

    3. Activity的泄漏 StrictMode对于Activity的泄漏检测也是有的. 泄漏的日志: D/StrictMode: StrictMode policy violation: andr ...

最新文章

  1. for、while循环及其变体
  2. windows 下怎样利用NET-SNMP 发送和接收trap
  3. struts2类型转换+校验
  4. 差分隐私 python_[宜配屋]听图阁
  5. java8+tomcate8仅支持TLSv1.2
  6. Martin Odersky Scala编程公开课 第一周作业
  7. UVA - 10820欧拉函数的应用
  8. ES中使用nested类型的内嵌对象
  9. openproject_OpenProject入门
  10. 矩形碰撞公式,以前还做j2me时就用到的公式,为了方便查找,这里记一下
  11. Java多线程并发面试
  12. The JSP specification requires that an attribute name is preceded by whitesp
  13. Jzoj5605 Zkb
  14. 【Java实战小项目】考试系统
  15. unity3d 地面印花_Unity3D 中的贴花效果 – 苍白的茧
  16. 安卓adb是什么?ADB命令大全及使用教程
  17. 上海交通大学致远游泳健身馆5月团体操课表已更新,请各位会员惠存!
  18. IDEA SpringBoot 自定义Banner
  19. 【最短路】CF545E Paths and Trees
  20. 如何提高小学生写作文的能力

热门文章

  1. html5重置按钮,25-普通按钮-提交按钮-重置按钮
  2. iOS-OC-语音播放之切换听筒和扬声器的方法解决方案(红外感应)
  3. Java实现无重复抽签,人数可以自定义
  4. /bin/bash 和 /bin/sh的区别
  5. 其中哪一种手机在游戏中性价比更高?
  6. 【前端】在线咨询:移动端调用QQ代码
  7. 关于竞品分析,这应该是最实用的分析流程
  8. Python中bisect的使用方法
  9. 【圣诞树】用C语言给女友写一个圣诞树
  10. vim配置molokai主题及踩过的坑(bash:colorscheme: 未找到命令)