1. 简介
广告是应用整体用户体验的重要组成部分。良好的广告实现有助于提升应用的整体体验,甚至提高用户留存率和互动度。例如,通过激励广告,您可以向观看视频广告的用户奖励应用内货币或商品,这样一来,用户就可以达到新的高度,而如果未观看广告,他们可能会卡在某个位置,最终流失。
不过,打造出色的广告体验并非易事。您可能想知道:这些广告的展示频率应为多少?您应该在哪些位置和时间展示这些广告?奖品应该是什么?遗憾的是,答案因应用和展示位置而异。没有一种答案能够适用于所有情况。
借助 Google Analytics for Firebase、AdMob 以及 Firebase 提供的其他几款功能强大且易于使用的工具,您可以更轻松、更顺畅地以数据为依据对应用进行微调。今天,我们将向您展示如何开始使用!
构建内容
我们提供了 3 个 Codelab 来引导您构建一款名为 Awesome Drawing Quiz 的应用,这是其中的第 1 个。Awesome Drawing Quiz 是一款让玩家猜测图画中所描绘对象的游戏。本教程将演示如何在游戏中加入激励广告和 Firebase 服务。
在此 Codelab 中,您将集成 Google Analytics for Firebase 以记录一些重要的应用事件。此外,您还将学习如何解读 Firebase 控制台中显示的应用分析数据。
|
|
如果在此 Codelab 操作期间遇到任何问题(代码错误、语法错误、措辞含义不明等),都可以通过 Codelab 左下角的报告错误链接报告相应问题。
学习内容
- 如何在应用中设置 Google Analytics for Firebase
- 如何记录应用事件
- 如何解读 Firebase 控制台中显示的应用分析数据
所需条件
- Android Studio 4.1 或更高版本
- Google 账号
- 搭载 Android 5.0 或更高版本的测试设备,以及用于连接设备的 USB 线;或者运行 AVD(Android 虚拟设备)的 Android 模拟器,且该模拟器具有支持 Play 商店/Google API 的系统映像
您如何评价自己在 AdMob 方面的经验水平?
您如何评价自己在 Firebase 方面的经验水平?
2. 设置开发环境
下载代码
点击以下按钮可下载本 Codelab 的所有代码:
解压下载的 ZIP 文件。此操作将解压缩名为 admob-firebase-codelabs-android 的根文件夹。
…或从命令行克隆 GitHub 代码库。
$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-android
该代码库包含以下四个文件夹:
101-base - 您在此 Codelab 中用作基础的起始代码。
101-complete_and_102-base - 此 Codelab 完成后的代码以及 102 Codelab 的起始代码。
102-complete - 102 Codelab 完成后的代码。
导入入门版应用
启动 Android Studio,然后在欢迎界面上选择“导入项目”。然后,从下载的代码中选择 101-base 目录。
现在,您应该已在 Android Studio 中打开该项目。
3. 设置激励视频广告单元(可选)
为方便起见,起始应用已包含一个专用的激励视频广告单元。如果您不想在 AdMob 账号下创建新的 Google Ads 账号,则可以完全跳过此步骤。
如需在您的账号中创建新的 AdMob 应用,请按以下说明操作:
- 前往 AdMob 控制台。
- 在应用菜单中,点击“添加应用”。
- 当系统询问“您是否已将应用发布到 Google Play 或 App Store?”时,请回答“否”。
- 将应用命名为 “Awesome Drawing Quiz”,选择 “Android”作为平台,然后点击“添加”。
在您的账号中创建 AdMob 应用后,请按照下述步骤创建新的激励视频广告单元。
- 在 AdMob 前端中点击应用菜单,然后从应用列表中选择 “Awesome Drawing Quiz”。
- 点击添加广告单元,创建新的激励视频广告单元。
- 为广告格式选择激励广告。

- 根据您的喜好提供广告单元的名称。然后,将奖品数量设置为 1,并将奖品设置为 "hint"(这是应用目前向用户提供的奖品)。点击创建广告单元,创建新的激励视频广告单元。

- 成功创建后,您会看到类似于以下内容的说明:

