このページでは、Crashlytics の使用に関するトラブルシューティングのヘルプ情報と、よくある質問への回答を紹介します。お探しの情報が見つからない場合や、サポートが必要な場合は、Firebase サポートにお問い合わせください。
このページでは、次の種類のトピックに関する情報を確認できます。
一般的なトラブルシューティング。Firebase コンソールでのデータの表示やデータの操作に関する質問、問題の回帰に関する質問など。
プラットフォーム固有のサポート。Apple プラットフォーム、Android、Unity に固有の質問など。
統合のサポート。BigQuery に関する質問など。
一般的なトラブルシューティングとよくある質問
[問題] テーブルの中の一部の問題でさまざまな形式(場合によっては「バリアント」)が表示される
Firebase コンソールの [問題] テーブルに一覧表示される問題には、2 つの異なる形式があります。また、問題内に「バリアント」と呼ばれる特徴が存在する場合もあります。その理由を説明します。
2023 年初頭、Google はイベントをグループ化するための向上した分析エンジンをリリースしました。このリリースでは、設計の更新が行われ、新しい問題向けの高度な機能(バリアントなど)が含まれています。詳しくは、最近のブログ投稿をご覧ください。最新情報については以下からもご確認いただけます。
Crashlytics は、アプリのすべてのイベント(クラッシュ、致命的でないイベント、ANR など)を分析し、問題と呼ばれるイベントのグループを作成します。1 つの問題の中のすべてのイベントには共通の障害点があります。
イベントを問題としてグループ化するために、向上した分析エンジンでは、スタック トレース内のフレーム、例外メッセージ、エラーコード、その他のプラットフォームまたはエラータイプの特性など、イベントの多くの要素を確認するようになりました。
ただし、このようにグループ化されたイベントの中には、障害に至るまでのスタック トレースが異なるものが含まれることがあります。スタック トレースが異なる場合は、根本原因が異なる可能性があります。一つの問題の中のこの違いを表現するため、問題の中にバリアントが作成されるようになりました。個々のバリアントは、一つの問題の中に含まれ、同じ障害点と類似のスタック トレースを持つイベントのサブグループです。バリアントによって、問題の中の最も一般的なスタック トレースをデバッグし、異なる根本原因によって障害が発生しているかどうかを判断できます。
改良点は以下のとおりです。
[問題] の行に表示されるメタデータを改善
アプリで問題を簡単に把握し、優先順位を設定できるようになりました。問題の重複の低減
行番号を変更しても新しい問題は発生しません。さまざまな根本原因による複雑な問題のデバッグが容易に
バリアントを使用して、問題内で最も一般的なスタック トレースをデバッグできます。より有意義なアラートとシグナル
新しい問題は実際の新しいバグを表すようになりました。検索機能の強化
それぞれの問題に、例外タイプやパッケージ名など、検索可能なメタデータが追加されました。
改良された機能の提供の詳細は次のとおりです。
アプリから新しいイベントを受け取ると、既存の問題と一致するかどうかが確認されます。
一致するものがない場合は、よりスマートなイベント グループ アルゴリズムをイベントに自動的に適用し、改良されたメタデータ設計を使って新しい問題を作成します。
これは、イベントのグループ分けに関する最初の大きなアップデートです。フィードバックがある場合や問題が発生した場合は、レポートに記入してお知らせください。
パンくずリストのログが表示されない
パンくずリストのログが表示されない場合(iOS+ | Android | Flutter | Unity)は、アプリの Google Analyticsの構成を確認することをおすすめします。次の要件を満たしていることを確認してください。
Firebase プロジェクトで Google Analytics を有効にしています。
Google Analytics のデータ共有を有効にしている。この設定の詳細については、アナリティクスのデータ共有設定を管理するをご覧ください。
Google Analytics 用の Firebase SDK(iOS+ | Android | Flutter | Unity)をアプリに追加している。
Crashlytics SDK に加えて、この SDK も追加する必要があります。アプリで使用するすべてのプロダクトで最新バージョンの Firebase SDK(iOS+ | Android | Flutter | Unity)を使用している。
Apple プラットフォームと Android アプリの場合は、少なくとも次のバージョンの Google Analytics 用 Firebase SDK を使用していることを確認します。
iOS+ - v6.3.1 以降 (macOS および tvOS の場合は v8.9.0 以降)|Android - v17.2.3 以降 (BoM v24.7.1 以降) 。
ベロシティ アラートが表示されない
ベロシティ アラートが表示されない場合は、 Crashlytics SDK v18.6.0 以降(または Firebase BoM v32.6.0 以降) を使用していることを確認してください。
クラッシュの影響を受けていない指標が表示されない(または信頼性の低い指標が表示される)
クラッシュの影響を受けていない指標(クラッシュの影響を受けていないユーザーやセッションなど)が表示されない場合や、信頼性の低い指標が表示される場合は、次の点を確認してください。
Crashlytics SDK v18.6.0 以降(または Firebase BoM v32.6.0 以降) を使用している。
データ収集の設定がクラッシュの影響を受けていない指標の品質に影響していない。
自動クラッシュ レポートを無効にしてオプトイン レポートを有効にした場合、クラッシュ情報は、データ収集を明示的にオプトインしたユーザーからのみ Crashlytics に送信されます。そのため、Crashlytics にはオプトインしたユーザーのクラッシュ情報のみが含まれるため(すべてのユーザーではない)、クラッシュの影響を受けていない指標の精度が影響を受けます。つまり、クラッシュの影響を受けていない指標の信頼性が低下し、アプリの全体的な安定性を反映しなくなる可能性があります。
データの自動収集が無効になっている場合は、
sendUnsentReportsを使用して、デバイス上のキャッシュに保存されたレポートを Crashlytics に送信できます。 この方法を使用すると、Crashlytics にクラッシュ データが送信されますが、セッション データは送信されません。そのため、コンソール グラフには、クラッシュの影響を受けていない指標に低い値またはゼロの値が表示されます。
クラッシュの影響を受けていないユーザーはどのように計算されますか?
クラッシュの影響を受けていない指標についてをご覧ください。
問題に関するノートを表示、書き込み、削除できるのは誰ですか?
ノートを使用すると、特定の問題に関する質問やステータスの更新などについて、プロジェクト メンバーがコメントを残すことができます。
ノートには、投稿したメンバーの Google アカウントのメールアドレスがラベル付けされます。このメールアドレスは、ノートを見ることができるプロジェクト メンバー全員に対して、ノートとともに表示されます。
ノートを表示、書き込み、削除するために必要なアクセス権は次のとおりです。
次のいずれかのロールを持つプロジェクト メンバーは、問題に関する既存のノートの表示と削除、新しいノートの書き込みを行うことができます。
次のいずれかのロールを持つプロジェクト メンバーは、問題に関するノートを見ることはできますが、ノートの削除や書き込みはできません。
- プロジェクトの閲覧者、Firebase 閲覧者、品質閲覧者、Crashlytics 閲覧者
問題の回帰とは
以前にクローズした問題が再発して Crashlytics が新しいレポートを受け取った場合に、対象の問題で回帰が発生したことになります。回帰が発生した問題は、アプリに適した方法で対応できるよう Crashlytics によって自動的に再オープンされます。
次のような場合、Crashlytics は問題を回帰として分類します。
- Crashlytics が初めて、クラッシュ「A」に関するクラッシュ レポートを受け取りました。Crashlytics は、そのクラッシュに対応する問題(問題「A」)をオープンしました。
- あなたはこのバグを速やかに修正し、問題「A」をクローズしてから、アプリの新しいバージョンをリリースしました。
- 問題をクローズした後で、Crashlytics が問題「A」に関する別のレポートを受け取りました。
- このレポートが、この問題をクローズしたときに Crashlytics で認識されていたバージョン(つまり、なんらかのクラッシュに関するレポートを送信したことがあるバージョン)のアプリから送信されたものである場合は、Crashlytics は問題が回帰であると見なしません。この問題はクローズのままです。
- このレポートが、この問題をクローズしたときに Crashlytics で認識されていなかったバージョン(つまりクラッシュに関するレポートを以前に送信したことがないバージョン)のアプリから送信されたものである場合、Crashlytics は問題を回帰と見なして再オープンします。
問題の回帰が発生すると、回帰検出アラートが送信されます。つまり回帰シグナルを問題に追加して、Crashlytics が問題を再オープンしたことを知らせます。この回帰アルゴリズムによって問題を再オープンしたくない場合は、問題をクローズする代わりに「ミュート」します。
古いバージョンのアプリで問題の回帰が発生するのはなぜですか?
レポートを送信したアプリのバージョンが、問題をクローズした時点でクラッシュ レポートを一度も送信したことのない古いバージョンである場合、Crashlytics は問題の回帰が発生したと見なし、その問題を再オープンします。
このような状況は、バグを修正し、新しいバージョンのアプリをリリースしたにもかかわらず、バグが修正されていない古いバージョンを利用しているユーザーがいる場合に発生することがあります。問題をクローズした時点でクラッシュ レポートを一度も送信したことのない、古いバージョンのアプリがまだ使用されている場合、そのバージョンでバグが発生してクラッシュ レポートが送信されると、問題の回帰がトリガーされます。
この回帰アルゴリズムによって問題を再オープンしたくない場合は、問題をクローズする代わりに「ミュート」します。
プラットフォーム固有のサポート
以下のセクションでは、プラットフォーム(iOS+ | Android | Unity)固有のトラブルシューティングとよくある質問に関するサポートを提供します。
Apple プラットフォームのサポート
dSYM がないか、アップロードされていない
プロジェクトの dSYM をアップロードして詳細な出力を表示するには、以下をご確認ください。
プロジェクトのビルドフェーズに Crashlytics 実行スクリプトが含まれていることを確認します。このスクリプトにより、Xcode はビルド時にプロジェクトの dSYM をアップロードできます(スクリプトの追加手順については、Crashlytics の初期化をご覧ください)。プロジェクトを更新したら、強制的にクラッシュさせ、Crashlytics ダッシュボードにクラッシュが表示されることを確認します。
Firebase コンソールに「dSYM の不足」に関するアラートが表示される場合は、Xcode でビルドの dSYM が適切に生成されていることを確認します。
Xcode が dSYM を適切に生成しているにもかかわらず dSYM が不足している場合は、dSYM のアップロード中に実行スクリプト ツールが停止している可能性があります。この場合は、次の手順をお試しください。
Crashlytics の最新バージョンを使用していることをご確認ください。
不足している dSYM ファイルを手動でアップロードします。
- オプション 1: [dSYMsdSYM] タブの、コンソールベースの [Drag and Drop] オプションを使用して、不足している dSYM ファイルが含まれる zip アーカイブをアップロードします。
- オプション 2:
upload-symbolsスクリプトを使用して、不足している dSYM ファイルを dSYMs[dSYM] タブの対象 UUID 用にアップロードします。
dSYM の不足やアップロードの失敗が続く場合は、Firebase サポートまでご連絡ください。その際は必ず、ログを含めてください。
クラッシュのシンボリケーションが不十分
スタック トレースのシンボリケーションが不十分と思われる場合は、次の点を確認してください。
アプリのライブラリのフレームにアプリのコードへの参照がない場合は、
がコンパイル フラグとして設定されていないことを確認してください。-fomit-frame-pointerアプリのライブラリに
(Missing)フレームが複数表示される場合は、Firebase コンソールの Crashlytics の [dSYMs] タブで、(影響を受けるアプリのバージョン用の)オプションの dSYM が不足していると表示されているかどうかを確認します。そのような表示がある場合は、このページの dSYM がないか、アップロードされていないに記載されている dSYM の不足のアラートのトラブルシューティングの手順を実施してください。これらの dSYM をアップロードしても、すでに発生したクラッシュはシンボリケートされませんが、今後のクラッシュはシンボリケートされるようになります。
macOS または tvOS 向けに Crashlytics を使用できますか?
はい。macOS プロジェクトと tvOS プロジェクトに Crashlytics を実装できます。Google Analytics 用 Firebase SDK の v8.9.0 以降を実装して、クラッシュ時に、Google Analytics によって収集された指標(クラッシュの影響を受けていないユーザー、最新リリース、ベロシティ アラート、パンくずリストのログ)にアクセスできるようにしてください。
異なる Apple プラットフォーム上の複数のアプリに対して、1 つの Firebase プロジェクトの Crashlytics を使用できますか?
さまざまな Apple プラットフォーム(iOS、tvOS、Mac Catalyst など)向けに構築されたアプリでも、1 つの Firebase プロジェクトで複数のアプリのクラッシュを報告できるようになりました。以前は、アプリに同じバンドル ID が含まれている場合であっても、アプリを個別の Firebase プロジェクトに分割する必要がありました。
Android のサポート
ANR が Android 11 以降でのみ報告されるのはなぜですか?
Crashlytics は、Android 11 以降を搭載したデバイスからの Android アプリの ANR レポートをサポートしています。ANR の収集に使用される基盤となる API(getHistoricalProcessExitReasons)は、SIGQUIT やウォッチドッグ ベースの方法よりも信頼性が高くなっています。この API は Android 11 以降のデバイスでのみ使用できます。
一部の ANR に BuildId がないのはなぜですか?
一部の ANR に BuildId がない場合は、次のようにトラブルシューティングを行ってください。
最新バージョンの Crashlytics Android SDK と Crashlytics Gradle プラグインを使用していることを確認します。
Android 11 ANR と一部の Android 12 ANR に
BuildIdがない場合は、古い SDK または古い Gradle プラグインを使用している可能性があります。これらの ANR のBuildIdを適切に収集するには、次のバージョンを使用する必要があります。- Crashlytics Android SDK v18.3.5 以降(Firebase BoM v31.2.2 以降)
- Crashlytics Gradle プラグイン v2.9.4 以降
共有ライブラリで標準以外の場所を使用していないか確認します。
アプリの共有ライブラリのみの
BuildIdがない場合は、共有ライブラリの標準のデフォルトの場所を使用していない可能性があります。その場合、Crashlytics は関連付けられているBuildIdを見つけられない可能性があります。共有ライブラリには標準の場所を使用することをおすすめします。ビルドプロセス中に
BuildIdがストリップされていないことを確認します。以下のトラブルシューティングのヒントは、ANR とネイティブ コード クラッシュのいずれに対しても有効です。
バイナリに対して
readelf -nを実行して、BuildIdが存在するかどうかを確認します。BuildIdが存在しない場合は、ビルドシステムのフラグに-Wl,--build-idを追加します。APK サイズを縮小する際に、誤って
BuildIdを削除していないことを確認します。ストリップされているライブラリ バージョンとストリップされていないライブラリ バージョンがある場合は、コードで正しいバージョンを参照するようにしてください。
Crashlytics ダッシュボードと Google Play Console での ANR レポートの違い
Google Play と Crashlytics の間で ANR の数の不一致が発生することがあります。これは、ANR データの収集と報告のメカニズムの違いによるものです。Crashlytics はアプリが次に起動したときに ANR を報告しますが、Android Vitals は ANR の発生後に ANR データを送信します。
また、Crashlytics は、Android 11 以降を搭載したデバイスで発生した ANR のみを表示します。一方、Google Play は、Google Play 開発者サービスとデータ収集への同意が承認されているデバイスからの ANR を表示します。
.kt ファイルからのクラッシュが .java の問題であると表示されるのはなぜですか?
ファイル拡張子を公開しないようにする難読化ツールをアプリで使用している場合、Crashlytics はデフォルトで各問題を .java ファイル拡張子のものとして生成します。
Crashlytics が正しいファイル拡張子で問題を生成できるようにするには、アプリで次の設定を使用してください。
- Android Gradle 4.2.0 以降を使用する
- R8 を使用して難読化をオンにする。アプリを更新して R8 を使用するには、こちらのドキュメントをご覧ください。
上記の設定に更新すると、既存の .java の問題と重複する新しい .kt の問題が表示されることがあります。その状況の詳細については、よくある質問をご覧ください。
既存の .java の問題と重複する .kt の問題が表示されるのはなぜですか?
2021 年 12 月中旬以降、Crashlytics は Kotlin を使用するアプリケーションのサポートを改善しました。
最近まで、利用可能な難読化ツールではファイル拡張子が公開されていなかったため、Crashlytics はデフォルトで .java ファイル拡張子を使用して各問題を生成していました。Android Gradle 4.2.0 以降では、R8 でファイル拡張子がサポートされています。
今回の更新で、Crashlytics はアプリで使用される各クラスが Kotlin で記述されているかどうかを判断し、問題の署名に正しいファイル名を設定できるようになりました。アプリが次の設定を使用している場合は、(状況に応じて)クラッシュが .kt ファイルのものであると正しく表示されるようになります。
- アプリで Android Gradle 4.2.0 以降を使用している。
- アプリで R8 を使用して難読化をオンにしている。
新しいクラッシュでは問題の署名に正しいファイル拡張子が含まれるため、.java のラベルが付けられた既存の問題と重複する新しい .kt の問題が表示されることがあります。Firebase コンソールでは、新しい .kt の問題が、.java のラベルが付けられた既存の問題と重複している可能性がある場合に、それを識別して通知することを試みています。
Dexguard でクラッシュが取得されない
以下の例外が表示される場合、Firebase Crashlytics SDK と互換性のないバージョンの DexGuard を使用している可能性があります。
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
この例外によってアプリがクラッシュすることはありませんが、クラッシュ レポートが送信されなくなります。この問題を解決する方法は以下のとおりです。
最新の DexGuard 8.x リリースを使用してください。最新バージョンには、Firebase Crashlytics SDK で必要なルールが含まれています。
DexGuard のバージョンを変更したくない場合は、DexGuard 構成ファイルの難読化ルールに次の行を追加してください。
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
Crashlytics Gradle プラグイン v3 にアップグレードするにはどうすればよいですか?
Crashlytics Gradle プラグインの最新リリースは、メジャー バージョン(v3.0.0)であり、Gradle と Android Gradle プラグインの下位バージョンのサポートを終了することで SDK をモダナイズしています。また、このリリースでの変更により、AGP v8.1 以降に関する問題が解決され、ネイティブ アプリとカスタマイズしたビルドのサポートが改善されています。
最小要件
Crashlytics Gradle プラグイン v3 の最小要件は以下のとおりです。
Android Gradle プラグイン 8.1 以降
Android Studio の最新バージョンで Android Gradle プラグイン Upgrade Assistant を使用してこのプラグインをアップグレードします。Firebase の
google-servicesGradle プラグイン 4.4.1 以降
プロジェクトの Gradle ビルドファイルで最新バージョンを次のように指定することで、このプラグインをアップグレードします。
Kotlin
plugins { id("com.android.application") version "8.1.4" apply false id("com.google.gms.google-services") version "4.4.4" apply false ... }
Groovy
plugins { id 'com.android.application' version '8.1.4' apply false id 'com.google.gms.google-services' version '4.4.4' apply false ... }
Crashlytics 拡張機能への変更
Crashlytics Gradle プラグインの v3 では、Crashlytics 拡張機能に次の大きな変更が加えられています。
defaultConfigAndroid ブロックから拡張機能を削除しました。代わりに、各バリアントを構成する必要があります。非推奨のフィールド
mappingFileを削除しました。代わりに、マージされたマッピング ファイルが自動的に提供されるようになりました。非推奨のフィールド
strippedNativeLibsDirを削除しました。代わりに、すべてのネイティブ ライブラリでunstrippedNativeLibsDirを使う必要があります。unstrippedNativeLibsDirを累積フィールドに変更しました。複数のディレクトリを使用した例を表示する
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("MY/NATIVE/LIBS") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS") } } } }
タスクはuploadCrashlyticsSymbolFilesBasicReleaseMY/NATIVE/LIBSのシンボルのみをアップロードしますが、 はuploadCrashlyticsSymbolFilesFeatureXReleaseMY/NATIVE/LIBSとMY/FEATURE_X/LIBSの両方のシンボルをアップロードします。クロージャ フィールド
symbolGeneratorを 2 つの新しいトップレベル フィールドに置き換えました。symbolGeneratorType。"breakpad"(デフォルト)または"csym"の文字列です。breakpadBinary。ローカルdump_symsバイナリのオーバーライドのファイル。
拡張機能をアップグレードする方法の例
Kotlin
| 変更前 |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGenerator( closureOf<SymbolGenerator> { symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } ) } } } |
| v3 を提供中 |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Groovy
| 変更前 |
buildTypes { release { firebaseCrashlytics { // ... symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } } |
| v3 を提供中 |
buildTypes { release { firebaseCrashlytics { // ... symbolGeneratorType "breakpad" breakpadBinary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Android NDK 固有のサポート
Crashlytics ダッシュボードと logcat の NDK スタック トレースの違い
LLVM ツールチェーンと GNU ツールチェーンはアプリのバイナリの読み取り専用セグメントに対するデフォルトの設定と処理方法がそれぞれ異なるため、Firebase コンソールで一貫性のないスタック トレースが生成される可能性があります。この問題を軽減するには、次のリンカーフラグをビルドプロセスに追加します。
LLVM ツールチェーンの
lldリンカーを使用している場合は、次のリンカーフラグを追加します。-Wl,--no-rosegmentGNU ツールチェーンの
ld.goldリンカーを使用している場合は、次のリンカーフラグを追加します。-Wl,--rosegment
スタック トレースの不整合がまだ発生している場合(またはどちらのフラグもお使いのツールチェーンに関連していない場合)は、代わりに次のリンカーフラグをビルドプロセスに追加してみてください。
-fno-omit-frame-pointerNDK に独自の Breakpad シンボル ファイル生成ツールのバイナリを使用するにはどうすればよいですか?
Crashlytics プラグインは、カスタマイズされた Breakpad シンボル ファイル生成ツールをバンドルします。Breakpad シンボル ファイルの生成に独自のバイナリを使用する場合は(たとえば、ビルドチェーン内のすべてのネイティブの実行可能ファイルをソースからビルドする場合)、オプションの symbolGeneratorBinary 拡張プロパティを使用して、実行可能ファイルへのパスを指定します。
次の 2 つの方法のいずれかで、Breakpad シンボル ファイル生成ツールのバイナリへのパスを指定できます。
オプション 1:
build.gradleファイルのfirebaseCrashlytics拡張機能を使用してパスを指定するアプリレベルの
build.gradle.ktsファイルに以下のコマンドを追加します。Gradle プラグイン v3.0.0 以降
android { buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true // Add these optional fields to specify the path to the executable symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } }
古いプラグイン バージョン
android { // ... buildTypes { // ... release { // ... firebaseCrashlytics { // existing; required for either symbol file generator nativeSymbolUploadEnabled true // Add this optional new block to specify the path to the executable symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } }
オプション 2: Gradle プロパティ ファイルでプロパティ行を介してパスを指定する
com.google.firebase.crashlytics.breakpadBinaryプロパティを使用して、実行可能ファイルのパスを指定できます。手動で Gradle プロパティ ファイルを更新することも、コマンドラインからファイルを更新することもできます。たとえば、コマンドラインでパスを指定するには、次のようなコマンドを使用します。
./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \ -Pcom.google.firebase.crashlytics.breakpadBinary=/PATH/TO/BREAKPAD/DUMP_SYMS \ app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
Crashlytics は armeabi をサポートしていますか?
Firebase Crashlytics NDK は ARMv5(armeabi)をサポートしていません。この ABI のサポートは NDK r17 で削除されました。
Unity のサポート
Crashlytics ダッシュボードに、Android アプリのシンボリケートされていないスタック トレースが表示される
Unity の IL2CPP を使用していて、シンボリケートされていないスタック トレースが表示される場合は、次の手順をお試しください。
Crashlytics Unity SDK の v8.6.1 以降を使用していることを確認します。
シンボル ファイルを生成してアップロードするための、Firebase CLI の
crashlytics:symbols:uploadコマンドが設定され、実行されていることを確認します。リリースビルドを作成するたびに、または Firebase コンソールでシンボリケートされたスタック トレースを表示するビルドを作成するたびに、この CLI コマンドを実行する必要があります。詳しくは、読み取り可能なクラッシュ レポートの取得をご覧ください。
Crashlytics は、IL2CPP を使用するアプリと併用できますか?
はい。Crashlytics は、IL2CPP を使用するアプリに対して、シンボリケートされたスタック トレースを表示できます。この機能は、Android プラットフォームまたは Apple プラットフォームでリリースされたアプリで使用できます。必要な手順は次のとおりです。
Crashlytics Unity SDK の v8.6.0 以降を使用していることを確認します。
お使いのプラットフォームで必要なタスクを完了します。
Apple プラットフォーム アプリの場合: 特別な操作は必要ありません。Apple プラットフォーム アプリの場合、Firebase Unity Editor プラグインが、シンボルをアップロードするように Xcode プロジェクトを自動的に構成します。
Android アプリの場合: シンボル ファイルを生成してアップロードするための、Firebase CLI
crashlytics:symbols:uploadコマンドが設定され、実行されていることを確認します。リリースビルドを作成するたびに、または Firebase コンソールでシンボリケートされたスタック トレースを表示するビルドを作成するたびに、この CLI コマンドを実行する必要があります。詳しくは、読み取り可能なクラッシュ レポートの取得をご覧ください。
キャッチされなかった例外を致命的として報告する
Crashlytics では、キャッチされなかった例外を致命的として報告できます(Unity SDK の v10.4.0 以降)。次のよくある質問では、この機能を使用する理由とベスト プラクティスについて説明します。
キャッチされなかった例外をアプリが致命的として報告するのはなぜですか?
キャッチされなかった例外を致命的として報告することで、アプリが引き続き実行されている場合でも、例外が発生すればゲームをプレイできなくなる可能性があることをよりリアルに示すことができます。
致命的エラーの報告を開始すると、クラッシュの影響を受けていないユーザー(CFU)の割合は減少する可能性がありますが、CFU 指標はアプリによるエンドユーザー エクスペリエンスの影響を適切に反映したものになります。
どのような例外が致命的として報告されますか?
キャッチされなかった例外を Crashlytics が致命的な例外として報告するには、次の 2 つの条件が両方とも満たされている必要があります。
アプリの初期化時に、
ReportUncaughtExceptionsAsFatalプロパティをtrueに設定する必要があります。アプリ(または付属のライブラリ)が、キャッチされていない例外をスローしました。作成された後にスローされなかった例外は、キャッチされなかった例外とは見なされません。
キャッチされなかった例外を致命的として報告できるようになった後に、多くの新しい致命的な問題が発生するようになりました。このような例外を適切に処理するにはどうすればよいですか?
キャッチされなかった例外が致命的として報告されるようになった場合、これらのキャッチされなかった例外を処理する方法は、次のとおりです。
スローされた例外をキャッチして処理する
例外は、予期しない状態または例外的な状態を反映するために作成され、スローされます。スローされた例外によって反映される問題を解決するには、プログラムを既知の状態に戻します(このプロセスは例外処理と呼ばれます)。
プログラムを既知の状態に戻せない場合を除き、予測されるすべての例外をキャッチして処理することをおすすめします。
キャッチするコードの種類と、キャッチした例外の処理に使用するコードを制御するには、例外を生成する可能性があるコードを try-catch ブロック内にラップします。特定の例外を適切に処理できるように、catch ステートメントの条件をできるだけ絞り込んでください。
Unity または Crashlytics で例外をログに記録する
Unity または Crashlytics で例外を記録して問題のデバッグに役立てるには、複数の方法があります。
Crashlytics を使用する際の最も一般的な推奨オプションを 2 つ紹介します。
オプション 1: Unity コンソールに出力するものの、開発中またはトラブルシューティング中は Crashlytics に報告しない
- 例外の内容を Unity コンソールに出力する
Debug.Log(exception)、Debug.LogWarning(exception)、Debug.LogError(exception)を使用して Unity コンソールに出力しますが、例外を再スローしません。
- 例外の内容を Unity コンソールに出力する
オプション 2: 次の状況の場合は、Crashlytics にアップロードして、Crashlytics ダッシュボードに統合レポートを表示する:
- 例外をロギングして、その後発生する可能性のある Crashlytics イベントをデバッグすることが有益である場合は、
Crashlytics.Log(exception.ToString())を使用します。 - 例外をキャッチして処理した後も、Crashlytics に報告する必要がある場合は、
Crashlytics.LogException(exception)を使用して、致命的でないイベントとしてログに記録します。
- 例外をロギングして、その後発生する可能性のある Crashlytics イベントをデバッグすることが有益である場合は、
ただし、致命的なイベントを Unity Cloud Diagnostics に手動で報告する場合は、Debug.LogException を使用できます。このオプションでは、オプション 1 のように Unity コンソールに例外が出力されますが、(すでにスローされているのか、またはキャッチされているのかに関係なく)例外もスローされます。ローカル以外の場所でエラーをスローします。つまり、Debug.LogException(exception) を try-catch ブロックで囲んだ場合でも、キャッチされない例外は発生します。
したがって、次のすべての操作を行う場合にのみ、Debug.LogException を呼び出します。
- Unity コンソールに例外を出力する
- 例外を致命的なイベントとして Crashlytics にアップロードする。
- 例外をスローし、キャッチされなかった例外として処理し、Unity Cloud Diagnostics に報告する。
キャッチされた例外を Unity コンソールに出力し、 Crashlytics に致命的でないイベントとしてアップロードする場合は、代わりに次の手順を行います。
try
{
methodThatThrowsMyCustomExceptionType();
}
catch(MyCustomExceptionType exception)
{
// Print the exception to the Unity console at the error level.
Debug.LogError(exception);
// Upload the exception to Crashlytics as a non-fatal event.
Crashlytics.LogException(exception); // not Debug.LogException
//
// Code that handles the exception
//
}
統合のサポート
アプリで Google Mobile Ads SDK も使用しているが、クラッシュが取得されない
プロジェクトで Google Mobile Ads SDK と Crashlytics を併用している場合は、例外ハンドラの登録時にクラッシュ レポート機能が干渉している可能性があります。この問題を解決するには、disableSDKCrashReporting を呼び出して Mobile Ads SDK でクラッシュ レポート機能をオフにしてください。
BigQuery データセットはどこに配置されますか?
Firebase は、BigQuery へのデータ エクスポートを設定したときに選択したデータセットのロケーションにデータをエクスポートします。
このロケーションは、Crashlytics データセットと Firebase セッション データセットの両方に適用されます(セッション データのエクスポートが有効になっている場合)。
このロケーションは、BigQuery にエクスポートされたデータにのみ適用されます。Firebase コンソールの Crashlytics ダッシュボードや Android Studio で使用するために保存されたデータのロケーションには影響しません。
データセットの作成後にロケーションを変更することはできませんが、データセットを別のロケーションにコピーするか、手動で移動(再作成)することはできます。詳細については、既存のエクスポートのロケーションを変更するをご覧ください。
BigQuery の新しいエクスポート インフラストラクチャにアップグレードするにはどうすればよいですか?
2024 年 10 月中旬に、Crashlytics は Crashlytics データを BigQuery にバッチ エクスポートするための新しいインフラストラクチャをリリースしました。
2024 年 10 月より後にバッチ エクスポートを有効にした場合、Firebase プロジェクトでは新しいエクスポート インフラストラクチャが自動的に使用されます。必要な対応はありません。
2024 年 10 月より前またはその期間中にバッチ エクスポートを有効にした場合は、この FAQ の情報を確認して、対応が必要かどうかを判断してください。
すべての Firebase プロジェクトは、2026 年 1 月 9 日までに新しいバッチ エクスポート インフラストラクチャに自動的にアップグレードされます。この日付より前にアップグレードできますが、BigQuery バッチテーブルがアップグレードの前提条件を満たしていることを確認してください。
新しいインフラストラクチャにアップグレードできますが、BigQuery バッチテーブルがアップグレードの前提条件を満たしていることを確認してください。
新しいインフラストラクチャを使用しているかどうかを確認する
2024 年 10 月中旬以降にバッチ エクスポートを有効にした場合、Firebase プロジェクトでは新しいエクスポート インフラストラクチャが自動的に使用されます。
プロジェクトで使用されているインフラストラクチャを確認するには、Google Cloud コンソールに移動します。「データ転送構成」に Firebase Crashlytics with Multi-Region Support というラベルが付いている場合、プロジェクトで新しいエクスポート インフラストラクチャが使用されています。
以前のエクスポート インフラストラクチャと新しいエクスポート インフラストラクチャの重要な違い
この新しいインフラストラクチャは、米国以外の Crashlytics データセットのロケーションをサポートしています。
2024 年 10 月中旬以前にエクスポートを有効にし、新しいエクスポート インフラストラクチャにアップグレード済み - 必要に応じてデータ エクスポートのロケーションを変更できるようになりました。
2024 年 10 月中旬以降にエクスポートを有効にした - セットアップ時に、データ エクスポートのロケーションを選択するよう求められました。
新しいインフラストラクチャでは、エクスポートを有効にする前のデータのバックフィルをサポートしていません。
以前のインフラストラクチャでは、エクスポートを有効にした日付の 30 日前までバックフィルが可能でした。
新しいインフラストラクチャは、過去 30 日間または、BigQuery へのエクスポートを有効にした最新の日付まで(どちらか最新のほう)のバックフィルをサポートしています。
新しいインフラストラクチャでは、Firebase プロジェクト内の Firebase アプリに設定されている ID を使用して BigQuery バッチテーブルに名前が付けられます。
以前のインフラストラクチャでは、アプリのバイナリ内のバンドル ID またはパッケージ名に基づいて名前が付けられたバッチテーブルにデータが書き込まれていました。
新しいインフラストラクチャでは、Firebase プロジェクトに登録されている Firebase アプリに設定されているバンドル ID またはパッケージ名に基づいて名前が付けられたバッチテーブルにデータが書き込まれます。
ステップ 1: アップグレードの前提条件
既存の BigQuery バッチテーブルで、Firebase プロジェクトに登録されている Firebase アプリに設定されているバンドル ID またはパッケージ名と一致する ID が使用されていることを確認します。一致しない場合は、エクスポートされたバッチデータで中断が発生する可能性があります。ほとんどのプロジェクトは適切で互換性のある状態ですが、アップグレードする前に確認することが重要です。
Firebase プロジェクトに登録されているすべての Firebase アプリは、Firebase コンソールで確認できます。settings [プロジェクト設定] に移動し、[マイアプリ] カードまでスクロールして、すべての Firebase アプリとその情報を表示します。
BigQuery バッチテーブルはすべて、Google Cloud コンソールの BigQuery ページで確認できます。
たとえば、アップグレードで問題が発生しない理想的な状態は次のとおりです。
com_yourcompany_yourproject_IOSという名前のバッチテーブルと、バンドル IDcom.yourcompany.yourprojectの Firebase iOS+ アプリが Firebase プロジェクトに登録されている。com_yourcompany_yourproject_ANDROIDという名前のバッチテーブルと、パッケージ名com.yourcompany.yourprojectの Firebase Android アプリが Firebase プロジェクトに登録されている。
登録済みの Firebase アプリに設定されている ID と一致しないバッチテーブル名がある場合は、手動でアップグレードする前、または 2026 年 1 月 9 日より前に、このページの後半の手順に沿ってバッチ エクスポートの中断を回避してください。
ステップ 2: 新しいインフラストラクチャにアップグレードする方法
2024 年 10 月中旬より前にバッチ エクスポートを有効にした場合は、Firebase コンソールで Crashlytics データ エクスポートをオフにしてからオンに戻すだけで、新しいインフラストラクチャに手動でアップグレードできます。
詳しい手順は次のとおりです。
Firebase コンソールで、[統合] ページに移動します。
[BigQuery] カードで [管理] をクリックします。
Crashlytics のスライダーをオフに切り替えて、エクスポートを無効にします。プロンプトが表示されたら、データ エクスポートの停止を確定します。
すぐに Crashlytics スライダーを再度オンに切り替えて、エクスポートを再度有効にします。プロンプトが表示されたら、データのエクスポートを確定します。
これで、BigQuery への Crashlytics データ エクスポートで、新しいエクスポート インフラストラクチャが使用されるようになりました。
既存のバッチテーブル名が Firebase アプリ ID と一致しない
既存のバッチテーブル名が、登録済みの Firebase アプリに設定されているバンドル ID またはパッケージ名と一致しない場合は、このセクションを開き、エクスポートされたバッチデータの中断を回避するためのオプションのいずれかを実装してください。
このような状態の既存の BigQuery バッチテーブルがある場合、Firebase の新しいバッチ エクスポート トゥ BigQuery インフラストラクチャと互換性がありません。すべての Firebase プロジェクトは、2026 年 1 月 9 日までに新しいエクスポート インフラストラクチャに自動的に移行されます。
手動でアップグレードする前、または 2026 年 1 月 9 日までに、このセクションのガイダンスに沿って操作して、Crashlytics データの BigQuery へのバッチ エクスポートの中断を回避してください。
エクスポート インフラストラクチャが識別子を使用して、BigQuery テーブルにデータを書き込む方法を理解する
これらのエクスポート インフラストラクチャが Crashlytics データを BigQuery バッチテーブルに書き込む方法は次のとおりです。
以前のエクスポート インフラストラクチャ: アプリのバイナリ内のバンドル ID またはパッケージ名に基づく名前が付けられたテーブルにデータを書き込みます。
新しいエクスポート インフラストラクチャ: Firebase プロジェクトに登録されている Firebase アプリに設定されているバンドル ID またはパッケージ名に基づいて名前が付けられたテーブルにデータを書き込みます。
残念ながら、アプリのバイナリ内のバンドル ID またはパッケージ名が、Firebase プロジェクトに登録されている Firebase アプリに設定されているバンドル ID またはパッケージ名と一致しないことがあります。これは通常、アプリの登録時に実際の ID が入力されなかった場合に発生します。
アップグレード前にこの問題を修正しなかった場合はどうなりますか?
これらの 2 つのロケーションの ID が一致しない場合、新しいエクスポート インフラストラクチャにアップグレードすると、次のようになります。
Crashlytics データの新しい BigQuery バッチテーブルへの書き込みが開始されます。これは、Firebase プロジェクトに登録されている Firebase アプリに設定されているバンドル ID またはパッケージ名に基づいて名前が付けられた新しいテーブルです。
アプリのバイナリ内の ID に基づく名前が付けられた既存の「以前の」テーブルには、データが書き込まれなくなります。
ID の不一致のシナリオの例
BigQuery バッチテーブル名には、アプリのプラットフォームを示す _IOS または _ANDROID が自動的に付加されます。
| アプリのバイナリ内の ID | Firebase アプリに設定された ID | 従来の動作 | 新しいエクスポート インフラストラクチャに アップグレードした後の動作 |
解決策 |
|---|---|---|---|---|
foo |
bar |
アプリのバイナリ(foo)内の ID の名前が付けられた単一のテーブルに書き込みます。 |
Firebase アプリに設定された ID(bar)の名前が付けられた単一のテーブルを作成し、そのテーブルに書き込みます。 |
以下で説明するオプション 1 または 2 を実装します。 |
foo |
bar、qux、など。 |
アプリのバイナリ(foo)内の ID の名前が付けられた単一のテーブルに書き込みます。 |
Firebase アプリに設定された ID(bar、qux など)の名前が付けられたテーブルを作成* し、複数のテーブルに書き込みます。
|
以下で説明するオプション 2 を実装します。 |
foo、baz、など。 |
bar |
アプリのバイナリ内の複数の ID(foo、baz など)の名前が付けられた複数のテーブルに書き込みます。 |
すべてのアプリのデータを作成** し、Firebase アプリに設定された ID(bar)の名前が付けられた単一のテーブルに書き込みます。 |
どのオプションも実装できません。
データとともにエクスポートされるアプリの |
* アプリのバイナリ内の ID が Firebase アプリに設定されている ID のいずれかと一致する場合、新しいエクスポート インフラストラクチャにはその ID の新しいテーブルは作成されません。代わりに、その特定のアプリのデータは引き続きそのテーブルに書き込まれます。他のすべてのアプリは新しいテーブルに書き込まれます。
** アプリのバイナリ内の ID のいずれかが Firebase アプリに設定された ID と一致する場合、新しいエクスポート インフラストラクチャでは新しいテーブルは作成されません。代わりに、そのテーブルは維持され、すべてのアプリのデータがそのテーブルに書き込まれます。
中断を回避するオプション
サービスが中断されないようにするには、手動でアップグレードする前、または 2026 年 1 月 9 日より前に、以下のいずれかのオプションの手順に沿って対応してください。
オプション 1:
新しいエクスポート インフラストラクチャによって作成された新しいテーブルを使用します。 既存のテーブルから新しいテーブルにデータをコピーします。Firebase コンソールで、リンク済みアプリのエクスポートをオフにしてからオンに戻すことで、新しいエクスポート インフラストラクチャにアップグレードします。
このアクションにより、Firebase プロジェクトに登録されている Firebase アプリに設定されているバンドル ID またはパッケージ名に基づいて名前が付けられた新しいバッチテーブルが作成されます。
Google Cloud コンソールで、作成した新しいテーブルに以前のテーブルからすべてのデータをコピーします。
バッチテーブルに依存するダウンストリームの依存関係がある場合は、新しいテーブルを使用するように変更します。
オプション 2:
引き続き、既存のテーブルに書き込みます。これを行うには、BigQuery 構成で一部のデフォルトをオーバーライドします。Firebase コンソールで、バッチテーブル名と ID が一致しないアプリの Firebase アプリ ID(
1:1234567890:ios:321abc456def7890など)を見つけてメモします。
settings [プロジェクト設定] に移動し、[マイアプリ] カードまで移動して、すべての Firebase アプリとその情報を表示します。Firebase コンソールで、リンク済みアプリのエクスポートをオフにしてからオンに戻すことで、新しいエクスポート インフラストラクチャにアップグレードします。
この操作は次の 2 つの処理を行います。
Firebase プロジェクトに登録されている Firebase アプリに設定されているバンドル ID またはパッケージ名に基づいて名前が付けられた新しいバッチテーブルが作成されます。(このテーブルは最終的に削除しますが、まだ削除しないでください)。
ソース
Firebase Crashlytics with Multi-Region Supportを使用して BigQuery「データ転送構成」を作成します。
Google Cloud コンソールで、既存のテーブルへのデータの書き込みが継続されるように、新しい「データ転送構成」を変更します。
[BigQuery] > [データ転送] に移動して、「データ転送構成」を表示します。
ソース
Firebase Crashlytics with Multi-Region Supportを含む構成を選択します。右上の [編集] をクリックします。
[データソースの詳細] セクションで、gmp_app_id のリストと client_namespace のリストを見つけます。
BigQuery では、Firebase アプリ ID は
gmp_app_idと呼ばれます。 デフォルトでは、BigQuery のclient_namespace値はアプリの対応する一意のバンドル ID / パッケージ名ですが、このデフォルト構成はオーバーライドされます。BigQuery は、リンクされた各 Firebase アプリが書き込むバッチテーブルの名前として
client_namespace値を使用します。デフォルト設定をオーバーライドする Firebase アプリの gmp_app_id を見つけます。client_namespace の値を、Firebase アプリが書き込むテーブルの名前に変更します(通常、これは、アプリが以前のエクスポート インフラストラクチャで書き込んでいた以前のテーブルの名前です)。
構成の変更を保存します。
既存のテーブルにデータが欠落している日のバックフィルをスケジュールを設定します。
バックフィルが完了したら、新しいエクスポート インフラストラクチャによって自動的に作成された新しいテーブルを削除します。