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…

相关文章
相关标签/搜索