Android自定义apt
在看dagger的源码的时候,很好奇这些源码到底是如何生成的(传送门)
搜了下资料,弄清楚了。网上相关资料不多,自己做下记录,防止忘了。
流程图如下:
1. 创建注解lib:
- 创建Java library(不是Android Library)
- 创建Inject注解类
![]()
@Target(ElementType.TYPE)
@Retention(RUNTIME)
@Documented
public @interface Inject {
}
2. 创建apt lib
- 引入三房库
- 引入注解lib
- 生成代码逻辑
![]()
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
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());
}
}
运行结果:
2019-04-17 16:09:08.489 20588-20588/yang.shuai.mydagger W/测试: Hello World!