使用 Firebase Crashlytics 记录广告响应 ID

Firebase Crashlytics 是一款轻量级的实时崩溃报告解决方案,可让您轻松管理应用中的稳定性问题。Crashlytics 会对崩溃问题进行智能分组并突出显示导致崩溃的情况,从而为您节省问题排查的时间。

本指南介绍了如何将 Crashlytics 集成到您的 Android Studio 项目,以便您记录广告响应 ID。稍后,在排查应用中的崩溃问题时,您可以查找广告响应 ID,并使用 Ad Manager 中的广告审核中心来查找和屏蔽广告。

第 1 步:将 Firebase 添加到 Android 应用

  1. 如果您想尝试在干净的应用中使用 Firebase 记录日志,可以在 GitHub 上下载或克隆适用于 Android 代码库的 Google 移动广告 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:22.4.0'
    
        // Add the Firebase Crashlytics dependency.
        implementation 'com.google.firebase:firebase-crashlytics:18.4.1'
    }
    

    project/build.gradle

    buildscript {
        repositories {
            // ...
            // Add Google's Maven repository.
            google()
        }
    
        dependencies {
            // ...
    
            classpath 'com.google.gms:google-services:4.3.15'
    
            // Add the Fabric Crashlytics plugin.
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
        }
    }
    
    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 AdManagerAdRequest.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(AdManagerAdRequest.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 中,在模拟器或已连接的设备上构建并运行您的应用。 加载应用后,您可以点击崩溃按钮。从设备或 Android Studio 中重新启动应用,以便将崩溃日志上传到 Crashlyics。

第 2 步:记录广告响应 ID

如果要加载多个广告并在不同时间展示,最好使用单独的键记录每个广告响应 ID。例如,本指南使用的示例只包含一个横幅广告。因此,我们会在以下代码段中以 banner_ad_response_id 键的形式记录广告响应 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 AdManagerAdRequest.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(AdManagerAdRequest.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 小时才会显示在信息中心内。