Gradle做爲當前主流的項目構建工具之一,基於插件基礎上能夠很方便的實現動態擴展,如基於AGP基礎上爲Android項目提供了構建能力。項目構建過程當中,以Gradle Task爲實際上的構建處理單元,依次完成總體上的構建流程。實際項目開發中,不管是基於已有Gradle/AGP的配置,仍是自定義Task,甚至是自定義插件,都會被普遍的使用到。這其中,尤爲基於自定義插件,能夠爲項目在構建過程當中提供豐富的可擴展能力。html
Gralde在配置、自定義Task甚至自定插件過程當中,被詬病最多的,其自己欠缺的調試能力必居其中。項目自己其實還好,直接經過如print輸出對應信息能夠變通的達到調試的目的,但在自定義插件的開發過程當中,經過日誌輸出的方式查找問題每每很不方便,費時費力。java
Android Studio,基於IntelliJ IDEA,實際上爲咱們提供了Remote調試的能力。基於JDWP協議基礎上,能夠將Debug Process與Remote Process進行關聯,使得Remote Process具有debug的能力。固然,這將基於以下兩個前提:
1,Remote Process具有並開啓基於JDWP協議動態調試的能力;
2,Debug Process正確配置,充當Client或Server角色,與Remote Server簡歷鏈接,現實中用的多的是充當Client角色。markdown
Gradle進程在運行過程當中,經過參數配置,能夠具有上述的基於JDWP協議動態調試的能力。所以,經過與Remote相結合,能夠達到咱們指望中的對Gralde在構建過程當中進行調試的效果。socket
Gradle自己提供了豐富的命令及可選參數,咱們能夠經過./gradlew --help看一下: ide
其中,「-D, --system-prop」使得咱們能夠設置對應的系統屬性,以獲得所要的效果。工具
Gradle提供了豐富的系統屬性配置。具體能夠參照官方文檔: docs.gradle.org/current/use…oop
其中,有咱們須要的org.gradle.debug屬性,經過對其設置,能夠開啓Gralde進程的Remote調試。gradle
這個文檔上的其餘屬性及含義有些場景下也都很是有用,感興趣能夠分別實踐下。 ui
1,Android Studio點擊 "Make Project" 右邊的 」Edit Configurations「,調出 」Run/Debug Configurations「 界面。
2,點擊左上角」+「,新建配置,類型選擇 」Remote「。
3,重命名 」Name「 項,如」GradleDebug「,其餘項保持默認不變,點擊 」OK「,新建完成。
this
項目 | 說明 |
---|---|
Debug mode | Attach to remote JVM:Debug Process做爲Client,鏈接到Remote Process Listen to remote JVM: Debug Process做爲Server,等待Remote Process鏈接。 默認一般使用」Attach to remote JVM「 |
Host | Remote Server的Host地址,本機使用「localhost」 |
Port | Remote Server的對應的Port,默認」5005「,最好不要修改。 |
Command line arguments for remote JVM | 默認 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 jdwp:jdwp協議,對應」Java Debug Wire Protocol「的簡寫 dt_socket:表示經過socket協議創建鏈接 |
Use module classpath | 選擇須要調試的對應項目或模塊,默認"<no module>"指的是整個工程,也能夠選擇本身須要的具體模塊 |
4,Gradle執行Task時開啓調試功能。
在本來Gradle執行命令基礎上加上參數:Dorg.gradle.debug=true --no-daemon。
5,在須要位置打上斷點。
6,構建時選中剛新建的 「GradleDebug」,並點擊其右邊的 「Debug」。此時進入調試狀態,Debug界面會顯示對應調試信息,並能夠經過通用斷點調式方式調式。
2.3.1 斷點調試Gradle Clean
對應命令爲:
./gradlew clean -Dorg.gradle.debug=true --no-daemon
複製代碼
對應輸出提示以下:
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/5.1.1/userguide/gradle_daemon.html.
> Starting Daemon
複製代碼
在須要位置打上斷點,點擊 Debug 後,顯示效果:
2.3.2 斷點調試自定義Task
自定義Task tt,斷點後執行
./gradlew tt -Dorg.gradle.debug=true --no-daemon
複製代碼
2.3.3 自定義插件中斷點調試
自定義Gradle 插件後,設置斷點,執行Task:
./gradlew assembleDebug -Dorg.gradle.debug=true --no-daemon
複製代碼
2.3.4 斷點註解處理器
是的,註解處理器也是能夠斷點的,方式都是同樣的,在自定義註解處理器中設置斷點,執行Task:
./gradlew assembleDebug -Dorg.gradle.debug=true --no-daemon
複製代碼
在Debug界面,各操做與一般調試Java程序相同,若是須要中止調試進程,能夠經過點擊界面左邊的 "Stop"按鈕。
3.2 中止Gradle Task進程
中止Gradle Task進程有兩種方式,分別爲:
1,經過快捷鍵組合方式。推薦使用。
經過 Ctrl + C 快捷鍵組合,連續屢次組合鍵按下,通常三次就能夠當前進程終止。
2,經過命令方式。
經過命令 ./gradlew --status,能夠查到當前全部的Gradle進程狀態,經過./gradlew stop能夠終止當前全部Gradle進程。
也能夠經過對應的Linux命令:ps -9 [process_id] 去終止進程。
注:
使用過程當中,若是出現以下錯誤提示:
Remote Configuration debugger **can not be attached.
複製代碼
這是由於端口(默認5005)已經被另外一個正在運行的Gradle守護進程佔用了,經過./gradlew stop中止進程便可。
docs.gradle.org/current/use…
www.jetbrains.com/help/mps/ru…
stackify.com/java-remote…