1. 程式人生 > >如何除錯編譯時註解處理器AnnotationProcessor

如何除錯編譯時註解處理器AnnotationProcessor

本來的話是想跟大家分享如何製作自己的編譯時註解處理器的,後來搜尋了一下發現網上有不少這方面的文章,寫得都很全面很優秀,所以就不獻醜了。如果大家還不知道怎麼寫自己的編譯時註解處理器,可以看下這位大神寫的文章學習下: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的遠端除錯功能。所以,基礎還是最重要的。