1. 你了解过哪些用到gradle Transform API 相关项目。
2. 你了解过哪些用到Annotation Processor 相关项目。
3. 两者使用各有什么使用流程与场景?能否相互替换与补充?
更多问答 >>
-
每日一问 自定义 ViewGroup 的时候,关于 LayoutParams 有哪些注意事项?
2019-06-15 21:09 -
每日一问 详细的描述下自定义 View 测量时 MesureSpec.UNSPECIFIED
2019-06-20 00:26 -
每日一问 View中的getContext一定返回的是Activity对象吗?
2019-06-23 22:18 -
每日一问 有没有使用过 DataBinding ,有什么优点、缺点,遇到过哪些坑?
2019-06-26 00:23 -
每日一问 | 为什么属性动画移动一个控件后,目标位置仍然能响应用户事件?
2019-06-27 23:50 -
2019-05-29 12:23
-
每日一问 View的onAttachedToWindow ,onDetachedFromWindow 调用时机,使用场景是什么?
2019-05-26 19:19 -
每日一问 你有什么好的学习习惯 或者 不错的 app 推荐给大家?
2019-05-24 11:09 -
每日一问 思考一下如果捕获一个 Activity页面上所有的点击行为?
2019-05-23 00:14 -
2019-05-21 23:59

Transform实现ARouter:https://juejin.im/post/5cf35bde6fb9a07ed440e99a
APT实现ARouter:https://juejin.im/post/5cecce216fb9a07f04202904赞~
感谢分享
首先
两个最常用的项目
Annotation Processor :butterknife
Transform API:Arouter,CC-register(我是看着这个项目学的)
其实Transform 只是一个gradle 的api而已,允许你在编译过程中做一定的处理,配合 ASM/Javasist 才能够实现 Arouter/CC-register 那样的效果
使用流程就不说了,一搜一大把
场景 :
Transform : 操作字节码的操作,比如 路由,埋点,读取/编辑 打包好的 library 中的class文件,这点是 Annotation Processor 做不到的
Annotation Processor : 用的更多的事编译期 生成辅助类 吧,源码级操作,无法对现有 打包好的 library(jar/aar)做处理
替换肯定是不能了,看场景吧,如果 字节码级别的,肯定没法替换
其实 Annotation Processor 在某些场景下 可以用 idea插件来替换,如果刷新频率不高的话,也可以用 gradle 插件,比如 =.= 原本想说 greendao 的,但是突然想起来 还没有看过 他的插件的源码=.=有可能是 Annotation 来完成的=.=
Transform API 如果只是监听特定方法,比如:埋点,方法耗时计算,可以用 AOP(Aspectj) 来替换
突然感觉好难啊,,源码就够让人头疼了的,还要知道这些,又得买六个核桃了=.=
最关键的是,资料贼少,高级的更少,搞不好还需要科学上网.....够够的....
1.在需要对一些java代码加入同样的代码时,可以使用Transform
2.依据实体类生成数据库
3.Transform 的作用时间在 java编译生成 class文件之后,class打包生成apk之前,这段时间之内 遍历修改 class文件。Annotation Processor则是在java代码编译时,根据元注解获取的java代码信息,生成相应的java代码,来辅助 ,比如Butterknike 帮你完成findViewById,Dagger2则是帮你完成实体类的实例化和复制
gradle transform常用到asm,asm包含treeapi和visiterapi
treeapi可以直接读取整个class,但是会占用很多内存,通常少用
visiterapi通过访问者模式访问一个class,通过classreader去读一个class,之后classreader调用accept方法将对应的信息传递到classVisitor,这个classVistitor用到了装饰者模式,里面包含一个也是classVisitor的cv,最终会有一个cv为classWriter将修改后的字节码写入到文件中
注解处理器是java直接支持的,主要面向源代码,常用来生成一些辅助类和信息收拢类,lifecycle,Arouter,ButterLife等等都用到了
transform是android stdio编译的一个阶段, 面向class文件,常见于方法增强,对class文件的更改,自动埋点等都有用到
1. 你了解过哪些用到gradle Transform API 相关项目。
我的组件化框架,有用到Transform 根据参与打包的组件插入初始化代码的操作.
2. 你了解过哪些用到Annotation Processor 相关项目。
黄油刀,dagger2都用到,生成注入代码.
3. 两者使用各有什么使用流程与场景?能否相互替换与补充?
都是在打包的时候修改代码,可以互补的. Transform 可以修改所有的class,包括引入的第三方,Annotation Processor的话主要是自己写的代码.