在 Android 上报告崩溃

Firebase 崩溃报告会针对您应用中的错误作出详细报告。系统会按堆栈跟踪相似度将错误划分为不同的“问题”,并根据错误对用户的影响程度将其分类。除了接收自动报告外,您还可以记录自定义事件,以帮助捕获导致崩溃的步骤。

设置崩溃报告

针对 Android 应用按如下步骤设置崩溃报告:

  1. 为您的 Android 项目设置 Firebase(如果尚未设置)。
  2. Firebase 控制台中,将您的应用添加到 Firebase 项目中。
  3. 将崩溃报告的依赖项添加至您的应用级 build.gradle 文件:
    implementation 'com.google.firebase:firebase-crash:16.2.1'

报告您的第一项错误

Firebase 崩溃报告会为严重错误(或未捕获到的异常)自动生成报告。不过,在您捕获到异常但仍想要报告该处异常时,您也可以生成报告。要报告此类错误,您可以按照下列步骤操作:

  1. 在主 Activity 中添加对静态 report 方法的调用:
    FirebaseCrash.report(new Exception("My first Android non-fatal error"));
  2. 启动应用。
  3. adb logcat 或 Android Studio 日志中,查找确认已启用崩溃报告的消息。
  4. 检查 Firebase 控制台的“崩溃报告”(Crash Reporting) 部分以查看错误。错误可能需要过 1 至 2 分钟才会出现在该部分中。

创建自定义日志

您可以使用崩溃报告在错误报告和(可选)logcat 中记录自定义事件。如果您希望记录事件但不需要 logcat 输出,则只需按如下示例将字符串作为参数传递:

FirebaseCrash.log("Activity created");

如果您想创建 logcat 输出,则还必须提供日志级别和标记。

对 ProGuard 标签进行反混淆处理

ProGuard 会生成一个 mapping.txt 文件,用于将经过混淆处理的 ProGuard 标签映射到其原始名称。如果您已启用 ProGuard,上传您的映射文件后您就可以在崩溃报告界面看到经过反混淆处理的堆栈追踪记录。

为便于测试,您可以先为调试编译类型配置 ProGuard,然后用 ./gradlew assembleDebug 命令进行编译,如下所示:

debug {
   minifyEnabled true
   proguardFiles getDefaultProguardFile('proguard-android.txt'),
     'proguard-rules.pro'
}

使用 Gradle 上传 ProGuard 映射文件

要在 Firebase 控制台中查看经过反混淆处理的堆栈追踪记录,您可以使用崩溃报告插件创建的 Gradle 任务将 ProGuard 映射文件上传至 Firebase。

要配置崩溃报告插件,请执行以下操作:

  1. 向您的根级 build.gradle 文件添加规则以包含崩溃报告插件:
        buildscript {
          repositories {
            jcenter()
            // ...
          }
    
          dependencies {
            // ...
            // For Android Studio 2.x, use firebase-plugins version 1.1.1
            classpath 'com.google.firebase:firebase-plugins:1.1.1'
            // For Android Studio 3.0, use firebase-plugins version 1.1.5
            //classpath 'com.google.firebase:firebase-plugins:1.1.5'
          }
        }
    
  2. 在您的应用项目的 Gradle 文件(通常为 app/build.gradle)中,在“ADD THIS”下面添加如下所示的行以启用崩溃报告插件:
        apply plugin: 'com.android.application'
        // ADD THIS
        apply plugin: 'com.google.firebase.firebase-crash'
    
        android {
          // ...
        }
    
        dependencies {
          // ...
        }
    
  3. 接下来,创建服务帐号和私钥:

    下载服务帐号密钥以对您的上传进行身份验证:在 Firebase 控制台中,选择您的项目,然后点击生成新的私钥

  4. 使用指向 $HOME/.gradle/gradle.properties 的文件路径添加一个名为 FirebaseServiceAccountFilePath 的属性,或者在命令行中使用 -P 标记指定另一个路径。稍后,您可以更新 FirebaseServiceAccountFilePath 属性以使用其他服务帐号文件运行任务。

    或者,您也可以在命令行中使用 -P 标记指定映射文件的路径,以按如下格式设置该属性:

    ./gradlew -PFirebaseServiceAccountFilePath=/usr/ServiceAccount/MyApp-a287fsd34.json :app:firebaseUploadReleaseProguardMapping
  5. 从项目目录中,您可以运行一个 gradlew 命令来编译 APK 并上传其映射文件。例如:

    ./gradlew :app:firebaseUploadReleaseProguardMapping

    上传任务的确切名称取决于版本名称,并采用以下格式: firebaseUpload<VariantName>ProguardMapping。如需完整的可用上传任务名称列表,请运行以下 gradlew 命令:

    ./gradlew :app:tasks

    您还可以通过 firebaseUploadArchivedProguardMapping 任务指定上传 ProGuard 映射文件时所使用的 Gradle 属性。您可以使用此任务指定 FirebaseCrashMappingFilePathFirebaseCrashVersionCodeFirebaseCrashPackageName 这几个 Gradle 属性,如以下示例中所示:

    FirebaseCrashMappingFilePath=path/to/mapping/file
    FirebaseCrashVersionCode=2
    FirebaseCrashPackageName=example.package.name
    
    在此示例中,您的项目使用位于项目的模块文件夹(通常为 app/)中的默认 google-services.json 文件。如果您不想使用 google-services.json 文件,则还应该指定 FirebaseCrashApiKeyFirebaseCrashAppId 这两个 Gradle 属性。

如果应用会编译多个 APK

该插件也适用于那些采用了多 APK 支持的应用。每个版本的任务都会为各自版本的所有 APK 上传映射文件。

例如,假设您有一个名为 fullRelease 的版本,并有多个 APK(如 app-full-armeabi-v7a-release.apkapp-full-armeabi-release.apk)以支持不同的架构,如以下 Gradle 示例中所示。

    productFlavors {
        full {
            applicationId "com.google.firebase.sample.testapp"
            versionName "1.0-full"
        }
    }

    splits {
        abi {
            enable true
            reset()
            include 'armeabi', 'armeabi-v7a'
            universalApk true
        }
    }

运行 ./gradlew :app:firebaseUploadReleaseProguardMapping 任务即可将 app-armeabi-v7a-release.apkapp-armeabi-release.apk 的 ProGuard 映射文件上传到服务器。对于此类上传,控制台输出将显示以下内容:

Successfully uploaded proguard mapping file for app fullArmeabiRelease with versionCode: 1!
Successfully uploaded proguard mapping file for app fullArmeabi-v7aRelease with versionCode: 2!

手动上传 ProGuard 映射文件

另外,您也可以手动将 mapping.txt 文件上传到 Firebase 控制台,具体方法是:通过浏览找到崩溃报告,然后选择映射文件标签。

您可以在类似下方的文件路径中找到要上传的文件,但具体路径取决于您的应用:

<project root>/<module name>/build/outputs/mapping/<build type>/<appname>-proguard-mapping.txt

例如:

app/build/outputs/mapping/debug/app-proguard-mapping.txt

已知问题

如果您使用的是 Android Studio 3.0,则在使用 1.1.01.1.1 版崩溃报告插件时会遇到以下错误,您应改为在应用的根级 build.gradle 文件中使用 1.1.5 版插件:

Cannot create tasks to upload ProGuard Mapping File.java.lang.IllegalStateException: Resolving configuration 'androidTestAnnotationProcessor' directly is not allowed

后续步骤

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面