新建 Module

  1. 首先创建一个 Android Procject 这个就不写步骤了。
  2. 新建 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 工程 ,编译比较快,也好排查问题。

更多相关文章

  1. Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
  2. android 软体键盘 实现 -- 断点记录
  3. Android(安卓)Studio设置HTTP代理地址
  4. 编译android vlc
  5. fix android build error : undefined reference to __gxx_perso
  6. Gradle sync failed: Connection refused
  7. Android:Deprecated Thread methods are not supported
  8. Android(安卓)开发遇到的问题
  9. dlopen failed: library "/system/lib/libxxx.so" needed or dlo

随机推荐

  1. Android系统自带样式Theme总结
  2. android获取手机唯一识别号
  3. Android 扫描SDCard上的音乐文件以及监听
  4. 优雅的处理Android数据库升级的问题
  5. android 添加桌面窗口小部件(托至桌面需要
  6. Android(安卓)Rxjava+Retrofit网络请求框
  7. android二维码xzing使用
  8. android使用RelativeLayout实现两端对齐
  9. Android ril移植-6410开发板SIM300模块
  10. Android常用的第三方开源库和框架