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

相关推荐
帅得不敢出门9 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了11 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任12 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山12 小时前
Android“引用们”的底层原理
android·java
迃-幵13 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
大风起兮云飞扬丶13 小时前
Android——从相机/相册获取图片
android
Rverdoser13 小时前
Android Studio 多工程公用module引用
android·ide·android studio
aaajj14 小时前
[Android]从FLAG_SECURE禁止截屏看surface
android
@OuYang14 小时前
android10 蓝牙(二)配对源码解析
android
Liknana14 小时前
Android 网易游戏面经
android·面试