- 返回到 Android 项目,然后将 AdMob 应用 ID 和广告单元 ID 常量更新为在上一步中创建的常量。
strings.xml
<!-- Update the value with your AdMob app id -->
<string name="admob_app_id">YOUR_ADMOB_APP_ID</string>
GameActivity.kt
// Update the value with your Rewarded Video ad unit id
private const val AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";
4. 设置 Firebase 项目
通过 Firebase 控制台创建新项目
- 前往 Firebase 控制台。
- 选择添加项目,然后将项目命名为“Awesome Drawing Quiz”。确保为此项目启用 Google Analytics 单选按钮处于开启状态。
- 选择您打算使用的 Google Analytics 账号。对于大多数用户来说,选择 Firebase 的默认账号选项就足够了,但如果您有其他想要使用的 Google Analytics 账号,请在此处选择该账号。
- 点击创建项目。
添加 Android 应用
- 在新项目的概览界面中,点击将 Firebase 添加到您的 Android 应用。
- 输入 Codelab 的软件包名称:com.codelab.awesomedrawingquiz
- 为应用设置别名:Awesome Drawing Quiz
- 将 SHA-1 字段留空,因为此项目不需要 SHA-1。
- 选择注册应用以注册您的应用。
向应用添加 google-services.json 文件
接下来,系统会提示您进入一个界面,您可以在其中下载包含应用所需的所有 Firebase 元数据的配置文件。点击下载 google-service.json,然后将该文件复制到项目中的
app 目录。

声明依赖项版本
首先,添加在项目中集成 Firebase 所需的每个依赖项的版本。打开位于项目根目录的 dependencies.gradle 文件,然后添加 google-services 插件、Firebase Analytics SDK 和 Firebase Core SDK 版本。
dependencies.gradle
ext {
...
// TODO: Declare google-services plugin version (101)
googleServicesPluginVersion = '4.3.4'
...
// TODO: Declare Firebase BOM version (101)
firebaseBomVersion = '26.2.0'
...
}
将 google-services 插件应用于您的应用
google-services 插件使用 google-services.json 文件来配置您的应用以使用 Firebase。
在项目根目录下的 build.gradle 文件中,将 google-services 添加为类路径。
build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
...
dependencies {
classpath "com.android.tools.build:gradle:$androidPluginVersion"
// TODO: Add google-services plugin (101)
classpath "com.google.gms:google-services:$googleServicesPluginVersion"
...
}
}
...
然后,通过在 app/build.gradle 文件中添加一行来应用 google-services 插件,如下所示:
app/build.gradle
apply plugin: 'com.android.application'
// TODO: Apply google-services plugin (101)
apply plugin: 'com.google.gms.google-services'
android {
...
}
dependencies {
...
}
将 Firebase SDK 添加到项目
仍在 app/build.gradle 文件中,将 Analytics SDK 添加到应用依赖项中。
app/build.gradle
apply plugin: 'com.android.application'
android {
...
}
dependencies {
...
// TODO: Import the Firebase BoM (101)
implementation platform("com.google.firebase:firebase-bom:$firebaseBomVersion")
// COMPLETE: Add Firebase Analytics dependency (101)
implementation 'com.google.firebase:firebase-analytics-ktx'
...
}
...
将您的项目与 Gradle 文件同步
为确保您的应用能使用所有的依赖项,请将您的项目与 Gradle 文件同步。选择 File > Sync Project with Gradle Files 菜单,以将项目与 Gradle 文件同步。
5. 将 AdMob 与 Firebase 项目相关联
要将您的应用与 Firebase 相关联,请按以下步骤操作。
- 访问 https://apps.admob.com,登录您的 AdMob 账号。
- 点击边栏中的“应用”。
- 选择“Awesome Drawing Quiz”。如果您没有在最近使用的应用列表中看到该应用,请点击查看所有应用,以搜索您添加到 AdMob 的所有应用的列表。
- 点击边栏中的应用设置。
- 点击与 Firebase 关联。
- 选择关联至现有 Firebase 项目并创建新的 Firebase 应用选项。然后从下拉菜单中选择 "Awesome Drawing Quiz" 项目。
- 点击“继续”按钮后,您会看到“已成功关联”消息。点击“完成”按钮即可完成。
将 AdMob 应用关联到 Firebase 项目后,您将在 AdMob 控制台和 Firebase 控制台中解锁一些额外的功能,如下所示:
收入卡片 (AdMob)
通过“收入”卡片,您可以在一个位置全面了解所有可能的收入来源。支持的收入来源如下:
- AdMob(估算)
- 参与中介的广告联盟(观测)
- 应用内购买
- 电子商务购买

