Android アプリにネイティブ ライブラリが含まれている場合は、アプリのビルド構成を少し変更するだけで、Firebase Crashlytics でネイティブ コードの完全なスタック トレースを行い、詳細なクラッシュ レポートを作成できます。
このガイドでは、NDK 用の Firebase Crashlytics SDK を使用してクラッシュ レポートを構成する方法について説明します。
Unity プロジェクトで Crashlytics の使用を開始する方法については、Unity スタートガイドをご覧ください。
始める前に
まだ Firebase を Android プロジェクトに追加していない場合は追加します。Android アプリをお持ちでない場合は、サンプルアプリをダウンロードできます。
推奨: パンくずリストのログを自動的に取得して、クラッシュ イベント、非致命的イベント、ANR イベントに至るまでのユーザー操作を把握するには、Firebase プロジェクトで Google Analytics を有効にする必要があります。
既存の Firebase プロジェクトで Google Analytics が有効になっていない場合は、Firebase コンソールで
[ の [ ] > [プロジェクトの設定]統合] タブで Google Analytics を有効にします。新しい Firebase プロジェクトを作成する場合は、プロジェクトの作成ワークフローで Google Analytics を有効にします。
アプリが次の最小バージョン要件を満たしていることを確認します。
- Gradle 8.0
- Android Gradle プラグイン 8.1.0
- Google サービス Gradle プラグイン 4.4.1
ステップ 1: NDK 用の Crashlytics SDK をアプリに追加する
モジュール(アプリレベル)の Gradle ファイル(通常は<project>/<app-module>/build.gradle.kts
または <project>/<app-module>/build.gradle
)に、Android 用 Crashlytics NDK ライブラリの依存関係を追加します。ライブラリのバージョニングの制御には、Firebase Android BoM を使用することをおすすめします。
Crashlytics のエクスペリエンスを最適化するために、Firebase プロジェクトで Google Analytics を有効にして、Google アナリティクス用の Firebase SDK をアプリに追加することをおすすめします。
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.6.0")) // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") }
Firebase Android BoM を使用すると、アプリは常に互換性のあるバージョンの Firebase Android ライブラリを使用します。
(代替方法)BoM を使用せずに Firebase ライブラリの依存関係を追加する
Firebase BoM を使用しない場合は、依存関係の行でそれぞれの Firebase ライブラリのバージョンを指定する必要があります。
アプリで複数の Firebase ライブラリを使用する場合は、すべてのバージョンの互換性を確保するため、BoM を使用してライブラリのバージョンを管理することを強くおすすめします。
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk:19.2.1") implementation("com.google.firebase:firebase-analytics:22.1.2") }
ステップ 2: アプリに Crashlytics Gradle プラグインを追加する
ルートレベル(プロジェクト レベル)の Gradle ファイル(
<project>/build.gradle.kts
または<project>/build.gradle
)で、Crashlytics Gradle プラグインをplugins
ブロックに追加します。Kotlin
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id("com.android.application") version "8.1.4" apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id("com.google.gms.google-services") version "4.4.2" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.2" apply false }
Groovy
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id 'com.android.application' version '8.1.4' apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id 'com.google.gms.google-services' version '4.4.2' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.2' apply false }
モジュール(アプリレベル)の Gradle ファイル(通常は
<project>/<app-module>/build.gradle.kts
または<project>/<app-module>/build.gradle
)に、Crashlytics Gradle プラグインを追加します。Kotlin
plugins { id("com.android.application") // ... // Make sure that you have the Google services Gradle plugin id("com.google.gms.google-services") // Add the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") }
Groovy
plugins { id 'com.android.application' // ... // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' }
ステップ 3: ビルドに Crashlytics 拡張機能を追加する
モジュール(アプリレベル)の Gradle ファイル(通常は <project>/<app-module>/build.gradle.kts
または <project>/<app-module>/build.gradle
)で、Crashlytics 拡張機能を構成します。
Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { getByName("release") { // Add this extension configure<CrashlyticsExtension> { // Enable processing and uploading of native symbols to Firebase 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 } } } }
Groovy
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase 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 } } } }
ステップ 4: ネイティブ シンボルの自動アップロードを設定する
NDK のクラッシュから読み取り可能なスタック トレースを生成するには、ネイティブ バイナリ内のシンボルを Crashlytics に知らせる必要があります。Crashlytics Gradle プラグインには、このプロセスを自動化する uploadCrashlyticsSymbolFileBUILD_VARIANT
タスクが含まれています。
自動シンボル アップロードのタスクにアクセスするには、モジュール(アプリレベル)の Gradle ファイルで
nativeSymbolUploadEnabled
がtrue
に設定されていることを確認してください。スタック トレースにメソッド名を含めるには、NDK ライブラリをビルドするたびに
uploadCrashlyticsSymbolFileBUILD_VARIANT
タスクを明示的に呼び出す必要があります。次に例を示します。>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
NDK 用の Crashlytics SDK と Crashlytics Gradle プラグインは両方とも、ネイティブ共有オブジェクト内の GNU ビルド ID の存在に依存しています。
この ID の存在を確認するには、各バイナリに対して
を実行します。このビルド ID が存在しない場合は、ビルドシステムのフラグにreadelf -n
を追加することで問題を解決できます。-Wl,--build-id
ステップ 5: 強制的にテスト クラッシュを発生させて設定を完了する
Crashlytics の設定を完了し、Firebase コンソールの Crashlytics ダッシュボードで最初のデータを確認するには、強制的にテスト クラッシュを発生させる必要があります。
強制的にテスト クラッシュを発生させるためのコードをアプリに追加します。
アプリの
MainActivity
で次のコードを使用するとアプリにボタンが追加され、このボタンを押すとクラッシュを発生させることができます。ボタンには「Test Crash」というラベルが付いています。Kotlin+KTX
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
アプリをビルドして実行します。
アプリの最初のクラッシュ レポートを送信するために、強制的にテスト クラッシュを発生させます。
テスト用のデバイスまたはエミュレータからアプリを開きます。
アプリ内で、上述のコードを使用して追加した [Test Crash] ボタンを押します。
アプリがクラッシュしたら再起動します。これにより、Firebase にクラッシュ レポートが送信されます。
Firebase コンソールの Crashlytics ダッシュボードに移動して、テスト クラッシュを確認します。
コンソールを更新し、5 分経過してもテスト クラッシュが表示されない場合は、デバッグ ロギングを有効にして、アプリがクラッシュ レポートを送信しているかどうかを確認してください。
これで完了です。これで Crashlytics がアプリのクラッシュをモニタリングするようになったため、Crashlytics ダッシュボードでクラッシュ レポートと統計情報を確認、調査できます。
次のステップ
(推奨) GWP-ASan レポートを収集すると、ネイティブ メモリエラーに起因するクラッシュのデバッグに役立つ情報が得られます。 このようなメモリ関連のエラーは、アプリのセキュリティの脆弱性の主な原因である、アプリ内のメモリ破損に関連している可能性があります。このデバッグ機能を使用するには、アプリで GWP-ASan を明示的に有効にするとともに、最新の Crashlytics SDK for NDK(v18.3.6 以降または Firebase BoM v31.3.0 以降)を使用してください。
クラッシュ レポートの設定をカスタマイズするために、オプトイン レポート、ログ、キー、致命的でないエラーの追跡を追加する。
Android アプリのクラッシュ レポートを Crashlytics ダッシュボードから直接 Google Play トラックでフィルタリングできるように、Google Play と統合する。これにより、ダッシュボードで特定のビルドに注目できます。
トラブルシューティング
Firebase コンソールのスタック トレースと logcat のスタック トレースが一致しない場合は、トラブルシューティング ガイドをご覧ください。
シンボルをアップロードするための代替オプション
このページの前述のメイン ワークフローは、標準の Gradle ビルドに適用できます。ただし、アプリによっては、別の構成やツール(Gradle 以外のビルドプロセスなど)を使用する場合があります。そのような場合は、以下のオプションを使用してシンボルをアップロードできる可能性があります。
オプション: ライブラリ モジュールと外部依存関係のシンボルをアップロードする
このオプションは次のような場合に役立ちます。
- カスタマイズした NDK ビルドプロセスを Gradle 内で使用する場合
- ネイティブ ライブラリがライブラリ / 機能モジュール内でビルドされている場合、またはサードパーティによって提供されている場合
- 自動シンボル アップロード タスクが失敗する場合、またはシンボリケートされていないクラッシュがダッシュボードに表示される場合
オプション: Gradle 以外のビルドのシンボル、またはストリップされておらずアクセスできないネイティブ ライブラリのシンボルをアップロードする
このオプションは次のような場合に役立ちます。
Gradle 以外のビルドプロセスを使用する場合
ストリップされていないネイティブ ライブラリが提供されていて、Gradle ビルド中にアクセスできない場合