Android中使用AbstractProcessor在编译时生成代码
1.概述
在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置。按照处理时期,注解又分为两种类型,一种是运行时注解,另一种是编译时注解,运行时注解由于性能问题被一些人所诟病。编译时注解的核心依赖APT(Annotation Processing Tools)实现,原理是在某些代码元素上(如类型、函数、字段等)添加注解,在编译时编译器会检查AbstractProcessor的子类,并且调用该类型的process函数,然后将添加了注解的所有元素都传递到process函数中,使得开发人员可以在编译器进行相应的处理,例如,根据注解生成新的Java类,这也就是EventBus,Retrofit,Dragger等开源库的基本原理。
Java API已经提供了扫描源码并解析注解的框架,你可以继承AbstractProcessor类来提供实现自己的解析注解逻辑。下边我们将学习如何在Android Studio中通过编译时注解生成java文件。
2.创建名为processor的module
首先使用Android Studio创建一个Android的project。然后开始创建一个名为processor的java library。
点击file->new->new module如图
注意此处一点要是JavaLib因为AndroidLib已经抛弃了javax库,所以不要javaLib会找不到类库
下面就是Next...
3.兼容性配置
由于Android目前不是完全支持Java 8的语言特性,会导致编译出错。这里将项目的源和目标兼容性值保留为 Java 7。
打开1.app模块下的build.gradle 2.在android标签下添加 3.compile options
1.是引用到java1.7,2.防止一些link报的错
javaLib build 中添加
sourceCompatibility = "1.7" targetCompatibility = "1.7"
保证容错
4.创建Annotation
1.在processor模块下创建一个注解类
创建注解类没什么好说的
2.创建自定义Processor
Processor继承自AbstractProcessor类,
@SupportedAnnotationTypes中填写待处理的注解全称,
@SupportedSourceVersion表示处理的JAVA版本。
在编译时生成的代码在process中
生成代码片段
编译完成后会生成Hellow类库
复杂类用javapoet去生成 com.squareup:javapoet:1.7.0
6.创建resource(映射关系)
创建好注解处理器后,我们需要告诉编译器在编译的时候使用哪个注解处理器,这里就需要创建javax.annotation.processing.Processor文件
在processor模块下,main目录中创建一个resources文件夹,然后下边在创建META-INF/services,最后里边一个javax.annotation.processing.Processor文件,文件指向自定义processor 如下:
7.添加android-apt
在project下的build.gradle中添加apt插件
8.设置build的依赖
这一节主要讲的是把processor模块中的注解,注解处理器编译生成一个jar,然后把这个jar包复制到app模块下。然后让app依赖引用这个jar。
然后我们编写一个gradle task,把生成的jar文件复制到app/libs目录中。
最后我们创建task的依赖顺序,app:preBuild依赖我们写的processorTask, processorTask依赖 :processor:build:
意思就是processor build完成后把jar复制到app,然后在执行app:preBuild。
9.验证
我们在Activity的类与onCreate方法上使用@CustomAnnotation
成功生成代码片段利于代码解耦组件化的实现
优化一下以上代码
步骤678都可以不做
processor的javaLib里添加依赖
自定义processor里的使用google注释变省去了很多事
自此编译时生成代码片段结束