“用户指标”卡片 (AdMob)
通过“用户指标”卡片,您可以了解广告体验的变化可能会对用户行为有何影响。

激励广告报告 (AdMob)
激励广告报告提供各种指标,可帮助发布商了解用户与激励广告的互动情况。

“总收入”卡片 (Firebase)
将 AdMob 应用与 Firebase 相关联后,Firebase 信息中心内的“总收入”卡片将显示 AdMob 的收入以及应用内购和电子商务购买交易的收入。

广告事件报告 (Firebase)
系统会自动收集与广告相关的事件(点击、展示和奖励事件),并可在 Google Analytics for Firebase 中使用。

6. 运行项目
编译并运行项目后,应用启动时您会看到以下界面。

点击开始游戏后,您会在屏幕上看到一幅图画。您的任务是根据顶部显示的提示猜出绘图的名称,从中您可以推断出绘图名称的第一个字母和长度。

如果您不知道绘画的名称,可以点击跳过按钮跳过此关卡。
您可能需要额外的提示来帮助您猜出答案。您可以点击提示按钮并观看激励视频广告,以获取额外线索。看完广告后,您将获得一个额外字母作为奖励。

7. 添加应用事件
为了深入了解超棒的绘画测验中的用户历程,您将定义一些自定义事件来跟踪用户在游戏中的行为,如下所示:
事件名称 | 已触发... | 参数 |
game_start | 当用户开始新游戏时触发 | 无 |
level_start | 当用户在某个阶段内开始新关卡(新的绘画测验)时触发。(一个阶段有 6 个关卡) | level_name |
level_wrong_answer | 当用户提交错误答案时触发 | level_name |
ad_reward_prompt | 当用户点按提示按钮,并收到观看激励视频广告的提示时 | ad_unit_id |
ad_reward_impression | 当用户开始观看激励视频广告时触发 | ad_unit_id |
level_success | 当用户提交正确答案(通关)时触发 | level_name、number_of_attempts、elapsed_time_sec、hint_used |
level_fail | 当用户跳过关卡时触发 | level_name、number_of_attempts、elapsed_time_sec、hint_used |
game_complete | 游戏结束时 | number_of_correct_answers |
与每个事件关联的每个参数的说明如下:
事件名称 | 参数名称 | 说明 |
level_start | level_name | 关卡中显示的绘画的名称(例如“香蕉”) |
level_wrong_answer | level_name | 当用户提交错误答案时触发 |
ad_reward_prompt | ad_unit_id | 用于展示激励视频广告的广告单元 ID |
ad_reward_impression | ad_unit_id | 用于展示激励视频广告的广告单元 ID |
level_success | level_name | 关卡中显示的绘画的名称(例如“香蕉”) |
level_success | number_of_attempts | 尝试通关的次数 |
level_success | elapsed_time_sec | 通关所用时间(以秒为单位) |
level_success | hint_used | 用户是否使用提示(观看激励视频广告)来通关(1:使用提示 / 0:未使用提示通关) |
level_fail | level_name | 关卡中显示的绘画的名称(例如“香蕉”) |
level_fail | number_of_attempts | 尝试通关的次数 |
level_fail | elapsed_time_sec | 通关所用时间(以秒为单位) |
level_fail | hint_used | 用户是否使用提示(观看激励视频广告)来通关(1:使用提示 / 0:未使用提示通关) |
game_complete | number_of_correct_answers | 游戏中已通关的关卡数 |
创建用于记录自定义事件的辅助类
为了轻松记录分析事件,您将创建一个辅助类来管理自定义事件。
首先,在 com.codelab.awesomedrawingquiz 软件包下创建一个新的 Kotlin 文件(不是 Kotlin 类),并将其命名为 QuizAnalytics.kt。创建用于定义自定义事件名称及其参数的字段。
QuizAnalytics.kt
private const val EVENT_AD_REWARD_PROMPT = "ad_reward_prompt"
private const val EVENT_AD_REWARD_IMPRESSION = "ad_reward_impression"
private const val EVENT_LEVEL_FAIL = "level_fail"
private const val EVENT_LEVEL_SUCCESS = "level_success"
private const val EVENT_LEVEL_WRONG_ANSWER = "level_wrong_answer"
private const val EVENT_GAME_START = "game_start"
private const val EVENT_GAME_COMPLETE = "game_complete"
private const val PARAM_AD_UNIT_ID = "ad_unit_id"
private const val PARAM_ELAPSED_TIME_SEC = "elapsed_time_sec"
private const val PARAM_HINT_USED = "hint_used"
private const val PARAM_NUMBER_OF_ATTEMPTS = "number_of_attempts"
private const val PARAM_NUMBER_OF_CORRECT_ANSWERS = "number_of_correct_answers"
接下来,添加有助于在游戏中记录自定义事件的扩展函数。请注意,大多数自定义事件都包含参数,以便您更全面地了解每个事件。另请注意,Google Analytics 已经定义了几个事件名称和参数(FirebaseAnalytics.Event.LEVEL_NAME 和 FirebaseAnalytics.Event.LEVEL_START),因此我们将使用这些名称和参数。
QuizAnalytics.kt
...
fun FirebaseAnalytics.logGameStart() = logEvent(EVENT_GAME_START, null)
fun FirebaseAnalytics.logLevelStart(levelName: String) {
logEvent(FirebaseAnalytics.Event.LEVEL_START) {
param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
}
}
fun FirebaseAnalytics.logLevelWrongAnswer(levelName: String) {
logEvent(EVENT_LEVEL_WRONG_ANSWER) {
param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
}
}
fun FirebaseAnalytics.logAdRewardPrompt(adUnitId: String) {
logEvent(EVENT_AD_REWARD_PROMPT) {
param(PARAM_AD_UNIT_ID, adUnitId)
}
}
fun FirebaseAnalytics.logAdRewardImpression(adUnitId: String) {
logEvent(EVENT_AD_REWARD_IMPRESSION) {
param(PARAM_AD_UNIT_ID, adUnitId)
}
}
fun FirebaseAnalytics.logLevelSuccess(
levelName: String,
numberOfAttempts: Int,
elapsedTimeSec: Int,
hintUsed: Boolean
) {
logEvent(EVENT_LEVEL_SUCCESS) {
param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
param(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts.toLong())
param(PARAM_ELAPSED_TIME_SEC, elapsedTimeSec.toLong())
param(PARAM_HINT_USED, if (hintUsed) 1 else 0)
}
}
fun FirebaseAnalytics.logLevelFail(
levelName: String,
numberOfAttempts: Int,
elapsedTimeSec: Int,
hintUsed: Boolean
) {
logEvent(EVENT_LEVEL_FAIL) {
param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
param(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts.toLong())
param(PARAM_ELAPSED_TIME_SEC, elapsedTimeSec.toLong())
param(PARAM_HINT_USED, if (hintUsed) 1 else 0)
}
}
fun FirebaseAnalytics.logGameComplete(
numberOfCorrectAnswers: Int
) {
logEvent(EVENT_GAME_COMPLETE) {
param(PARAM_NUMBER_OF_CORRECT_ANSWERS, numberOfCorrectAnswers.toLong())
}
}
在游戏中记录 Analytics 事件
在 GameViewModel 类中,为 FirebaseAnalytics 实例添加一个新属性。
GameViewModel.kt
class GameViewModel(
...
// TODO: Accept FirebaseAnalytics instance as a parameter (101)
private val analytics: FirebaseAnalytics,
) : ViewModel() {
...
}
接下来,在 AwesomeDrawingQuizViewModelFactory 类中,添加一个新属性,就像您之前在 GameViewModel 中所做的那样。
AwesomeDrawingQuizViewModelFactory.kt
class AwesomeDrawingQuizViewModelFactory(
...
// TODO: Accept FirebaseAnalytics instance as a parameter (101)
private val analytics: FirebaseAnalytics,
) : ViewModelProvider.Factory {
...
}
接下来,在 AwesomeDrawingQuiz 类中,添加 provideFirebaseAnalytics() 函数并更新 provideViewModelFactory() 函数,以将 FirebaseAnalytics 实例传递给 AwesomeDrawingViewModelFactory。
AwesomeDrawingQuiz.kt
class AwesomeDrawingQuiz : Application() {
...
fun provideViewModelFactory() = AwesomeDrawingQuizViewModelFactory(
this,
provideGameSettings(),
// TODO: Pass FirebaseAnalytics instance as a parameter (101)
provideFirebaseAnalytics(),
)
// TODO: Provide FirebaseAnalytics instance (101)
private fun provideFirebaseAnalytics() = Firebase.analytics
...
}
现在,您可以开始实现自定义事件了。首先,在 startGame() 函数中,调用 logGameStart() 以指示游戏已开始。
由于 logGameStart() 是 FirebaseAnalytics 类的扩展函数,因此您可以从 FirebaseAnalytics 类的实例中调用它。
GameViewModel.kt
fun startGame() {
...
// TODO: Log game_start event (101)
analytics.logGameStart()
...
}
接下来,在 checkAnswer() 函数中,添加 level_success 和 level_wrong_answer 事件。
GameViewModel.kt
fun checkAnswer(userAnswer: String) {
...
if (correct) {
...
// TODO: Log level_success event (101)
analytics.logLevelSuccess(
levelName = drawing.word,
numberOfAttempts = numAttempts,
elapsedTimeSec = elapsedTimeInSeconds,
hintUsed = isHintUsed,
)
...
} else {
// TODO: Log level_wrong_answer event (101)
analytics.logLevelWrongAnswer(levelName = drawing.word)
...
}
}
接下来,在 skipLevel() 函数中,添加 level_fail 事件以将相应级别标记为失败。
GameViewModel.kt
fun skipLevel() {
...
// TODO: Log level_fail event (101)
analytics.logLevelFail(
levelName = drawing.word,
numberOfAttempts = numAttempts,
elapsedTimeSec = elapsedTimeInSeconds,
hintUsed = isHintUsed,
)
...
}
接下来,实现 logAdRewardPrompt() 和 logAdRewardImpression() 函数,以跟踪用户在激励视频广告方面的行为。
GameViewModel.kt
fun logAdRewardPrompt(adUnitId: String) {
// TODO: Log ad_reward_prompt event (101)
analytics.logAdRewardPrompt(adUnitId)
}
fun logAdRewardImpression(adUnitId: String) {
// TODO: Log ad_reward_impression event (101)
analytics.logAdRewardImpression(adUnitId)
}
最后,修改 requestNewDrawing() 和 finishGame() 函数,以添加 level_start 和 game_complete 自定义事件。
GameViewModel.kt
private fun requestNewDrawing() {
...
drawingRequestDisposable = drawingDao.getRandomDrawings(seenWords)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { d ->
...
// TODO: Log level_start event (101)
analytics.logLevelStart(d.word)
...
}
}
private fun finishGame() {
// TODO: Log game_complete event (101)
analytics.logGameComplete(numCorrectAnswers)
...
}
8. 调试分析事件
您可以使用 Firebase 控制台中的 DebugView 验证事件是否已正确记录。使用 DebugView,您能够以近乎实时的方式查看由开发设备上的应用记录的原始事件数据。
这在开发的插桩阶段进行验证时很有用,可帮助您发现 Analytics 实现中的任何错误。
启用调试模式
通常,您的应用所记录的事件会每隔 1 小时左右集中起来作为一批进行处理,并一起上传。如需实时验证您的 Analytics 实现情况,您需要在开发设备上启用调试模式,以便以最短的延迟上传事件。
如需启用调试模式,请完成以下步骤:
- 在 Android Studio 中打开 Terminal 工具窗口(依次选择 View > Tool Windows > Terminal)。

