Android APT 編譯期進(jìn)入debug模式

我們創(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)試端口.如下圖

image.png
image.png

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
image.png

備注:請(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接口成功

image.png

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庫.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闻镶,一起剝皮案震驚了整個(gè)濱河市甚脉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铆农,老刑警劉巖牺氨,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墩剖,居然都是意外死亡猴凹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門岭皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郊霎,“玉大人,你說我怎么就攤上這事爷绘〈趼ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵揉阎,是天一觀的道長(zhǎng)庄撮。 經(jīng)常有香客問我,道長(zhǎng)毙籽,這世上最難降的妖魔是什么洞斯? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坑赡,結(jié)果婚禮上烙如,老公的妹妹穿的比我還像新娘。我一直安慰自己毅否,他們只是感情好亚铁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著螟加,像睡著了一般徘溢。 火紅的嫁衣襯著肌膚如雪吞琐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天然爆,我揣著相機(jī)與錄音站粟,去河邊找鬼。 笑死曾雕,一個(gè)胖子當(dāng)著我的面吹牛奴烙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剖张,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼切诀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了搔弄?” 一聲冷哼從身側(cè)響起幅虑,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肯污,沒想到半個(gè)月后翘单,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吨枉,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹦渣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了貌亭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬唯。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖圃庭,靈堂內(nèi)的尸體忽然破棺而出锄奢,到底是詐尸還是另有隱情,我是刑警寧澤剧腻,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布拘央,位于F島的核電站,受9級(jí)特大地震影響书在,放射性物質(zhì)發(fā)生泄漏灰伟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一儒旬、第九天 我趴在偏房一處隱蔽的房頂上張望栏账。 院中可真熱鬧,春花似錦栈源、人聲如沸挡爵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茶鹃。三九已至涣雕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間前计,已是汗流浹背胞谭。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留男杈,地道東北人丈屹。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像伶棒,于是被迫代替她去往敵國(guó)和親旺垒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容