Android アプリにネイティブ ライブラリが含まれている場合、アプリのビルド構成を少し更新するだけで、Firebase Crashlytics からネイティブ コードの完全なスタック トレースと詳細なクラッシュ レポートを有効にできます。
このガイドでは、Firebase Crashlytics SDK for NDK を使用してクラッシュ レポートを構成する方法について説明します。
Unity プロジェクトで Crashlytics の使用を開始する方法を探している場合は、 Unity 入門ガイド を確認してください。
あなたが始める前に
まだ行っていない場合は、 Firebase を Android プロジェクトに追加します。 Android アプリをお持ちでない場合は、サンプル アプリをダウンロードできます。
推奨: クラッシュ フリー ユーザー、ブレッドクラム ログ、ベロシティ アラートなどの機能を取得するには、Firebase プロジェクトで Google アナリティクスを有効にする必要があります。
既存の Firebase プロジェクトで Google アナリティクスが有効になっていない場合は、Firebase コンソールの [ [統合] タブから Google アナリティクスを有効にすることができます。
] > [プロジェクト設定] の新しい Firebase プロジェクトを作成する場合は、プロジェクト作成ワークフローで Google アナリティクスを有効にします。
ステップ 1 : Crashlytics SDK for NDK をアプリに追加する
モジュール (アプリ レベル) の Gradle ファイル(通常は<project>/<app-module>/build.gradle
) で、Crashlytics NDK Android ライブラリの依存関係を追加します。ライブラリのバージョン管理には、 Firebase Android BoMを使用することをお勧めします。Crashlytics で最適なエクスペリエンスを得るには、Firebase プロジェクトでGoogle アナリティクスを有効にし、Google アナリティクス用の Firebase SDK をアプリに追加することをお勧めします。
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.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-ktx' }
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:18.3.3' implementation 'com.google.firebase:firebase-analytics-ktx:21.2.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.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:18.3.3' implementation 'com.google.firebase:firebase-analytics:21.2.0' }
ステップ 2 : Crashlytics Gradle プラグインをアプリに追加する
ルート レベル (プロジェクト レベル) のGradle ファイル (
<project>/build.gradle
) で、ビルドスクリプトの依存関係として Crashlytics Gradle プラグインを追加します。buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository mavenCentral() // Maven Central repository } dependencies { ... classpath 'com.android.tools.build:gradle:7.2.0' // Make sure that you have the Google services Gradle plugin dependency classpath 'com.google.gms:google-services:4.3.15' // Add the dependency for the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' } }
モジュール (アプリ レベル) のGradle ファイル (通常は
<project>/<app-module>/build.gradle
) に、Crashlytics Gradle プラグインを追加します。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 : firebaseCrashlytics
拡張機能をビルドに追加する
モジュール (アプリ レベル) の Gradle ファイル(通常はapp/build.gradle
) で、 firebaseCrashlytics
拡張機能を追加します。
Kotlin+KTX
// ... 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 } } } }
Java
// ... 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 プラグインには、このプロセスを自動化するためのuploadCrashlyticsSymbolFile BUILD_VARIANT
タスクが含まれています。
自動シンボル アップロードのタスクにアクセスできるように、モジュール (アプリ レベル) の Gradle ファイルで
nativeSymbolUploadEnabled
がtrue
に設定されていることを確認してください。メソッド名がスタック トレースに表示されるようにするには、NDK ライブラリをビルドするたびに、
uploadCrashlyticsSymbolFile BUILD_VARIANT
タスクを明示的に呼び出す必要があります。例えば:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Crashlytics SDK for NDK と Crashlytics Gradle プラグインはどちらも、ネイティブ共有オブジェクト内の GNU ビルド ID の存在に依存しています。
各バイナリで
readelf -n
を実行すると、この ID の存在を確認できます。ビルド ID がない場合は、ビルド システムのフラグに-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 ダッシュボードでクラッシュ レポートと統計を表示して調査できます。
シンボルをアップロードするための代替オプション
上記のこのページのメイン ワークフローは、標準の Gradle ビルドに適用されます。ただし、一部のアプリは別の構成またはツールを使用します (たとえば、Gradle 以外のビルド プロセス)。このような状況では、シンボルを正常にアップロードするために次のオプションが役立つ場合があります。
オプション: ライブラリ モジュールと外部依存関係のシンボルをアップロードする
このオプションは、次の状況で役立ちます。
- Gradle 内でカスタマイズされた NDK ビルド プロセスを使用する場合
- ネイティブ ライブラリがライブラリ/機能モジュールに組み込まれている場合、またはサードパーティによって提供されている場合
- シンボルの自動アップロード タスクが失敗する場合、またはダッシュボードにシンボル化されていないクラッシュが表示される場合
標準の Crashlytics シンボル アップロード タスクでは、CMake などの標準の NDK ビルド ツールを使用して、アプリ モジュールの Gradle ビルドの一部としてネイティブ ライブラリをビルドしていることを前提としています。
ただし、Gradle 内でカスタマイズされた NDK ビルド プロセスを使用している場合、またはネイティブ ライブラリがライブラリ/機能モジュールでビルドされているか、サードパーティによって提供されている場合は、ストリップされていないライブラリへのパスを明示的に指定する必要がある場合があります。これを実現するには、 build.gradle
ファイルのfirebaseCrashlytics
拡張機能内にunstrippedNativeLibsDir
プロパティを追加します。
このページの前半のメイン ワークフローから次の初期タスクを完了していることを確認してください。
自動シンボル アップロード タスクがシンボル情報を見つけられるように、モジュール (アプリ レベル) の
build.gradle
ファイルに次を追加します。// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Crashlytics プラグインは、指定されたディレクトリで
.so
拡張子を持つネイティブ ライブラリを再帰的に検索します。次に、Crashlytics はそのようなすべてのライブラリからデバッグ シンボルを抽出し、それらを Firebase サーバーにアップロードします。unstrippedNativeLibsDir
プロパティで指定できる内容は次のとおりです。java.lang.String
、java.io.File
、またはorg.gradle.api.file.FileCollection
を含む、org.gradle.api.Project#files(Object...)
に使用できる任意の引数リストまたは
FileCollection
インスタンスを提供することにより、1 つのビルド フレーバーに複数のディレクトリを提供する
最後に、テスト クラッシュを強制して Crashlytics の設定を完了し、Firebase コンソールの Crashlytics ダッシュボードに初期データを表示します。
オプション: 非 Gradle ビルドまたはアクセスできないストリップされていないネイティブ ライブラリのシンボルをアップロードする
このオプションは、次の状況で役立ちます。
Gradle 以外のビルド プロセスを使用する場合
ストリップされていないネイティブ ライブラリが何らかの方法で提供され、Gradle ビルド中にアクセスできない場合
このオプションでは、リリース ビルドまたはシンボリック化されたスタック トレースを Firebase コンソールで表示するビルドを作成するときに、Firebase CLI コマンドを実行する必要があります。
このページの前半のメイン ワークフローから次の初期タスクを完了していることを確認してください。
このオプションでは、代わりに Firebase CLI (以下の次の手順) を使用してシンボル ファイルを生成およびアップロードするため、
firebaseCrashlytics
拡張機能を追加したり、シンボルの自動アップロードを設定したりする必要はありません。シンボルのアップロード用に環境とプロジェクトをセットアップします。
指示に従ってFirebase CLI をインストールします。
CLI を既にインストールしている場合は、必ず最新バージョンに更新してください。
(Android API レベル 30 以上を使用するアプリのみ)アプリの
AndroidManifest.xml
テンプレートを更新して、ポインターのタグ付けを無効にします。Android Player Settings > Publishing Settings > Build > Custom Main Manifestのチェックボックスをオンにします。
Assets/Plugins/Android/AndroidManifest.xml
にあるマニフェスト テンプレートを開きます。次の属性をアプリケーション タグに追加します。
<application android:allowNativeHeapPointerTagging="false" ... />
プロジェクトをビルドします。
シンボル情報をアップロードします。
ビルドが完了したら、Crashlytics 互換のシンボル ファイルを生成し、次の Firebase CLI コマンドを実行して Firebase サーバーにアップロードします。
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : Firebase Android アプリ ID (パッケージ名ではありません)
Firebase Android アプリ ID の例:1:567383003300:android:17104a2ced0c9b9b
Firebase アプリ ID を見つけるには、次の 2 つの方法があります。
google-services.json
ファイルでは、アプリ ID はmobilesdk_app_id
値です。またFirebase コンソールで、プロジェクト設定に移動します。 Your appsカードまで下にスクロールし、目的の Firebase アプリをクリックしてそのアプリ ID を見つけます。
PATH/TO/SYMBOLS : CLI によって生成されたシンボル ファイルへのパス
Android Studio プロジェクトにエクスポート — PATH/TO/SYMBOLSは任意のディレクトリにすることができます。 Firebase CLI は、指定されたディレクトリで、拡張子が
.so
のネイティブ ライブラリを再帰的に検索します。APK を Unity 内から直接ビルド — PATH/TO/SYMBOLSは、ビルドが終了したときにプロジェクトのルート ディレクトリに生成された圧縮されたシンボル ファイルのパスです (例:
myproject/myapp-1.0-v100.symbols.zip
)。
シンボル ファイルの生成とアップロードに Firebase CLI コマンドを使用するための詳細オプションを表示する
国旗 説明 --generator=csym
デフォルトの Breakpad ジェネレーターの代わりに、従来の cSYM シンボル ファイル ジェネレーターを使用します。
使用はお勧めしません。デフォルトの Breakpad シンボル ファイル ジェネレーターを使用することをお勧めします。
--generator=breakpad
Breakpad シンボル ファイル ジェネレーターを使用
シンボル ファイル生成のデフォルトは Breakpad であることに注意してください。ビルド構成に
symbolGenerator { csym() }
を追加し、代わりに Breakpad を使用するようにオーバーライドする場合にのみ、このフラグを使用してください。--dry-run
シンボル ファイルを生成しますが、アップロードしません。
このフラグは、送信されたファイルの内容を検査する場合に役立ちます。
--debug
追加のデバッグ情報を提供します 最後に、テスト クラッシュを強制して Crashlytics の設定を完了し、Firebase コンソールの Crashlytics ダッシュボードに初期データを表示します。
強制クラッシュの一環としてアプリをビルドしたら、必ず Firebase CLI の
crashlytics:symbols:upload
コマンドを実行して、シンボル ファイルをアップロードしてください。
トラブルシューティング
Firebase コンソールと logcat で異なるスタック トレースが表示される場合は、トラブルシューティング ガイドを参照してください。
次のステップ
オプトイン レポート、ログ、キー、致命的でないエラーの追跡を追加して、クラッシュ レポートの設定をカスタマイズします。
Google Play と統合して、Crashlytics ダッシュボードで直接 Google Play トラックによって Android アプリのクラッシュ レポートをフィルタリングできるようにします。これにより、ダッシュボードを特定のビルドに集中させることができます。