答:
要通过 Sentry 收集 Android NDK(Native Development Kit)的崩溃报告,你需要使用 Sentry Android SDK 的 NDK 集成。这个集成可以帮助你捕获 C/C++ 层的崩溃和错误。以下是详细步骤,指导你如何在 Android 项目中通过 Sentry 收集 NDK 崩溃日志。
1. 添加 Sentry SDK 到项目中
Step 1: 添加依赖项
在你的项目 build.gradle 文件中,添加 Sentry Android SDK 依赖。你需要确保包含 Sentry NDK 集成模块:
dependencies {
// 添加 Sentry Android SDK
implementation 'io.sentry:sentry-android:6.28.0'
// 添加 Sentry NDK 集成
implementation 'io.sentry:sentry-android-ndk:6.28.0'
}
Step 2: 在 android 块中启用 NDK 崩溃捕获
android {
defaultConfig {
// 添加 Sentry NDK 崩溃捕获的 flags
externalNativeBuild {
ndkBuild {
arguments "APP_CFLAGS+=-DSENTRY_ENABLED"
}
}
}
}
2. 初始化 Sentry
你需要在 Application 类或项目的入口处初始化 Sentry,以便能够捕获崩溃日志。确保 NDK 集成被启用。
Kotlin 或 Java 中初始化 Sentry:
import io.sentry.Sentry
import io.sentry.SentryOptions
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// 初始化 Sentry
Sentry.init { options: SentryOptions ->
options.dsn = "https://your-dsn-key@oXXXXXX.ingest.sentry.io/your-project-id"
// 启用 NDK 集成
options.isEnableNdk = true
// 其他配置项...
}
}
}
请替换 https://your-dsn-key@oXXXXXX.ingest.sentry.io/your-project-id 为你的 Sentry 项目 DSN。
3. 捕获 Native 崩溃
一旦 NDK 集成启用,Sentry 会自动捕获应用中的 native 崩溃,并将崩溃信息上传到 Sentry 平台。在 C/C++ 代码层面,当应用崩溃时,Sentry 将会捕获错误栈并上传。
Sentry 还会自动处理捕获的 NDK 崩溃报告,并提供详细的崩溃上下文,包括线程状态、崩溃类型、设备信息等。
4. 上传调试符号文件 (DSYM 或 Proguard Mapping)
为了使 Sentry 可以将 Native 崩溃报告中的符号信息进行反混淆(symbolicate),你需要上传项目的调试符号文件到 Sentry。你可以通过 sentry-cli 来自动化这个过程。
Step 1: 安装 sentry-cli
首先,你需要安装 sentry-cli,用于上传符号文件:
npm install -g @sentry/cli
Step 2: 配置 sentry.properties
在项目根目录下,创建一个 sentry.properties 文件,用于配置 DSN 和项目信息。
defaults.project=your-project-id
defaults.org=your-organization-slug
auth.token=your-auth-token
你可以通过 Sentry 平台生成 auth.token 和获取 project-id 等信息。
Step 3: 上传调试符号文件
每次构建之后,你可以通过 sentry-cli 上传 NDK 符号文件:
sentry-cli upload-dif --include-sources
或者,你可以在 Gradle 构建脚本中添加上传步骤,自动化上传过程:
afterEvaluate {
task uploadNativeSymbols(type: Exec) {
commandLine 'sentry-cli', 'upload-dif', '--include-sources'
}
tasks.whenTaskAdded { task ->
if (task.name.contains("assemble")) {
task.finalizedBy uploadNativeSymbols
}
}
}
5. 测试 NDK 崩溃
要验证 Sentry NDK 集成是否正常工作,你可以在 C/C++ 代码中手动触发崩溃,比如:
#include <stdlib.h>
void crash() {
int *foo = (int*)-1; // 确保指针无效
printf("%d\n", *foo); // 引发崩溃
}
调用该代码后,应用崩溃,Sentry 将自动捕获并上传崩溃日志到 Sentry 仪表板上。
6. 查看 Sentry 仪表盘上的崩溃报告
在 Sentry 仪表盘上,你可以查看到崩溃报告,崩溃日志会显示详细的栈追踪信息和崩溃上下文。对于 NDK 崩溃,Sentry 将包含完整的 C/C++ 层的崩溃信息。
参考资料
通过上述步骤,你应该能够成功通过 Sentry 收集 Android NDK 的崩溃信息。