如何调试编译时注解处理器AnnotationProcessor

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tomatomas/article/details/53998585

本来的话是想跟大家分享如何制作自己的编译时注解处理器的,后来搜索了一下发现网上有不少这方面的文章,写得都很全面很优秀,所以就不献丑了。如果大家还不知道怎么写自己的编译时注解处理器,可以看下这位大神写的文章学习下:http://blog.csdn.net/lmj623565791/article/details/43452969

我这次跟大家分享的是如何在AndroidStudio开发环境下调试编译时注解处理器AnnotationProcessor,毕竟有开发就有调试。但是在调试AnnotationProcessor这方面,网上搜到的资料都不太完整。所以我在这里将我实现调试的过程分享给大家,希望大家少踩坑。人生苦短,高效率才是王道。

下面进入正题。

1.开发环境

  • AndroidStudio:2.2.2
  • Gradle:2.14.1
  • JDK:1.8.0_77

2.操作步骤

新建AndroidStudio工程,导入AnnotationProcessor库到libs文件夹

执行后android工程目录如下图所示:
这里写图片描述

配置远程调试功能

打开菜单栏的Run菜单下的Edit Configuration项,如下图:
这里写图片描述

然后选择点击左上角的+按钮并选择Remote项,如下图:
这里写图片描述

然后为这个配置设置一个命名、端口(一般默认为5005),其他的都不需要修改。然后点击Apply,如下图所示:
这里写图片描述

然后复制上图中位置4所选中的文字。这段文字是启动可远程调试的JVM的参数,我们后面会用到。关于这些参数的说明可以参考这篇博文:http://chainhou.iteye.com/blog/1837059

然后点击OK退出窗口。

配置可远程调试的Gradle程序

首先打开IDE右边的Gradle小窗口,并点击小窗口左上角的刷新按钮,然后打开app->other目录,找到compileDebugJavaWithJavac,如下图所示:
这里写图片描述

由于编译时注解是在compileDebugJavaWithJavac脚本中处理的,所以我们要为其添加JVM参数将其设置为可远程调试。接下来在compileDebugJavaWithJavac项上点击右键,选中Create Configuration,打开下图所示窗口:
这里写图片描述

将刚才复制的参数粘贴到VM options对应的编辑框中,并将suspend=n参数改为suspend=y。这么做是为了保证compileDebugJavaWithJavac运行前会一直等待调试器的连接。

添加断点

接下来就是在我们要调试的代码中添加断点了。如下图所示。打开AnnotationProcessor的MyProcessor文件却发现一片飘红,如下图所示,这样是无法调试的。
这里写图片描述

百度了一下,说是AS不会自动添加javax依赖导致的,所以在app的gradle文件中手动添加依赖,如下图所示。(比较粗暴,但是只是用来调试,过得去就算了)
这里写图片描述

添加了依赖包后回到MyProcessor文件,就不会报错了。然后在init方法中添加断点,如下图所示:
这里写图片描述

启动远程JVM运行compileDebugJavaWithJavac

接下来就是启动我们要调试的程序了。在主界面运行选项选中compileDebugJavaWithJavac,然后点击运行,如下图所示:

这里写图片描述

然后我们会看到compileDebugJavaWithJavac的执行,Run Build一直处于转圈圈的状态,表示远程JVM已启动并在等待调试器连接:
这里写图片描述

这时我们在windows命令行下执行netstat命令可以发现有一个JVM进程打开了5005端口。这个进程就是一个java进程,上面即将运行我们的Processor代码:
这里写图片描述

启动调试器

接下来就是启动调试器去attach到我们的远程可调试进程了。很简单。首先是点击运行菜单,选中我们刚才设置的Remote配置的名字,我这里是AnnotationProcessor,然后点击Debug按钮,如下图所示:
这里写图片描述

然后我们就会在Console中看到调试器已连接到远程进程,如下图所示:
这里写图片描述

再过几秒进程便会开始运行并且在断点处停下来,我们就能开始调试了。如下图所示:
这里写图片描述

3.总结

虽然是简简单单的几个步骤,但是却花了我不少时间去网上查找资料,最终总结出一套可行的方案。其实大家应该可以看得出来,这只不过是java的一个远程调试功能罢了。由于AS中Gradle脚本是运行在Remote进程上的,所以无法直接调试。我们做的这些步骤不过是配置了一下远程调试参数实现java的远程调试功能。所以,基础还是最重要的。

猜你喜欢

转载自blog.csdn.net/tomatomas/article/details/53998585