文章目录
- 简介
- APT注解开发工具
-
- 使用场景
- 开发流程
-
- 前情提要
-
- 创建aar
- 创建jar
- 声明注解
- 注解编译处理
-
- gradle
- Processor
-
- process方法
- 完整举例
- 编译结果
- 总结
简介
相信各位Android开发对注解这个东西并不陌生,毕竟在用Arouter的时候,注解@Route是基本要使用的注解。但这只是对注解的使用。
那么在日常开发中,如何去定义注解,并通过注解在编译期间去生成一些代码,这便是本文要介绍的APT技术。
APT注解开发工具
使用场景
对于一些格式相对固定的代码,可能并不希望开发者去花费时间去编写这些固定的代码。针对这种场景,就可以考虑使用注解开发。通过声明注解,给定相对应的参数,并在编译期生成这些固定的代码。
举个简单的例子,让我们来简化一下Arouter的流程:
场景描述:一个模块内有多个类需要路由,路由表维护了名称和类的全类名用于反射(简单来说就是有个map,key是路由名称,value时全类名),那么就可以通过名称获取到对应的类。
开发流程
注解开发通常涉及两个部分(最终产物是俩jar包):
- 注解声明部分, annotation
- 注解编译处理部分,compile
前情提要
这点很重要,在这吃过亏,耽误过一段时间
library的类型有aar和jar两种
aar和安卓相关,jar和java(kotlin)相关
aar可以引用jar,但jar不能引用aar
创建aar
创建jar
声明注解
注解的声明十分简单,没有什么坑,本文介绍场景都是对类的注解(其他的没研究,偷个懒)。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface MethodBridge {
String subMethod();
}
MethodBridge这就是一个注解的名称,String subMethod()定义了注解内部包含的属性,这在编译期会被用到。
OK注解声明部分就这么些玩意。
注解编译处理
这是注解开发的核心部分,所有注解处理的相关操作都是在这里执行的
gradle
首先,这玩意是需要在编译期生成代码的,所以kapt插件是得有的。我现在用的是ktx版本的gradle,语法如下:
plugins {
kotlin("kapt")
}
依赖呢,直接抄作业就行:
dependencies {
implementation(fileTree("libs"){
include("*.jar,*.aar")
})
implementation("com.google.auto.service:auto-service:1.0-rc6")
kapt("com.google.auto.service:auto-service:1.0-rc6")
}
注意一下这个dependencies里引一下上一节定义的annotation包,因为解析的就是这里的注解。
Processor
可以将这部分理解为注解处理器
大体结构为:
@AutoService(Processor.class)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MethodBridgeCompile extends AbstractProcessor {
private String moduleName = "CommonBridgeModule";
Filer filer;
Messager messager;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
messager = processingEnv.getMessager(); // 打印对象
filer = processingEnv.getFiler(); // 文件操作对象
messager.printMessage(Diagnostic.Kind.NOTE, "moduleName:::" + processingEnv.getOptions().get("BRIDGE_MODULE_NAME"));
if