我們創(chuàng)建apt -process model,在編譯期自動(dòng) 生成代碼。在寫這一套自動(dòng)生成規(guī)則時(shí)谴古,離不開debug模式毁菱。
編譯期的debug模式和我們普通代碼調(diào)試是一樣的。我們創(chuàng)建的android apt工程是一個(gè)java 工程 ,它里面的代碼是純java代碼寫的, 沒有使用的android的API,這一點(diǎn)是需要明白的躲舌。和普通Debug模式唯一的區(qū)別在于進(jìn)入編譯期debug時(shí),不需要開啟javascript:void(null)模擬器性雄,只需要按ctrl+b 執(zhí)行編譯即可没卸。
設(shè)置debug模式有很多暗坑,本人多次測(cè)試后總結(jié)的F&A秒旋,希望可能幫助到大家
如何搭建apt的調(diào)試模式
1 .創(chuàng)建remote.
我將其取名為Processor. 將端口設(shè)置為5005.也就是遠(yuǎn)程調(diào)試端口.如下圖
2 .修改配置文件 開啟debug模式
修改gradle.properties文件中配置约计。
如果您使用的是離線模式,直接將緩存文件夾中g(shù)radle.properties文件修改即可
該 文件在windows中的位置迁筛,默認(rèn)是在C:\Users\用戶名.gradle\gradle.properties
在默認(rèn)情況下,可能沒有這個(gè)文件煤蚌,或是只有下面這兩項(xiàng)目?jī)?nèi)容:
備注:如果沒有這個(gè)文件,創(chuàng)建一個(gè)文本文件,并將后綴更改一下即可
org.gradle.daemon=true
org.gradle.parallel=trues
修改為
org.gradle.daemon=true
org.gradle.parallel=trues
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
-Dorg.gradle.debug=true
上面兩項(xiàng)不影響尉桩,開啟編譯期debug模式是下面兩句
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
-Dorg.gradle.debug=true
備注:請(qǐng)?zhí)貏e注意筒占,
在不使用編譯期Debug模式時(shí),一定要將這兩項(xiàng)刪除蜘犁,否則會(huì)導(dǎo)致正常編譯失敗翰苫,無法進(jìn)入普通模式的debug狀態(tài)。
3 .開啟debug
開啟這個(gè)debug沽瘦, 不得不說有很多坑人的地方。
3.1 確保能進(jìn)入debug狀態(tài)农尖, 先clean project一次析恋。
3.2 選擇步驟一中創(chuàng)建的process,然后點(diǎn)擊運(yùn)行盛卡。
運(yùn)行成功會(huì)有如下兩個(gè)標(biāo)志: 1)右側(cè)debug圖標(biāo)(正方形那個(gè)圖)會(huì)由暗色變成紅色助隧。2)在下方的Debug輸入信息欄中會(huì)顯示連接5005接口成功
4 進(jìn)入debug
上面步驟確保成功后,說明debug狀態(tài)開啟成功滑沧。然后在AbstractProcessor子類中就可以打斷點(diǎn)并村,按ctrl+b,執(zhí)行編譯,就會(huì)進(jìn)入debug狀態(tài)滓技。
5 關(guān)閉debug
點(diǎn)擊 上圖 正方形紅色方塊哩牍,結(jié)束bebug.
F&A
不得不說一剛開始遇到了很多問題,在google上搜索的資料不多令漂。膝昆。〉兀總結(jié)如下
1.第一大坑:每次debug模式只能運(yùn)行一次荚孵。一次debug模式后,再進(jìn)行編譯纬朝,則不能再進(jìn)入debug模式了收叶。
這個(gè)問題一直沒有找到原因,但找到了解決方法共苛。
如何一直保持在Debug模式
在正常情況下判没,完成一次Debug模式后可能就不會(huì)再進(jìn)入Debug模式。
解決方法:在編譯期代碼中最后完成的地方隅茎,寫入編譯期異常的代碼哆致。例如在創(chuàng)建的apt-process工程代碼執(zhí)行的最后地方,寫上一句 int x = 0/0 的代碼患膛。當(dāng)編譯器編譯到這個(gè)地方時(shí)會(huì) 拋出編譯異常摊阀。結(jié)束編譯,此時(shí)再執(zhí)行debug,Ctrl+b,仍然可以進(jìn)入debug狀態(tài)胞此。(是不是感覺很奇葩)
2.執(zhí)行不了debug
如果進(jìn)入不了debug臣咖, 請(qǐng)clean projecte。重新啟動(dòng)第一步創(chuàng)建remote. 即選擇Processor漱牵,點(diǎn)擊運(yùn)行
也可以在命令行中運(yùn)行g(shù)radle daemon來啟動(dòng)守護(hù)線程夺蛇。在studio 的命令行工具欄執(zhí)行下面這句。
gradle --daemon
資料參考:
http://www.reibang.com/p/80a14bc35000
3.debug模式啟動(dòng)正常酣胀,但代碼不執(zhí)行AbstractProcessor子類中代碼刁赦。設(shè)置斷點(diǎn)無效
原因:
1).在AbstractProcessor子類上沒有使用 @AutoService(Processor.class)注解 。(這個(gè)注解是google 用于apt的一個(gè)框架中的注解)
在apt的model中依賴使用該杠架
compile 'com.google.auto.service:auto-service:1.0-rc2'
2).android model工程中同時(shí)依賴了 如下兩個(gè)庫,
apt-process不會(huì)執(zhí)行;
apply plugin: 'com.neenbedankt.android-apt'
和
annotationProcessor project(':apt-process')
備注: 經(jīng)測(cè)試, 在app model層同時(shí)依賴兩種庫是不行的. 不能運(yùn)行process, 但是編譯會(huì)運(yùn)行正常, 不會(huì)生成文件.
解決方案一: 將anrodi-apt 轉(zhuǎn)換成 annotationProcessor
將使用apt的庫全部轉(zhuǎn)換成annotationProcessor
資料:
http://www.reibang.com/p/268c14130bea
http://www.cnblogs.com/whoislcj/p/6148410.html
3)依賴問題
無論process被哪個(gè)所依賴,這經(jīng)不會(huì)去搜索被依賴的上層model.例如app modle依賴了一個(gè)libs model, 這個(gè)libs model依賴了process庫, 此時(shí)process只會(huì)查找該 libs庫的被指定注解類注解的類信息.
解決辦法 : 在app model , libs model中都依賴process庫.