使用 Firebase Crashlytics 記錄廣告回應 ID

Firebase Crashlytics 是一款輕量級的即時當機回報工具,可讓您輕鬆管理應用程式中的穩定性問題。Crashlytics 會自動將異常終止事件分組,並突顯導致異常終止的情況,協助您節省排解問題的時間。

本指南說明如何將 Crashlytics 整合至 Android Studio 專案,以便記錄廣告回應 ID。日後,當您要排解應用程式異常終止問題時,可以查詢廣告回應 ID,並使用 AdMob 中的廣告審核中心,找出並封鎖廣告。

步驟 1:將 Firebase 新增至 Android 應用程式

  1. 如果您想嘗試透過 Firebase 從乾淨的應用程式記錄資料,可以前往 GitHub 下載或複製 Android 版 Google Mobile Ads SDK 範例存放區。本指南特別使用 橫幅範例

    如果您已有應用程式,應該可以繼續執行其他步驟,並使用應用程式的套件名稱。您也可以將相同步驟套用至存放區中的其他範例,並進行一些微調。

  2. 如要使用 Firebase Crashlytics,您必須建立 Firebase 專案,並將應用程式新增至該專案。如果您尚未建立 Firebase 專案,請先建立。請務必將應用程式註冊至該服務。

    1. 在 Firebase 控制台的 Crashlytics 頁面中,按一下「設定 Crashlytics」

    2. 在隨即顯示的畫面中,依序按一下「否」 >「設定新的 Firebase 應用程式」

  3. 在 build.gradle 中新增 Google Analytics、Fabric 和 Crashlytics 的依附元件。

    app/build.gradle

    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    // Add the Fabric plugin
    apply plugin: 'io.fabric'
    
    dependencies {
        // ...
    
        // Add the Google Mobile Ads SDK
        implementation 'com.google.android.gms:play-services-ads:23.5.0'
    
        // Add the Firebase Crashlytics dependency.
        implementation 'com.google.firebase:firebase-crashlytics:19.2.1'
    }
    

    project/build.gradle

    buildscript {
        repositories {
            // ...
            // Add Google's Maven repository.
            google()
        }
    
        dependencies {
            // ...
    
            classpath 'com.google.gms:google-services:4.4.2'
    
            // Add the Fabric Crashlytics plugin.
            classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2'
        }
    }
    
    allprojects {
        // ...
        repositories {
           // Check that Google's Maven repository is included (if not, add it).
           google()
    
           // ...
        }
    }
    
  4. 建構並執行應用程式,確保 Crashlytics 設定正確無誤。成功後,您就能存取 Crashlytics 資訊主頁。

(選用):測試設定

新增當機按鈕後,您可以強制當機,讓每次按下按鈕都導致應用程式當機。

以下範例說明如何在 ActivityonCreate() 方法中新增當機按鈕:

MainActivity (節錄)

Java

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_my);

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view);

  // Start loading the ad in the background.
  adView.loadAd(new AdRequest.Builder().build());

  // Add a crash button.
  Button crashButton = new Button(this);
  crashButton.setText("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));
}

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_my)

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view)

  // Start loading the ad in the background.
  adView.loadAd(AdRequest.Builder().build())

  // Add a crash button.
  val crashButton = Button(this)
  crashButton.text = "Crash!"
  crashButton.setOnClickListener {
    throw RuntimeException("Test Crash") // Force a crash
  }

  addContentView(crashButton, ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT,
      ViewGroup.LayoutParams.WRAP_CONTENT))
}

在 Android Studio 中,在模擬器或已連結的裝置上建構並執行應用程式。應用程式載入後,您可以按一下「Crash」按鈕。從裝置或 Android Studio 重新啟動應用程式,讓當機記錄上傳至 Crashlytics。

步驟 2:記錄廣告回應 ID

如果您載入多個廣告並在不同時間顯示,建議您使用不同的鍵記錄每個廣告回應 ID。舉例來說,本指南使用的範例只有一個橫幅廣告。因此,我們會在以下程式碼片段中,將廣告回應 ID 記錄為 banner_ad_response_id 鍵。事實上,您可以在 Firebase Crashlytics 中為不同的廣告類型和廣告事件建立多個自訂鍵 / 值組 (請參閱 AdListener 瞭解廣告的生命週期)。如要進一步瞭解自訂記錄,請參閱「自訂 Firebase Crashlytics 當機報告」。

將下列程式碼新增至 MyActivity.java。基本上,它會在 onAdLoaded() 回呼函式中使用 FirebaseCrashlytics.setCustomKey() 函式,確保在嘗試呼叫 getResponseInfo() 之前已載入廣告。

Java

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_my);

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view);

  adView.setAdListener(new AdListener() {
    @Override
    public void onAdLoaded() {
      String adResponseId = adView.getResponseInfo().getResponseId();
      FirebaseCrashlytics.getInstance().setCustomKey(
          "banner_ad_response_id", adResponseId);
    }
  });

  // Start loading the ad in the background.
  adView.loadAd(new AdRequest.Builder().build());

  // Add a crash button.
  Button crashButton = new Button(this);
  crashButton.setText("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));
}

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_my)

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view)

  adView.adListener = object : AdListener() {
    override fun onAdLoaded() {
      mAdView.responseInfo?.responseId?.let { adResponseId ->
          FirebaseCrashlytics.getInstance().setCustomKey(
              "banner_ad_response_id", adResponseId)
      }
    }
  }

  // Start loading the ad in the background.
  adView.loadAd(AdRequest.Builder().build())

  // Add a crash button.
  val crashButton = Button(this)
  crashButton.text = "Crash!"
  crashButton.setOnClickListener {
    throw RuntimeException("Test Crash") // Force a crash
  }

  addContentView(crashButton, ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT,
      ViewGroup.LayoutParams.WRAP_CONTENT))
}

恭喜!您現在會在 Crashlytics 資訊主頁的當機工作階段「鍵」部分中,看到最近的 banner_ad_response_id。請注意,部分鍵最多可能需要 1 小時才會顯示在資訊主頁中。