- 执行以下命令(确保测试 Android 设备已连接到您的计算机或 Android 模拟器正在运行):
adb shell setprop debug.firebase.analytics.app com.codelab.awesomedrawingquiz
“调试”模式将保持启用状态,直至您通过执行以下命令明确将其停用:
adb shell setprop debug.firebase.analytics.app .none.
使用 DebugView 调试 Google Analytics 事件
在测试设备上启用调试模式后,前往 Firebase 控制台中的项目,然后从菜单中选择分析 > DebugView。然后,在测试设备上玩游戏,查看系统记录的事件并将其显示在 DebugView 报告中。

您可以点击事件名称,访问有关每个活动的详细信息。例如,以下屏幕截图显示了与 level_start 事件关联的参数详情。

如需了解详情,请参阅 DebugView 帮助中心文章。
9. 启用自定义维度和指标
默认情况下,Google Analytics for Firebase 会收集事件总数。对于您感兴趣的每个事件参数,您都需要明确开启相应参数的报告功能。然后,Google Analytics for Firebase 就可以显示其他卡片来展示自定义参数的统计信息。
如需注册自定义维度和指标,请执行以下操作:
- 前往 Firebase 控制台,然后选择您之前创建的 Awesome Drawing Quiz 项目。
- 在导航菜单中,依次点击分析 > 事件。
- 点击管理自定义定义。
- 在“自定义维度”标签页中,点击创建自定义维度。
- 在“事件参数名称”字段中,输入 level_name,然后点击保存以完成参数注册。

