自定义AnnotationProcessor (一)

扫盲

1
2
注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用

注解类型:

  • 运行时(Runtime)通过反射机制运行处理的注解
  • 编译时(Compile time)处理的注解

注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具

因为Android 运行时效率问题,所以大部分注解是在编译期间通过AndroidAnnotationProcessor处理,常见的 ButterKnife Dagger2 等等


本系列将使用Kotlin 做为开发语言!
Android Studio 3.0-C4版本
gradle 4.0版本
基础环境搭建
  1. 默认module app 咱们先不管

  2. 配置项目的gradle文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    buildscript {
    ext.kotlin_version = '1.1.2-4'
    repositories {
    google()
    jcenter()
    }
    dependencies {
    classpath 'com.android.tools.build:gradle:3.0.0-alpha4'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
    }
    allprojects {
    repositories {
    google()
    jcenter()
    }
    }
    task clean(type: Delete) {
    delete rootProject.buildDir
    }
    • 因为 kotlinpoet 这里使用的4.0 SNAP版本,所以添加下面这一行

      1
      maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }

  3. 新建java library 项目 compiler

  4. 编辑 compiler 的gradle 配置,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    apply plugin: 'java-library'
    apply plugin: 'kotlin'
    kapt {
    generateStubs = true
    }
    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    kapt 'com.google.auto.service:auto-service:1.0-rc3'
    }
    sourceCompatibility = "1.8"
    targetCompatibility = "1.8"
    • kapt 因为使用google auto-service来生成
      META-INF/services/javax.annotation.processing.Processor
      所以这里必须要添加generateStubs = true

    • 这行记得要添加,添加编译时期的处理器,否则会不能生成文件
      kapt 'com.google.auto.service:auto-service:1.0-rc3'

  5. 环境搭建完后,开始撸代码。

    1. 新建一个Processor,继承AbstractProcessor

      1
      2
      3
      4
      5
      6
      class RheaProcessor: AbstractProcessor() {
      override fun process(annotations: MutableSet<out TypeElement>?, roundEnv: RoundEnvironment?): Boolean {
      println("this is custom processor")
      return true
      }
      }
    2. 这里我们使用google 的auto-service 生成
      META-INF/services/javax.annotation.processing.Processor

      1
      2
      3
      4
      5
      @AutoService(Processor::class)
      @SupportedSourceVersion(SourceVersion.RELEASE_7)//标识该处理器支持的源码版
      class RheaProcessor: AbstractProcessor(){
      //some code
      }
    3. 编译一下

  6. 回到app module在gradle depdendencis 中添加

    1
    2
    3
    4
    dependencies {
    //some dependencies ...
    kapt project(':compiler')
    }
  7. 接着编译一下app 会发现在 Gradle Console 窗口中已经有RheaProcessor中打印的日志信息
    this is custom processor