StrictMode带来的思考-StrictMode原理(5)
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)相关推荐
- 30岁成不了技术专家就应该转做管理?希望通过本文给大家带来一点思考
很多程序员都有一点技术情节,喜欢"专心搞技术",不喜欢管理,尤其管人.甚至为自己是"专注于技术"而自感清高,有点看不起那些"外行管理内行"或 ...
- 微信8.0全心全意考虑用户需求为企业开展网络营销带来全新思考
当前微信已然拥有12亿用户,远超其他同类型软件,而微信也并非一成不变,在2021年初正式推出了8.0版本,从新版本中可以更多地发现当下微信再一次将用户需求作为重点,有针对性的对不同需求群体做出了改变, ...
- 量子计算机的系统论思考,量子计算机发展带来的思考..doc
量子计算机发展带来的思考 --科学技术的创新与发展 一.引言 自从20世纪30年代以来,图灵机.计算这些重要的概念在科学的天空中就一直闪烁着无限的光彩.尤其是近年来量子计算机.生物计算机.DNA计算等 ...
- 12306 抢票,极限并发带来的思考
点击上方"蓝色字体",选择"置顶或者星标" 你关注的就是我关心的! 来源:https://juejin.im/post/5d84e21f6fb9a06ac824 ...
- 中国铁路 12306 网站的高并发架构带来的思考?研究分析后,果然超牛逼…
>>号外:关注"Java精选"公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料.开源项目. 12306 抢票,极限并发带来的思考 虽然现在大多数情 ...
- Object._proto_指向谁?带来的思考
//由问题带来的思考
- 运营笔记:站长之家改版之后,给站长带来哪些思考?
站长之家,一夜之前换新衣了. 站长之家改版之后,给站长带来哪些思考? 只能用几个词来形容,牛逼.大气.优秀. 但跟我们站长有毛线关系呢?或许还真的有关系,因为站长之家终于意识到,内容是多么重要了. 从 ...
- POS共识机制竟然漏洞这么多 | 分析POS共识机制的原理带来的思考
序言 上文深入比特币.以太坊源码带你解读POW共识机制我们学习探讨了POW共识机制,看完得童鞋们应该就知道POW是有几大缺点的:出块慢,共识时间长.开销大等等,那么有没有其它的共识机制能够解决这些问题 ...
- StrictMode分析Activity泄漏-StrictMode原理(3)
3. Activity的泄漏 StrictMode对于Activity的泄漏检测也是有的. 泄漏的日志: D/StrictMode: StrictMode policy violation: andr ...
最新文章
- for、while循环及其变体
- windows 下怎样利用NET-SNMP 发送和接收trap
- struts2类型转换+校验
- 差分隐私 python_[宜配屋]听图阁
- java8+tomcate8仅支持TLSv1.2
- Martin Odersky Scala编程公开课 第一周作业
- UVA - 10820欧拉函数的应用
- ES中使用nested类型的内嵌对象
- openproject_OpenProject入门
- 矩形碰撞公式,以前还做j2me时就用到的公式,为了方便查找,这里记一下
- Java多线程并发面试
- The JSP specification requires that an attribute name is preceded by whitesp
- Jzoj5605 Zkb
- 【Java实战小项目】考试系统
- unity3d 地面印花_Unity3D 中的贴花效果 – 苍白的茧
- 安卓adb是什么?ADB命令大全及使用教程
- 上海交通大学致远游泳健身馆5月团体操课表已更新,请各位会员惠存!
- IDEA SpringBoot 自定义Banner
- 【最短路】CF545E Paths and Trees
- 如何提高小学生写作文的能力