Gradle Remote調試

1、背景

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


2、配置與效果

2.1 Gradle開啓調試

Gradle自己提供了豐富的命令及可選參數,咱們能夠經過./gradlew --help看一下: ide

其中,「-D, --system-prop」使得咱們能夠設置對應的系統屬性,以獲得所要的效果。工具

Gradle提供了豐富的系統屬性配置。具體能夠參照官方文檔: docs.gradle.org/current/use…oop

其中,有咱們須要的org.gradle.debug屬性,經過對其設置,能夠開啓Gralde進程的Remote調試。gradle

這個文檔上的其餘屬性及含義有些場景下也都很是有用,感興趣能夠分別實踐下。 ui

2.2 配置步驟

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 示例及效果

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
複製代碼


3、中止調試進程

3.1 中止Debug Process

在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中止進程便可。


4、參考文檔

docs.gradle.org/current/use…
www.jetbrains.com/help/mps/ru…
stackify.com/java-remote…

相關文章
相關標籤/搜索