使用断点调试 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 插件, 并进行相应的调试了.

相关推荐
丘狸尾1 小时前
[cisco 模拟器] ftp服务器配置
android·运维·服务器
van叶~3 小时前
探索未来编程:仓颉语言的优雅设计与无限可能
android·java·数据库·仓颉
Crossoads7 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
li_liuliu8 小时前
Android4.4 在系统中添加自己的System Service
android
C4rpeDime10 小时前
自建MD5解密平台-续
android
鲤籽鲲12 小时前
C# Random 随机数 全面解析
android·java·c#
m0_5485147715 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯16 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯16 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐16 小时前
Handle
android