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

相关推荐
用户2018792831671 小时前
浅谈Android PID与UID原理
android
TimeFine1 小时前
Android AWS KVS WebRTC 通话声道切换到媒体音乐声道
android
用户2018792831672 小时前
Android文件下载完整性保证:快递员小明的故事
android
用户2018792831672 小时前
自定义 View 的 “快递失踪案”:为啥 invalidate () 喊不动 onDraw ()?
android
没有了遇见2 小时前
Android 稀奇古怪系列:新版本签名问题-Algorithm HmacPBESHA256 not available
android
小妖怪的夏天3 小时前
react native android设置邮箱,进行邮件发送
android·spring boot·react native
东风西巷3 小时前
Avast Cleanup安卓版(手机清理优化) 修改版
android·学习·智能手机·软件需求
用户2018792831673 小时前
Android断点续传原理:小明的"读书笔记"故事
android
用户2018792831674 小时前
ART 内存模型:用 “手机 APP 小镇” 讲明白底层原理
android
liulangrenaaa4 小时前
Android NDK 命令规范
android