- 接下来,选择自定义指标标签页,然后点击创建自定义指标。
- 输入以下形参的形参名称和计量单位。
参数名称 | 形参类型 | 衡量单位 |
number_of_attempts | 数字 | 标准 |
hint_used | 数字 | 标准 |
elapsed_time_sec | 数字 | 秒 |
number_of_correct_answers | 数字 | 标准 |
10. 从“活动”报告中获取数据洞见
您已在游戏中添加了一些事件,现在应该能够回答有关游戏用户行为的问题了。以下是您可以从 Firebase 事件报告中获得的一些数据洞见。
哪个级别的答错题数最多?
为了回答这个问题,您应该了解每个级别触发了多少 level_wrong_answer 事件。
点击活动报告中的 level_wrong_answer。在 level_wrong_answer 事件报告中,找到 level_name 卡片。您会在相应卡片上看到与 level_name 参数关联的值,如下所示。

根据上面的屏幕截图,您可以轻松发现地平线的答错次数最多,这意味着与其他关卡相比,该关卡对用户来说难度更大。
根据此处提供的分析洞见,您可以决定不向新手用户提供难度较高的关卡,以保持较高的用户留存率。
平均尝试多少次才能通关?
在超棒的绘画测验中,用户可以根据需要多次提交每个级别的答案。
由于您已在 level_success 事件中针对 number_of_attempts 参数启用了参数报告,因此您可以查看该参数的详细指标。
在“事件”报告中,点击 level_success 事件。在 level_success 事件报告中,找到 number_of_attemps 卡片。您会在该卡片上看到平均尝试次数,如下所示:

