登录

去注册

登录

注册

去登录

注册

每日一问 gradle Transform API 和 Annotation Processor各有什么使用场景?能否相互替换与补充。

xiaoyang   2019-06-13   收藏

1. 你了解过哪些用到gradle Transform API 相关项目。

2. 你了解过哪些用到Annotation Processor 相关项目。

3. 两者使用各有什么使用流程与场景?能否相互替换与补充?

3
回复
陈小缘啦啦啦 : @rogeryxx 

感谢分享

2019-06-13 回复
xiaoyang : @rogeryxx 

赞~

2019-06-13 回复
1

1.在需要对一些java代码加入同样的代码时,可以使用Transform


2.依据实体类生成数据库


3.Transform 的作用时间在  java编译生成 class文件之后,class打包生成apk之前,这段时间之内 遍历修改 class文件。Annotation Processor则是在java代码编译时,根据元注解获取的java代码信息,生成相应的java代码,来辅助 ,比如Butterknike 帮你完成findViewById,Dagger2则是帮你完成实体类的实例化和复制

回复
0

首先

两个最常用的项目


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)  来替换



突然感觉好难啊,,源码就够让人头疼了的,还要知道这些,又得买六个核桃了=.=


回复
yizems : @yizems 

最关键的是,资料贼少,高级的更少,搞不好还需要科学上网.....够够的....

2019-06-21 回复
0

gradle transform常用到asm,asm包含treeapi和visiterapi

treeapi可以直接读取整个class,但是会占用很多内存,通常少用

visiterapi通过访问者模式访问一个class,通过classreader去读一个class,之后classreader调用accept方法将对应的信息传递到classVisitor,这个classVistitor用到了装饰者模式,里面包含一个也是classVisitor的cv,最终会有一个cv为classWriter将修改后的字节码写入到文件中

回复
0

注解处理器是java直接支持的,主要面向源代码,常用来生成一些辅助类和信息收拢类,lifecycle,Arouter,ButterLife等等都用到了

transform是android stdio编译的一个阶段, 面向class文件,常见于方法增强,对class文件的更改,自动埋点等都有用到

回复
0

1. 你了解过哪些用到gradle Transform API 相关项目。

我的组件化框架,有用到Transform 根据参与打包的组件插入初始化代码的操作.

2. 你了解过哪些用到Annotation Processor 相关项目。

黄油刀,dagger2都用到,生成注入代码.    

3. 两者使用各有什么使用流程与场景?能否相互替换与补充?

都是在打包的时候修改代码,可以互补的. Transform 可以修改所有的class,包括引入的第三方,Annotation Processor的话主要是自己写的代码.

回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定