天天看点

Android自定义apt

在看dagger的源码的时候,很好奇这些源码到底是如何生成的(传送门)

搜了下资料,弄清楚了。网上相关资料不多,自己做下记录,防止忘了。

流程图如下:

Android自定义apt

1. 创建注解lib:

  1. 创建Java library(不是Android Library)
  2. 创建Inject注解类
    Android自定义apt
@Target(ElementType.TYPE)
@Retention(RUNTIME)
@Documented
public @interface Inject {
}
           

2. 创建apt lib

  1. 引入三房库
  2. 引入注解lib
  3. 生成代码逻辑
    Android自定义apt
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.google.auto.service:auto-service:1.0-rc2'
    implementation 'com.squareup:javapoet:1.7.0'
    implementation project(':my_an_lib')
}
           
@AutoService(Processor.class)
public class Inject_Apt extends AbstractProcessor {
    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return Collections.singleton(Inject.class.getCanonicalName());
    }

    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        MethodSpec get = MethodSpec.methodBuilder("get")
                .addModifiers(Modifier.PUBLIC,Modifier.STATIC)
                .returns(String.class)
                .addStatement("return"+"\"Hello World!\"")
                .build();
        TypeSpec helloWorld = TypeSpec.classBuilder("YsTest")
                .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
                .addMethod(get)
                .build();
        JavaFile javaFile = JavaFile.builder("yang.shuai", helloWorld)
                .build();
        try {
            javaFile.writeTo(processingEnv.getFiler());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
}

           

3. App lib引入注解lib和apt lib

implementation project(':my_an_lib')
annotationProcessor project(':my_apt_lib')
           

4. MainActivity添加注解

@Inject
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
           

5. build->rebuild project 生成文件YsTest

Android自定义apt
public final class YsTest {
  public static String get() {
    return"Hello World!";
  }
}
           

6. MainActivity 中添加调用

@Inject
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.w("测试", YsTest.get());
    }
}
           

运行结果:

继续阅读