您可以根据此处的分析洞见来优化游戏的平均难度。例如,如果平均尝试次数过低(接近 1),您可以考虑让游戏更具挑战性。
用户是否尝试通过获取提示来解答问题,即使他们最终未能通关?
当用户决定跳过某个关卡时,系统会触发 level_fail 事件。用户做出此决定的原因可能有很多。
不过,由于游戏可以在用户观看激励视频广告后向其提供提示,因此有必要了解用户是否尝试在提示的帮助下通关。
在“事件”报告中,点击 level_fail 事件。在 level_fail 事件报告中,找到 hint_used 卡片。您会看到 hint_used 事件参数的平均数量。请注意,如果使用了提示,相应参数的值为 1;如果未使用提示,相应参数的值为 0。

如果 hint_used 卡片上的数字接近 0,则表明奖励(提示)对这些用户来说不够有用。此外,您还错失了通过激励视频广告增加收入的机会。
因此,您应考虑提供更丰厚的奖励,以便用户更深入地参与游戏,从而提高激励视频广告的收入。
每款游戏的平均通关数是多少?
在“Awesome Drawing Quiz”中,每款游戏共有 6 个级别。当用户完成 6 个关卡后(无论他们是通关还是失败),系统会触发一个 game_complete 事件,并将 number_of_correct_answers 作为参数。number_of_correct_answers 参数表示用户答对的关卡数。
在“事件”报告中点击 game_complete 事件。在 game_complete 事件报告中,找到 number_of_correct_answers 卡片。您会看到 number_of_correct_answers 事件参数的平均数量。

如果通关的平均关卡数过低,您应考虑重新安排游戏中的关卡,以便玩家更轻松地通关早期关卡,从而让他们能够继续玩您的游戏,而不会失去兴趣。
11. 全部完成!
您已完成 AdMob+Firebase 101 Android Codelab。您可以在
101-complete_and_102-base 文件夹中找到此 Codelab 的完整代码。
在 AdMob+Firebase Codelab 的下一部分中,您将学习如何使用漏斗直观呈现应用事件流。下一部分还将介绍如何在不发布应用更新的情况下,使用 Remote Config 和 A/B 测试来优化游戏中的参数值。