使用断点调试 Gradle 插件

使用断点调试 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的模块类路径.

至于其他设置, 我使用了默认提供的设置.

点击 ApplyOK, 一切就绪.

3. 开始调试

现在, 我们可以在这里连接调试器.

但首先要在所需的函数位置设置一个断点.

在我的例子中, 是NewRelicMapUploadTask, 如下图所示. 断点就是下图中的红点.

现在我们准备调试. 只需点击Start Debugging图标:

完成上述操作后, 你会在Debug控制台看到以下信息:

css 复制代码
Connected to the target VM, address: 'localhost:5005', transport: 'socket'

切换回 Android Studio 项目, 你会看到等级任务开始运行.

到达并自动命中断点(当newrelicMapUploadInternal任务被触发时)需要一段时间(可能 1 分钟左右):

就是这样了. 现在, 我们可以将调试器附加到 Gradle 插件, 并进行相应的调试了.

相关推荐
nono牛12 分钟前
深入理解gatekeeperd 与 android.hardware.gatekeeper@1.0-service调用规则
android
lxysbly16 分钟前
红白机模拟器安卓版带金手指
android
·云扬·25 分钟前
【实操教程】Excel文件转CSV并导入MySQL的完整步骤
android·mysql·excel
触想工业平板电脑一体机27 分钟前
【触想智能】工业触控一体机在船舶海运设备上应用的特点和具体场景分析
android·网络·计算机外设·电脑·智能电视
Change_JW30 分钟前
reserved mem addr & size
android
汤面不加鱼丸31 分钟前
android实践:生成.9.png图片
android
叶羽西39 分钟前
下载Android源代码
android
nono牛1 小时前
android.hardware.gatekeeper@1.0-service 与 gatekeeperd 区别
android
&岁月不待人&10 小时前
⏺ Android 录屏缩放异常排查:Pixel 3 XL 上的完美风暴
android
a31582380610 小时前
Android 大图显示策略优化显示(一)
android·算法·图片加载·大图片