使用断点调试 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 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker2 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95273 小时前
Andorid Google 登录接入文档
android
黄林晴4 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab16 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿19 小时前
Android MediaPlayer 笔记
android
Jony_20 小时前
Android 启动优化方案
android
阿巴斯甜20 小时前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇20 小时前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android