Android Studio 调试 AnnotationProcessor - 傻瓜版

新建 Module

  1. 首先创建一个 Android Procject 这个就不写步骤了。
  2. 新建 Java Module,选择 Java Library 。 (因为在主 Module 中无法找到 AbstractProcessor 类)
    Android Studio 调试 AnnotationProcessor - 傻瓜版_第1张图片
    在创建 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 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, 如下图:

Android Studio 调试 AnnotationProcessor - 傻瓜版_第2张图片

命名配置,如 Name APT,然后点击确定, 如下图 :
Android Studio 调试 AnnotationProcessor - 傻瓜版_第3张图片

之后在你的 gradle.properties 中 添加以下配置 :

org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

首先选择 APT然后点击 Debug 按钮

这里写图片描述
启动成功后会如下图 :
Android Studio 调试 AnnotationProcessor - 傻瓜版_第4张图片

如果报错 :

Unable to open debugger port (localhost:5005): java.net.ConnectException "Connection refused: connect"

第一种原因 : 端口占用导致。windows 执行下列命令,在对应任务管理器中,杀死对应的进程。

netstat -ano|findstr "5005"

第二种原因 : 找不到端口占用的进程,死活也启动不了。 最后 : File- > Invalidata Caches/ Restart 解决了问题 !
Android Studio 调试 AnnotationProcessor - 傻瓜版_第5张图片

第三种 : 今天突然发现前两种方法都没用,后来发现先运行 App ,让 App 跑起来,然后再 Debug APT 解决了。


开始 Debug

在你的 Processor 中打好断点,直接运行 App 即可。

Android Studio 调试 AnnotationProcessor - 傻瓜版_第6张图片

编译过程中会走 Debug , 如下图 :

Android Studio 调试 AnnotationProcessor - 傻瓜版_第7张图片

你可能会发现第二次运行 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 工程 ,编译比较快,也好排查问题。

你可能感兴趣的:(Android)