annotationProcessor和android-apt的功能是一样的,它们是替代关系。annotationProcessor是APT工具中的一种,他是google开发的内置框架,不需要引入,可以直接在build.gradle文件中使用。android-apt是由一位开发者自己开发的apt框架,随着Android Gradle 插件 2.2 版本的发布,间接的进行了替代。
涉及注解相关知识:
@Retention的取值范围如下(代表注解的保留位置):
RetentionPolicy.SOURCE 表示修饰的注解只在源码中保留,编译后就被遗弃了,也就是class文件中就不存在了。
RetentionPolicy.CLASS 表示修饰的注解保留到编译后的class文件,运行时就被遗弃。比如在运行时通过反射去获取这个注解,会发现是不存在的。
RetentionPolicy.RUNTIME 表示注解一直保留到运行时。
@Target:的取值范围如下(代表注解的作用目标)
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
@Document:该注解可以被包含在javadoc中
@Inherited:子类可以继承父类中的该注解
三方库依赖方式:
implementation:该依赖方式所依赖的库不会传递,只会在当前module中生效。
api:该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下使用api依赖的库。
compile已过时,已被 implementation 和api 取代
当我们依赖一些第三方的库时,可能会遇到com.android.support冲突的问题,就是因为开发者使用的compile或api依赖的com.android.support包与我们本地所依赖的com.android.support包版本不一样。
一、定义注解
在工程中添加一个java library类型的module,取名annotation
Android Studio -> file -> new module -> java library
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface BindView {
@IdRes int value();
}
备注:注解@IdRes 引用系统库,如果是jiavaLibrary需要单独添加引用
dependencies {
implementation 'androidx.annotation:annotation:1.2.0'
}
二、定义注解处理器
新建一个module,取名为compiler,类型必须为java librar(因为有用到 javax.*下的类文件)
Android Studio -> file -> new module -> java library
新建一个类MyProcessor
,这类必须继承至 AbstractProcessor
@AutoService(Processor.class)
public class MyProcessor extends AbstractProcessor {
}
备注:注解处理器创建完毕后,需要创建注册目录,如果是手动创建,目录如下:
文件里面内容为自己处理器的全路径path
建