Android(安卓)Studio 调试 AnnotationProcessor - 傻瓜版
新建 Module
- 首先创建一个 Android Procject 这个就不写步骤了。
- 新建 Java Module,选择 Java Library 。 (因为在主 Module 中无法找到 AbstractProcessor 类)
在创建 Moduel 的 build.gradle 添加依赖, 然后记得 sync now
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, 如下图:
命名配置,如 Name APT,然后点击确定, 如下图 :
之后在你的 gradle.properties 中 添加以下配置 :
org.gradle.daemon=trueorg.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 解决了。
开始 Debug
在你的 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 工程 ,编译比较快,也好排查问题。
更多相关文章
- Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
- android 软体键盘 实现 -- 断点记录
- Android(安卓)Studio设置HTTP代理地址
- 编译android vlc
- fix android build error : undefined reference to __gxx_perso
- Gradle sync failed: Connection refused
- Android:Deprecated Thread methods are not supported
- Android(安卓)开发遇到的问题
- dlopen failed: library "/system/lib/libxxx.so" needed or dlo