使用断点调试 Gradle 插件
以 NewRelic 插件为例
学习 Android 开发
在 Android 开发中, 我最担心的事情之一就是在 Gradle 中遇到问题. 我经常运行不同的 Gradle 任务, 希望能找出问题所在, 但有时却无济于事, 尤其是当问题出现在 Gradle 插件本身时.
PS: 如果你对一些 Gradle 基础知识感兴趣, 请看这个.
最近, 我一直在为一个简单的项目使用 NewRelic
插件, 该插件应该上传 mapping.txt
文件(帮助消除崩溃日志跟踪). 它一直工作正常, 直到昨天我编译时, mapping.txt
才上传.
具体来说, 问题出现在运行以下任务时:
bash
./gradlew app:newrelicMapUploadRelease
会出现以下错误:
vbnet
An error occurred uploading ProGuard/DexGuard 'mapping.txt' to New Relic:
Cannot invoke "java.io.InputStream.read(byte[])" because "input" is null
To de-obfuscate crashes, upload the build's ProGuard/DexGuard 'mapping.txt'
manually, or run the 'newRelicMapUpload<Variant>' Gradle task.
For more help, see
'https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-android/install-configure/android-agent-crash-reporting'
发生了什么?
基本的 NewRelic 设置
在调试问题之前, 了解一些基本的 NewRelic 设置很重要, 我们可以通过文档(也可以使用guided setup).
要设置 Gradle 脚本, 我们只需添加插件id("newrelic")
:
bash
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("newrelic")
}
因此, 所有功能都嵌入到了插件中. 我怎样才能调试该脚本中的newrelicMapUploadRelease
问题?
为了方便使用, 我做了 一个简单的设计. 只需在其中添加
NEWRELIC-APPKEY
即可.
调试 NewRelic Gradle 插件
吃水不忘挖井人: 我从Youtube上学习了 Gradle 调试和 Gradle 插件调试. 这里我将专门分享 NewRelic Gradle 插件.
1. 开启高度并运行 gradle 命令
首先, 进入项目终端, 键入要运行的 gradle 命令. 在我的例子中, 我将只运行:app:assemble
, 因为我希望整个编译也能触发:app:newrelicMapUploadRelease
.
注意, 运行前首先清理项目很重要, 因为
newrelicMapUpload
步骤只会在清理后的编译中运行.
重要的是添加-Dorg.gradle.debug=true
:
ini
./gradlew :app:assemble -Dorg.gradle.debug=true
第一次运行时, 你可能会看到它会暂停:
ruby
SimpleNewRelicTest % ./gradlew :app:assemble -Dorg.gradle.debug=true
Starting a Gradle Daemon, 2 incompatible Daemons could not be reused, use --status for details
> Configure project :app
注意: 我不确定一旦我设法连接了调试器, 随后会不会发生这种情况, 即使在调试器未连接之后也是如此.
2. 设置 NewRelic 插件调试配置
在搜索中, 我们可以找到NewRelic gradle 插件, 以及源代码. 克隆源代码, 并在 IntelliJ 中打开项目.
然后, 我们可以从配置下拉菜单 → Edit Configurations 中添加配置:
然后添加一个新的远程 JVM 调试配置:
然后为配置命名. 我将其命名为 Remote
.
还选择了newrelic-android-agent.agent.main
的模块类路径.
至于其他设置, 我使用了默认提供的设置.
点击 Apply
和 OK
, 一切就绪.
3. 开始调试
现在, 我们可以在这里连接调试器.
但首先要在所需的函数位置设置一个断点.
在我的例子中, 是NewRelicMapUploadTask
, 如下图所示. 断点就是下图中的红点.
现在我们准备调试. 只需点击Start Debugging
图标:
完成上述操作后, 你会在Debug控制台看到以下信息:
css
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
切换回 Android Studio 项目, 你会看到等级任务开始运行.
到达并自动命中断点(当newrelicMapUploadInternal
任务被触发时)需要一段时间(可能 1 分钟左右):
就是这样了. 现在, 我们可以将调试器附加到 Gradle 插件, 并进行相应的调试了.