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注释变省去了很多事

自此编译时生成代码片段结束

猜你喜欢

转载自blog.csdn.net/zhujie_/article/details/81115778