Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

Android NDK クラッシュ レポートを取得する

Android アプリにネイティブ ライブラリが含まれている場合は、アプリのビルド構成を少し変更するだけで、Firebase Crashlytics でネイティブ コードの完全なスタック トレースを行い、詳細なクラッシュ レポートを作成できます。このガイドでは、新しい Firebase Crashlytics SDK を使用してクラッシュ レポートを構成する方法について説明します。

始める前に

まず、Firebase Crashlytics SDK を使用して Crashlytics を設定します。

ステップ 1: Gradle の構成を更新する

アプリレベルの build.gradle で、Crashlytics NDK のランタイム依存関係を宣言します。

Java

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

dependencies {
  // ...

  // Import the BoM for the Firebase platform
  implementation platform('com.google.firebase:firebase-bom:25.12.0')

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics'
}

// …
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
          }
      }
  }
}

Firebase Android BoM を使用すると、アプリは常に互換性のあるバージョンの Firebase Android ライブラリを使用します。

(別の方法)BoM を使用せずに Firebase ライブラリの依存関係を宣言する

Firebase BoM を使用しない場合は、依存関係の行でそれぞれの Firebase ライブラリのバージョンを指定する必要があります。

アプリで複数の Firebase ライブラリを使用する場合は、すべてのバージョンの互換性を確保するため、BoM を使用してライブラリのバージョンを管理することを強くおすすめします。

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics:17.2.2'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:17.2.2'
      implementation 'com.google.firebase:firebase-analytics:17.6.0'
  }
  

Kotlin+KTX

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

dependencies {
  // ...

  // Import the BoM for the Firebase platform
  implementation platform('com.google.firebase:firebase-bom:25.12.0')

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics-ktx'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics-ktx'
}

// …
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
          }
      }
  }
}

Firebase Android BoM を使用すると、アプリは常に互換性のあるバージョンの Firebase Android ライブラリを使用します。

(別の方法)BoM を使用せずに Firebase ライブラリの依存関係を宣言する

Firebase BoM を使用しない場合は、依存関係の行でそれぞれの Firebase ライブラリのバージョンを指定する必要があります。

アプリで複数の Firebase ライブラリを使用する場合は、すべてのバージョンの互換性を確保するため、BoM を使用してライブラリのバージョンを管理することを強くおすすめします。

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics-ktx:17.2.2'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:17.2.2'
      implementation 'com.google.firebase:firebase-analytics-ktx:17.6.0'
  }
  

ステップ 2: ネイティブ シンボルのアップロードを有効にする

NDK のクラッシュから読み取り可能なスタック トレースを生成するには、ネイティブ バイナリ内のシンボルを Crashlytics に知らせる必要があります。Gradle プラグインには、このプロセスを自動化する uploadCrashlyticsSymbolFileBUILD_VARIANT タスクが含まれています(このタスクにアクセスするには、必ず nativeSymbolUploadEnabled を true に設定してください)。

スタック トレースにメソッド名を含めるには、NDK ライブラリをビルドするたびに uploadCrashlyticsSymbolFileBUILD_VARIANT タスクを明示的に呼び出す必要があります。次に例を示します。

>./gradlew app:assembleBUILD_VARIANT\
           app:uploadCrashlyticsSymbolFileBUILD_VARIANT

ステップ 3(省略可): 外部依存関係のシンボルをアップロードする

シンボルのアップロード タスクでは、CMake などの標準の NDK ビルドツールを使用して、Gradle ビルドの一環としてネイティブ ライブラリをビルドすることを前提としています。ネイティブ ライブラリを外部でビルドしている場合や、カスタマイズした NDK ビルドを Gradle 内で使用している場合、ストリップ済みライブラリとストリップされていないライブラリへのパスを明示的に指定しなければならない場合があります。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 ヘッダーを組み込んで、NDK クラッシュ レポートにメタデータ(ログ、カスタムキー、ユーザー ID など)を追加できます。crashlytics.h は、ヘッダーのみの C++ ライブラリとして Firebase Android SDK GitHub リポジトリに用意されています。NDK C++ API の使用方法については、ヘッダー ファイル内のコメントをご覧ください。

ステップ 5: クラッシュ レポートを表示する

Crashlytics が NDK のクラッシュを正しく報告していることを確認するには、アプリをビルドし、シンボルをアップロードして、ネイティブ クラッシュを強制的に発生させます。アプリがクラッシュしたら、Crashlytics がレポートを送信できるようにそのアプリを再起動する必要があります。数分以内に Firebase コンソールにクラッシュが表示されます。

トラブルシューティング