编译插桩就是在代码编译期间修改已有的代码或者生成新代码
为什么说是编译插桩呢?其实它是一个动作和一个修饰,编译: 代码在编译期间,插桩: 在编译时期将需要的动作或者是逻辑插入已经编译的class文件中。
任何不能促使自己提高生产力的技术都没有学习的意义,那怎么将这个技术使用到Android开发中呢?
首先,在Android中,编译的过程为.java -> .class -> .dex,既然能在.class 文件中插入我们想要的逻辑,是否可以在转换为.dex之前实现想要的功能呢?
一、来一个疑问?
统计每个Activity打开的次数,用于数据统计,要求是不能只统计自己写的Activity,第三方的Activity也需要统计,哦,怎么搞,按照我们惯有的思维,应该是在每个Activity中的onCreate\onDestory中添加上报的代码,那第三方的Activity不能修改,该怎么去做统计呢?
1.1 可以在启动的地方统计
针对上述的问题,在启动的地方是能统计的,但是,抛开关闭不好统计的影响之外,在第三方的Activity 中启动的Activity怎么统计?
1.2 使用插桩技术
这个单独做记录,
-
自定义Transform
二、 应用场景
对于Android开发者来讲,我们不再只需要记住编译插桩需要怎么做,和能怎么做就可以了,这项技术就可以在我们日常开发中添砖加瓦了
2.1 场景及步骤
场景:
- 日志埋点;
- 性能监控;
- 动态权限控制;
- 业务逻辑跳转时,校验是否已经登录;
- 其他
使用 - 首先理解自己的业务场景,是否需要此项技术,此项技术是否带来大工作量而带来少量的效益
- 创建自己定义的gradle文件,这项技术就是在groovy 实现的,需要gradle
- 自定义Transform,在transform方法中实现自己的逻辑
2.2 怎么插到Activity,也就是Android中
- ASM
ASM是生成和转换已编译的Java类工具,就是我们插桩需要使用的工具。
具体操作在Demo中体现