获取 Android NDK 崩溃报告

如果您的 Android 应用包含原生库,您可以通过对应用的构建配置进行一些小规模更新,从 Firebase Crashlytics 为您的原生代码启用完整堆栈轨迹和详细的崩溃报告。本指南介绍如何使用全新 Firebase Crashlytics SDK 配置崩溃报告。

准备工作

首先,请使用 Firebase Crashlytics SDK 设置 Crashlytics

第 1 步:更新 Gradle 配置

在应用级层 build.gradle 中,添加 Crashlytics NDK 运行时依赖项:

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
    // ...

    // Add the Crashlytics NDK dependency (if you have the
    // Firebase Crashlytics dependency, replace it).
    implementation 'com.google.firebase:firebase-crashlytics:17.1.0'
    implementation 'com.google.firebase:firebase-crashlytics-ndk:17.1.0'
}

// …
android {
    // ...
    buildTypes {
        release {
            // Add this extension
            firebaseCrashlytics {
                // Enable processing and uploading of native symbols to Crashlytics
                // servers. By default, this is disabled to improve build speeds.
                // This flag must be enabled to see properly-symbolicated native
                // stack traces in the Crashlytics dashboard.
                nativeSymbolUploadEnabled true
            }
        }
    }
}

第 2 步:启用原生符号上传

要通过 NDK 崩溃生成可读的堆栈轨迹,Crashlytics 需要了解原生二进制文件中的符号。我们的 Gradle 插件包含 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务,可自动完成此过程(要访问此任务,请确保将 nativeSymbolUploadEnabled 设置为 true)。

要使方法名称显示在堆栈轨迹中,您必须在每次构建 NDK 库后明确调用 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务。例如:

>./gradlew app:assembleBUILD_VARIANT\
           app:uploadCrashlyticsSymbolFileBUILD_VARIANT

第 3 步(可选):为外部依赖项上传符号

我们的符号上传任务假设您正在使用 CMake 之类的标准 NDK 构建工具,在 Gradle 构建过程中构建原生库。如果您有在外部构建的原生库,或在 Gradle 中使用了自定义 NDK 构建流程,则可能需要明确指定已剥离的库和未剥离的库的路径。firebaseCrashlytics 扩展程序提供了可实现此目的的属性:strippedNativeLibsDirunstrippedNativeLibsDir

// …
android {
    // ...
    buildTypes {
        release {
            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                strippedNativeLibsDir ‘path/to/stripped/parent/dir’
                unstrippedNativeLibsDir ‘path/to/unstripped/parent/dir’
            }
        }
    }
}

我们的插件假定库位于指定目录下特定架构的子目录中,并且对应的已剥离/未剥离的库对在该目录下的路径相同。例如:

strippedNativeLibsDir/
 +- x86/
      |
      +- libfoo.so
      +- libbar.so
 +- arm64/
      |
      +- libfoo.so
      +- libbar.so

unstrippedNativeLibsDir/
 +- x86/
      |
      +- libfoo.so
      +- libbar.so
 +- arm64/
      |
      +- libfoo.so
      +- libbar.so

如果您的构建系统未遵循上述结构/命名方案,请先在本地磁盘上手动创建此结构,然后再调用 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务。

第 4 步(可选):自定义 NDK 崩溃报告

您可以选择在 C++ 代码中包含 crashlytics.h 头文件,以将元数据(如日志、自定义键和用户 ID)添加到 NDK 崩溃报告中。 Firebase Android SDK GitHub 代码库中提供了仅可作为头文件的 C++ 库形式的 crashlytics.h。 请阅读该头文件中的注释,了解有关使用 NDK C++ API 的说明。

第 5 步:查看崩溃报告

通过构建应用、上传符号并强制造成原生代码崩溃来验证 Crashlytics 是否正确报告 NDK 崩溃。在应用崩溃以便 Crashlytics 发送报告后,您将需要重启应用。 您应该会在几分钟内在 Firebase 控制台中看到崩溃。