implementation 'com.google.auto.service:auto-service:1.0-rc4'
完整文件如下 : (module 的 sourceCompatibility 默认为 1.7 我发现会报错 。)
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.auto.service:auto-service:1.0-rc4'
}
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
同时你主 module 的 build.gradle 需要指定 java 版本为 1.8
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
2.创建你的 Processor 类 ,在类上方添加声明 : @AutoService(Processor.class) ,完整文件如下 :
@AutoService(Processor.class)
public class MyAnnotationProcessor extends AbstractProcessor {
private Filer mFiler;
private Messager mMessager;
private Elements mElementUtils;
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
mFiler = processingEnvironment.getFiler();
mMessager = processingEnvironment.getMessager();
mElementUtils = processingEnvironment.getElementUtils();
}
@Override
public Set getSupportedAnnotationTypes() {
Set annotations = new LinkedHashSet<>();
return annotations;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public boolean process(Set extends TypeElement> set, RoundEnvironment roundEnvironment) {
note("hello world ");
return false;
}
private void note(String format, Object... args) {
mMessager.printMessage(Diagnostic.Kind.NOTE, String.format(format, args));
}
}
点击 app 框, 然后点击出现的 Edit Configurations,如下图:
点击上方绿色的 “+” ->点击 Remote, 如下图:
之后在你的 gradle.properties 中 添加以下配置 :
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
首先选择 APT然后点击 Debug 按钮
如果报错 :
Unable to open debugger port (localhost:5005): java.net.ConnectException "Connection refused: connect"
第一种原因 : 端口占用导致。windows 执行下列命令,在对应任务管理器中,杀死对应的进程。
netstat -ano|findstr "5005"
第二种原因 : 找不到端口占用的进程,死活也启动不了。 最后 : File- > Invalidata Caches/ Restart 解决了问题 !
第三种 : 今天突然发现前两种方法都没用,后来发现先运行 App ,让 App 跑起来,然后再 Debug APT 解决了。
在你的 Processor 中打好断点,直接运行 App 即可。
编译过程中会走 Debug , 如下图 :
你可能会发现第二次运行 App ,不走断点。你需要更改下你的 Processor , 例如 ”hello world ”中加个空格。
如果报错 :
* What went wrong:
Execution failed for task ':app:javaPreCompileDebug'.
> Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.
- processor.jar (project :processor)
Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior. Note that this option is deprecated and will be removed in the future.
See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
在你主 module 的 build.gradle 中 的 defaultConfig 添加 :
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath true
}
}
...
}
如果报错 :
Suppressed: com.android.tools.r8.ApiLevelException: Default interface methods are only supported starting with Android N (--min-api 24): java.util.Collection com.google.common.collect.ListMultimap.get(java.lang.Object)
at com.android.tools.r8.dex.FileWriter.checkInterfaceMethod(FileWriter.java:247)
at com.android.tools.r8.dex.FileWriter.checkInterfaceMethods(FileWriter.java:213)
at com.android.tools.r8.dex.FileWriter.generate(FileWriter.java:140)
at com.android.tools.r8.dex.ApplicationWriter.writeDexFile(ApplicationWriter.java:356)
at com.android.tools.r8.dex.ApplicationWriter.lambda$write$2(ApplicationWriter.java:188)
在你的Processor 的 build.gradle 中指定 :
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
网络上这方面的资料比较缺乏。我试了好几个版本都不行。
我建议大家不要在现有的项目中直接使用 Annotation Processor 。
新建一个 Android 工程 ,编译比较快,也好排查问题。