Firebase スイートには、アプリが陥っている可能性のある問題について、明確で実用的なインサイトやレポートを得ることができるモジュールがあります。これは、ユーザーにとって重要なプロダクションアプリを構築している場合には特に強力です。ログファイルの調査に1秒でも多くの時間を費やすことは、ユーザーの不満や収益の損失につながります。
Firebase Crashlytics は、軽量でリアルタイムなクラッシュレポーターであり、アプリの品質を低下させる安定性の問題を追跡し、優先順位をつけて修正するのに役立ちます。クラッシュをインテリジェントにグループ化し、クラッシュに至るまでの状況をハイライト表示することで、トラブルシューティングの時間を短縮します。
特定のクラッシュが多くのユーザーに影響を与えているかどうかを知ることができます。問題が突然深刻さを増したときにはアラートを受け取ることができ、クラッシュの原因となっているコードの行をピンポイントで特定することもできます。
主な機能は以下の通りです。
- クラッシュレポートを収集し、コンテキスト情報を提供するとともに、クラッシュの重大性と普及率を強調します。
-
- 「Crashlytics」は、一般的な安定性の問題を強調し、トラブルシューティング、トリアージ、解決を容易にするリソースを提供する有用なヒントである「Crash Insights」を提供します。
- Analytics」との統合
- リアルタイムのアラート機能
それでは、Crashlytics
の設定と使用方法について説明します。
Step 1: Firebase
をプロジェクトに追加する
Crashlytics は firebase 製品群の 1 つであるため、プロジェクトに firebase を追加する必要があります。その方法については、こちらで詳しく説明しています。
ステップ 2: Firebase Console
で Crashlytics
を有効にします。
-
MARKDOWN_HASH6c036a1311e0bb4621e83faa6761efa3MARKDOWNHASH
の [Crashlytics dashboard](https://console.firebase.google.com/project//crashlytics)にアクセスします。 - ページ上部のCrashlyticsの隣にあるドロップダウンから自分のアプリが選択されていることを確認します。
-
Enable
Crashlytics
をクリックします。
ステップ3:Firebase Crashlyticsプラグインをアプリに追加します。
この作業は、projects/build.gradle
ファイルで行います。以下のコードを参考にしてください。
buildscript {
repositories {
// Check that you have Google's Maven repository (if not, add it).
google()
}
dependencies {
// ...
// Check that you have the Google services Gradle plugin v4.3.2 or later
// (if not, add it).
classpath 'com.google.gms:google-services:4.3.10'
// Add the Crashlytics Gradle plugin
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
}
}
allprojects {
repositories {
// Check that you have Google's Maven repository (if not, add it).
google()
}
}
その後、app/build.gradle
に移動して、ファイルの一番上にあるcrashlyticsプラグインを適用します。
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // Google services Gradle plugin
// Apply the Crashlytics Gradle plugin
apply plugin: 'com.google.firebase.crashlytics'
Step 4: 依存関係の追加
アプリにFirebase Crashlytics SDKを追加します。これは、app/build.gradle
ファイルのdependencies
クロージャ内で行います。
Kotlinプロジェクトの場合。
dependencies {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:28.4.1')
// Declare the dependencies for the Crashlytics and Analytics libraries
// 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-analytics-ktx'
}
Javaプロジェクトの場合。
dependencies {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:28.4.1')
// Declare the dependencies for the Crashlytics and Analytics libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.firebase:firebase-analytics'
}
ステップ 5: テストの実行
そう、Crashlytics
の設定を終えるためには、強制的にテストを行う必要があります。これは、Crashlytics
のダッシュボードで結果を見るために、意図的にクラッシュを起こさせることを意味します。
例えば、アプリにボタンを追加して、クリックされるとアプリをクラッシュさせることができます。以下にコード例を示します。
Kotlinの場合。
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));
アプリを実行します。ボタンを押すと、アプリがクラッシュします。テストのクラッシュを確認するには、MARKDOWN_HASH6c036a1311e0bb4621e83faa6761efa3MARKDOWNHASH
の[Crashlytics dashboard](https://console.firebase.google.com/project//crashlytics)に移動してください。
以上でテストは終了です。
それでは、いくつかの簡単な例を見てみましょう。
例 1: Firebase Crashlytics
の例 - Kotlin と Java
これはシンプルな Firebase
の Crashlytics の例です。2つの activities
があり、1つは Kotlin で、もう1つは Java で書かれています。
Step 1: プロジェクトへの Firebase
の追加
こちら](https://camposha.info/android-examples/add-firebase-to-android/)にあるように、Firebase
をプロジェクトに追加します。
ステップ2: 依存関係の追加
プロジェクトに依存関係を追加する必要があります。ここでは、Crashlytics
の依存関係を追加します。app/build.gradle`に以下のように依存関係を追加します。
dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.firebase:firebase-crashlytics:18.2.0'
implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.0'
// For an optimal experience using Crashlytics, add the Firebase SDK
// for Google Analytics. This is recommended, but not required.
implementation 'com.google.firebase:firebase-analytics:19.0.0'
}
ステップ 3: インターネットアクセス権の追加
Firebase に接続するためには、インターネットパーミッションが必要です。AndroidManifest.xml
ファイルに以下のパーミッションを追加します。
<uses-permission android:name="android.permission.INTERNET"/>
Step 4: レイアウトの作成
このレイアウトは本当に必要ありません。使うこともありません。しかし、プロジェクト内のすべてのコードを示すために、ここに記載します。
activity_main.xml
。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</RelativeLayout>
Step 5: コードを書く
ここでは、Kotlin と Java の両方のコードを書きます。ここでは、Kotlinのメインとなるactivity
を紹介します。
MainActivity.kt
<!
import android.os.Bundle
import android.view.ViewGroup
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.crashlytics.ktx.crashlytics
import com.google.firebase.crashlytics.ktx.setCustomKeys
import com.google.firebase.ktx.Firebase
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
fun setKeysBasic() {
// [START crash_set_keys_basic]
val crashlytics = Firebase.crashlytics
crashlytics.setCustomKeys {
key("my_string_key", "foo") // String value
key("my_bool_key", true) // boolean value
key("my_double_key", 1.0) // double value
key("my_float_key", 1.0f) // float value
key("my_int_key", 1) // int value
}
// [END crash_set_keys_basic]
}
fun resetKey() {
// [START crash_re_set_key]
val crashlytics = Firebase.crashlytics
crashlytics.setCustomKeys {
key("current_level", 3)
key("last_UI_action", "logged_in")
}
// [END crash_re_set_key]
}
fun logReportAndPrint() {
// [START crash_log_report_and_print]
Firebase.crashlytics.log("message")
// [END crash_log_report_and_print]
}
fun logReportOnly() {
// [START crash_log_report_only]
Firebase.crashlytics.log("message")
// [END crash_log_report_only]
}
fun enableAtRuntime() {
// [START crash_enable_at_runtime]
Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)
// [END crash_enable_at_runtime]
}
fun setUserId() {
// [START crash_set_user_id]
Firebase.crashlytics.setUserId("user123456789")
// [END crash_set_user_id]
}
@Throws(Exception::class)
fun methodThatThrows() {
throw Exception()
}
fun logCaughtEx() {
// [START crash_log_caught_ex]
try {
methodThatThrows()
} catch (e: Exception) {
Firebase.crashlytics.recordException(e)
// handle your exception here
}
// [END crash_log_caught_ex]
}
fun forceACrash() {
// [START crash_force_crash]
val crashButton = Button(this)
crashButton.text = "Crash!"
crashButton.setOnClickListener {
throw RuntimeException() // Force a crash
}
addContentView(crashButton, ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT))
// [END crash_force_crash]
}
}
そして、これがJava用のコードです。
MainActivity.java
です。
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void setKeysBasic() {
// [START crash_set_keys_basic]
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.setCustomKey("my_string_key", "foo" /* string value */);
crashlytics.setCustomKey("my_bool_key", true /* boolean value */);
crashlytics.setCustomKey("my_double_key", 1.0 /* double value */);
crashlytics.setCustomKey("my_float_key", 1.0f /* float value */);
crashlytics.setCustomKey("my_int_key", 1 /* int value */);
// [END crash_set_keys_basic]
}
public void resetKey() {
// [START crash_re_set_key]
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.setCustomKey("current_level", 3);
crashlytics.setCustomKey("last_UI_action", "logged_in");
// [END crash_re_set_key]
}
public void logReportAndPrint() {
// [START crash_log_report_and_print]
FirebaseCrashlytics.getInstance().log("message");
// [END crash_log_report_and_print]
}
public void logReportOnly() {
// [START crash_log_report_only]
FirebaseCrashlytics.getInstance().log("message");
// [END crash_log_report_only]
}
public void enableAtRuntime() {
// [START crash_enable_at_runtime]
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
// [END crash_enable_at_runtime]
}
public void setUserId() {
// [START crash_set_user_id]
FirebaseCrashlytics.getInstance().setUserId("user123456789");
// [END crash_set_user_id]
}
public void methodThatThrows() throws Exception {
throw new Exception();
}
public void logCaughtEx() {
// [START crash_log_caught_ex]
try {
methodThatThrows();
} catch (Exception e) {
FirebaseCrashlytics.getInstance().recordException(e);
// handle your exception here
}
// [END crash_log_caught_ex]
}
public void forceACrash() {
// [START crash_force_crash]
Button crashButton = new Button(this);
crashButton.setText("Crash!");
crashButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
throw new RuntimeException(); // Force a crash
}
});
addContentView(crashButton, new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
// [END crash_force_crash]
}
}
以上で完成です。
ダウンロード
プロジェクトのダウンロードは以下の通りです。
番号 | リンク |
---|---|
1.ダウンロードコード](https://downgit.github.io/#/home?url=https://github.com/firebase/snippets-android/tree/8184cba2c4/crashlytics) |