1.概览
在此 Codelab 中,您将学习如何在功能发布期间监控应用的性能。我们的示例应用将具有基本功能,并且已设置为根据 Firebase Remote Config 标志显示不同的背景图片。我们将探讨通过检测轨迹来监控应用性能、向应用发布配置更改、监控效果以及了解如何提升性能。
学习内容
- 如何将 Firebase Performance Monitoring 添加到您的移动应用,以获取开箱即用的指标(例如应用启动时间以及慢帧或冻结的帧)
- 如何添加自定义跟踪记录以了解用户转化历程的关键代码路径
- 如何使用 Performance Monitoring 信息中心了解您的指标并跟踪重要更改(例如功能发布)
- 如何设置性能提醒以监控关键指标
- 如何发布 Firebase Remote Config 更改
前提条件
- Android Studio 4.0 或更高版本
- 一个采用 API 级别 16 或更高级别的 Android 模拟器。
- Java 8 或更高版本
- 对 Firebase Remote Config 有基本的了解
2. 设置示例项目
下载代码
运行以下命令以克隆此 Codelab 的示例代码。这将在您的机器上创建一个名为 codelab-perf-rc-android
的文件夹:
$ git clone https://github.com/FirebaseExtended/codelab-feature-rollout-performance.git
如果您的机器上没有 Git,也可以直接从 GitHub 下载代码。
将 firebase-perf-rc-android-start
文件夹下的项目导入 Android Studio。您可能会看到一些运行时异常,或者看到有关缺失 google-services.json
文件的警告。我们将在下一部分中更正此问题。
在此 Codelab 中,您将使用 Firebase Assistant 插件在 Firebase 项目中注册您的 Android 应用,并将必要的 Firebase 配置文件、插件和依赖项添加到您的 Android 项目中 - 所有这些都在 Android Studio 中完成!
将您的应用与 Firebase 相关联
- 前往 Android Studio/Help >检查更新,确保您使用的是最新版 Android Studio 和 Firebase Assistant。
- 依次选择 Tools > Firebase 以打开 Assistant 窗格。
- 选择要添加到应用的 Performance Monitoring,然后点击 Performance Monitoring 使用入门。
- 点击 Connect to Firebase,将您的 Android 项目与 Firebase 关联(此操作会在浏览器中打开 Firebase 控制台)。
- 在 Firebase 控制台中,点击添加项目,然后输入 Firebase 项目名称(如果您已经有 Firebase 项目,可以改为选择现有的项目)。点击继续并接受条款,创建 Firebase 项目和新的 Firebase 应用。
接下来,您应该会看到一个对话框,用于将您的新 Firebase 应用连接到 Android Studio 项目。
- 点击连接。
- 打开 Android Studio。在 Assistant 窗格中,您会看到一条确认您的应用已关联到 Firebase 的消息。
将 Performance Monitoring 添加到您的应用
在 Android Studio 的 Assistant 窗格中,点击 Add Performance Monitoring to your app。
您应该会看到一个 Accept Changes 对话框,之后 Android Studio 应同步您的应用,以确保已添加所有必要的依赖项。
最后,您应该会在 Android Studio 的 Assistant 窗格中看到一条成功消息,表明所有依赖项均已正确设置。
此外,还需要按照“(可选)启用调试日志记录”步骤中的说明启用调试日志记录。公开文档中也提供了相同的说明。
3. 运行应用
现在,您应该会在应用的模块(应用级)目录中看到 google-services.json
文件,并且您的应用现在应该可以编译了。在 Android Studio 中,点击 Run >Run 'app' 以在 Android 模拟器上构建并运行应用。
应用运行时,您应该首先看到一个如下所示的启动画面:
几秒钟后,带有默认图片的主页面将显示:
后台发生了什么?
启动画面在 SplashScreenActivity 中实现,并执行以下操作:
- 在
onCreate()
中,我们会初始化 Firebase Remote Config 设置,并提取您将在此 Codelab 后面的 Remote Config 信息中心内设置的配置值。 - 在
executeTasksBasedOnRC()
中,我们读取了seasonal_image_url
标志的配置值。如果配置值提供了网址,我们将同步下载相应图片。 - 下载完成后,应用会转到 MainActivity,并调用
finish()
以结束SplashScreenActivity
。
在 MainActivity
中,如果 seasonal_image_url
是通过 Remote Config 定义的,则系统会启用此功能,并将下载的图片显示为主页面的背景。否则,系统会显示默认图片(如上所示)。
4. 设置 Remote Config
现在,您的应用已在运行,您可以设置新功能标志了。
- 在 Firebase 控制台的左侧面板中,找到互动部分,然后点击 Remote Config。
- 点击 Create configuration 按钮以打开配置表单,然后将
seasonal_image_url
添加为参数键。 - 点击添加说明,然后输入说明:
Shows a seasonal image (replaces default) in the main page when the restaurant list is empty.
- 点击新增 ->条件值 ->创建新条件。
- 对于条件名称,请输入
Seasonal image rollout
。 - 对于
Applies if...
部分,选择User in random percentile <= 0%
。(在准备在后续步骤中推出之前,最好让该功能保持停用状态。) - 点击创建条件。您稍后将根据此条件向用户发布新功能。
- 打开创建第一个参数表单,然后找到季节性映像发布的值字段。输入用于下载季节性图片的网址:
https://images.unsplash.com/photo-1552691021-7043334e0b51
- 将默认值保留为空字符串。这意味着,系统会显示代码库中的默认图片,而不是从网址下载的图片。
- 点击保存。
您可以看到,新配置是以草稿形式创建的。
- 点击发布更改,然后在顶部确认更改以更新应用。
5. 添加了对数据加载时间的监控
您的应用会在显示 MainActivity
之前预加载一些数据,并显示启动画面以隐藏此过程。您不希望用户在此屏幕上等待太长时间,因此通常有必要监控启动画面的显示时长。
Firebase Performance Monitoring 恰好可以满足您的这一需求。您可以对自定义代码跟踪记录进行插桩处理,以监控应用中特定代码的性能,例如数据的加载时间和新功能的处理时间。
如需跟踪启动画面的显示时长,您需要向 SplashScreenActivity
(即实现启动画面的 Activity
)添加自定义代码跟踪记录。
- 初始化、创建并启动名为
splash_screen_trace
的自定义代码跟踪记录:
SplashScreenActivity.java
// ...
import com.google.firebase.perf.FirebasePerformance;
import com.google.firebase.perf.metrics.Trace;
// ...
public class SplashScreenActivity extends AppCompatActivity {
private static final String TAG = "SplashScreenActivity";
private static final String SEASONAL_IMAGE_URL_RC_FLAG = "seasonal_image_url";
// TODO: Initialize splash_screen_trace
private final Trace splashScreenTrace = FirebasePerformance.startTrace("splash_screen_trace");
// ...
}
- 在
SplashScreenActivity
的onDestroy()
方法中结束跟踪记录:
SplashScreenActivity.java
@Override
protected void onDestroy() {
super.onDestroy();
// TODO: Stop the splash_screen_trace here
splashScreenTrace.stop();
}
由于新功能会下载和处理图片,因此您需要添加第二个自定义代码跟踪记录,用于跟踪该功能添加到 SplashScreenActivity
的额外时间。
- 初始化、创建并启动名为
splash_seasonal_image_processing
的自定义代码跟踪记录:
SplashScreenActivity.java
private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);
if (!seasonalImageUrl.isEmpty()) {
// TODO: Start the splash_seasonal_image_processing here
final Trace seasonalImageProcessingTrace = FirebasePerformance
.startTrace("splash_seasonal_image_processing");
// ...
}
}
- 在
RequestListener
的onLoadFailed()
和onResourceReady()
方法中结束跟踪记录:
SplashScreenActivity.java
Glide.with(SplashScreenActivity.this.getApplicationContext())
.asBitmap()
.load(seasonalImageUrl)
.signature(new ObjectKey(Utils.getCacheUUID()))
.listener(new RequestListener<Bitmap>() {
@Override
public boolean onLoadFailed(
@Nullable GlideException e,
Object model, Target<Bitmap> target,
boolean isFirstResource) {
// TODO: Stop the splash_seasonal_image_processing here
seasonalImageProcessingTrace.stop();
launchMainActivity();
return true;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model,
Target<Bitmap> target, DataSource dataSource,
boolean isFirstResource) {
// TODO: Stop the splash_seasonal_image_processing here
seasonalImageProcessingTrace.stop();
launchMainActivity();
return true;
}
})
.preload();
现在,您已添加了自定义代码跟踪记录来跟踪启动画面时长(splash_screen_trace)
和新功能 (splash_seasonal_image_processing
) 的处理时间),请再次在 Android Studio 中运行应用。您应该会看到一条包含 Logging trace metric: splash_screen_trace
的日志记录消息,后跟跟踪记录的时长。由于您尚未启用新功能,因此不会看到 splash_seasonal_image_processing
的日志消息。
6. 向跟踪记录添加自定义属性
对于自定义代码跟踪记录,Performance Monitoring 会自动记录默认属性(应用版本、国家/地区、设备等常见元数据),使您可以在 Firebase 控制台中过滤跟踪记录的数据。您还可以添加和监控自定义属性。
在您的应用中,您刚刚添加了两条自定义代码跟踪记录,用于监控新功能的启动画面时长和处理时间。可能会影响这些时长的一个因素是显示的图片是默认图片,还是必须通过网址下载。谁知道呢,您最终可能会使用不同的网址来下载图片。
因此,我们将向这些自定义代码跟踪记录添加一个表示季节性图片网址的自定义属性。这样,您就可以稍后按这些值过滤时长数据。
- 在
executeTasksBasedOnRC
方法的开头为splash_screen_trace
添加自定义属性 (seasonal_image_url_attribute
):
SplashScreenActivity.java
private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);
// TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_screen_trace
if (seasonalImageUrl.isEmpty()) {
splashScreenTrace.putAttribute("seasonal_image_url_attribute", "unset");
} else {
splashScreenTrace.putAttribute("seasonal_image_url_attribute", seasonalImageUrl);
}
// ...
}
- 在调用
startTrace("splash_seasonal_image_processing")
之后立即为splash_seasonal_image_processing
添加相同的自定义属性:
SplashScreenActivity.java
if (!seasonalImageUrl.isEmpty()) {
// TODO: Start the splash_seasonal_image_processing here
final Trace seasonalImageProcessingTrace = FirebasePerformance
.startTrace("splash_seasonal_image_processing");
// TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_seasonal_image_processing
seasonalImageProcessingTrace
.putAttribute("seasonal_image_url_attribute", seasonalImageUrl);
// ...
}
现在,您已为两个自定义轨迹(splash_screen_trace
和 splash_seasonal_image_processing
)添加了自定义属性 (seasonal_image_url_attribute
),请再次在 Android Studio 中运行应用。您应该会看到一条包含 Setting attribute 'seasonal_image_url_attribute' to 'unset' on trace 'splash_screen_trace'.
的日志记录消息。您尚未启用 Remote Config 参数 seasonalImageUrl,因此该属性值为 unset
。
Performance Monitoring SDK 会收集轨迹数据并将其发送到 Firebase。您可以在 Firebase 控制台的“性能”信息中心查看这些数据,我们将在此 Codelab 的下一步中对此进行详细介绍。
7. 配置 Performance Monitoring 信息中心
配置信息中心以监控您的功能
在 Firebase 控制台中,选择包含您的 Friendly Eats 应用的项目。
在左侧面板中,找到发布和监控部分,然后点击性能。
您应该会看到效果信息中心,其中显示了指标板中的首个数据点!Performance Monitoring SDK 会从您的应用收集性能数据,并在收集后的几分钟内显示这些数据。
您可以在此指标板上跟踪应用的关键指标。默认视图包含应用启动时间跟踪记录的时长,但您可以添加最关心的指标。由于您正在跟踪添加的新功能,因此可以定制信息中心,以显示自定义代码跟踪记录 splash_screen_trace
的时长。
- 点击其中一个空白的选择指标框。
- 在对话框窗口中,选择自定义跟踪记录的跟踪记录类型,选择跟踪记录名称
splash_screen_trace
。
- 点击选择指标,您应该会看到
splash_screen_trace
的时长已添加至信息中心!
您可以使用相同的步骤添加自己关心的其他指标,以便快速了解指标在不同时间段的表现如何变化,甚至在不同的版本中如何变化。
指标板是一款强大的工具,可用于跟踪用户体验到的关键指标的表现。对于此 Codelab,您在很短的时间范围内仅获得了一小组数据,因此您将使用其他信息中心视图来帮助了解功能发布的效果。
8. 发布您的功能
现在,您已设置好监控功能,可以发布 Firebase Remote Config 更改(即您之前设置的 seasonal_image_url)
)。
如需发布更改,您需要返回 Firebase 控制台中的 Remote Config 页面,提高定位条件的用户百分比。通常,您会向一小部分用户推出新功能,并仅在您确信新功能没有问题的情况下增加新功能。不过,在此 Codelab 中,您是该应用的唯一用户,因此可以将百分比更改为 100%。
- 点击页面顶部的条件标签页。
- 点击您之前添加的
Seasonal image rollout
条件。 - 将百分位更改为 100%。
- 点击 Save Condition。
- 点击发布更改并确认更改。
返回 Android Studio,在模拟器中重启应用以查看新功能。启动画面之后,您应该会看到新的空白状态主屏幕!
9. 查看效果变化
现在,我们来使用 Firebase 控制台中的性能信息中心查看启动画面加载性能。在此 Codelab 的这一步中,您将使用信息中心的不同部分来查看性能数据。
- 在“信息中心”主标签页上,向下滚动到跟踪记录表,然后点击自定义跟踪记录标签页。在此表格中,您会看到之前添加的自定义代码轨迹,以及一些开箱即用轨迹。
- 现在,您已启用新功能,请查找自定义代码轨迹
splash_seasonal_image_processing
,该轨迹用于衡量下载和处理图片所需的时间。从跟踪记录的 Duration 值可以看出,这种下载和处理耗费了大量时间。
- 由于您有
splash_seasonal_image_processing
的数据,您可以在信息中心标签页顶部的指标板中添加此跟踪记录的时长。
与之前类似,点击一个空的选择指标框。在对话框窗口中,选择跟踪记录类型自定义跟踪记录和跟踪记录名称 splash_seasonal_image_processing
。最后,点击选择指标,将此指标添加到指标板。
- 如需进一步确认差异,您可以仔细查看
splash_screen_trace
的数据。点击指标板中的splash_screen_trace
卡片,然后点击查看指标详情。
- 在详情页面的左下角,您会看到属性列表,其中包括您之前创建的自定义属性。点击自定义属性
seasonal_image_url_attribute
,即可在右侧查看每个季节性图片网址的启动画面时长:
- 您的启动画面时长值可能与上方屏幕截图中的略有不同,但与使用默认图片(用“未设置”表示)相比,通过网址下载图片时,您应该设置更长的时长。
在此 Codelab 中,这个持续时间较长的原因可能很简单,但在真实应用中,可能并不那么明显。收集的时长数据来自不同的设备,在不同的网络连接条件下运行应用,这些条件可能比您的预期更差。我们来看看如果这是真实情况,您将如何调查此问题。
- 点击页面顶部的效果,返回信息中心主标签页:
- 在页面底部的跟踪记录表中,点击网络请求标签页。在此表格中,您会看到来自您的应用的所有网络请求汇总到网址格式中,包括
images.unsplash.com/**
网址格式。如果将此响应时间的值与图片下载和处理所需的总时间(即splash_seasonal_image_processing
跟踪记录的时长)进行比较,您会发现图片消耗了大部分时间。
性能发现结果
使用 Firebase Performance Monitoring,您发现启用新功能对最终用户有以下影响:
- 您在
SplashScreenActivity
上花费的时间增加了。 splash_seasonal_image_processing
的时长非常长。- 延迟是由图片下载的响应时间以及图片所需的相应处理时间引起的。
在下一步中,您将通过回滚该功能并确定如何改进该功能的实现来减少对性能的影响。
10. 回滚功能
增加用户的在启动画面期间的等待时间不理想。Remote Config 的主要优势之一是能够暂停和撤回您的发布,而无需向用户发布其他版本。这样,您就可以快速对问题(例如您在上一步中发现的性能问题)做出响应,并尽可能减少不满意的用户人数。
作为快速缓解措施,您需要将发布百分位重置回 0
,以便所有用户都能再次看到默认映像:
- 返回 Firebase 控制台中的 Remote Config 页面。
- 点击页面顶部的条件。
- 点击您之前添加的
Seasonal image rollout
条件。 - 将百分位更改为 0%。
- 点击 Save Condition。
- 点击发布更改并确认更改。
在 Android Studio 中重启应用,您应该会看到原始的空状态主屏幕:
11. 解决性能问题
在此 Codelab 的前面部分,您发现下载启动画面的图片会导致应用运行速度变慢。如果仔细观察下载的图片,您会发现您使用的是该图片的原始分辨率,超过了 2MB!要快速解决性能问题,您可以将画质降低到更合适的分辨率,以缩短图片的下载时间。
再次发布 Remote Config 值
- 返回 Firebase 控制台中的 Remote Config 页面。
- 点击
seasonal_image_url
参数的修改图标。 - 将季节性映像发布的值更新为
https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640
,然后点击保存。
- 点击页面顶部的条件标签页。
- 点击季节性图片发布,然后将百分比设回 100%。
- 点击 Save Condition。
- 点击发布更改按钮。
12. 测试修正效果并设置提醒
在本地运行应用
将新配置值设置为使用其他下载图片网址后,请再次运行应用。这一次,您会注意到启动画面显示时间比之前短。
查看更改的效果
返回 Firebase 控制台中的性能信息中心,查看指标的显示情况。
- 这次,您将使用跟踪记录表导航到详情页面。在跟踪记录表的自定义跟踪记录标签页中,点击自定义跟踪记录
splash_seasonal_image_processing
,再次详细查看其时长指标。
- 点击自定义属性
seasonal_image_url_attribute
可再次查看自定义属性的细分。如果您将光标悬停在这些网址上,会看到一个值,该值与缩减后的图片的新网址https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640
(末尾带有?w=640
)相匹配。与上一个图片相关联的持续时间值比上一个图片的值短得多,更适合用户!
- 现在,您已改进了启动画面的性能,您可以设置提醒,以便在跟踪记录超出您设置的阈值时收到通知。打开效果信息中心,点击 splash_screen_trace 对应的菜单图标(三点状图标),然后点击提醒设置。
- 点击切换开关以启用时长提醒。将阈值设置为略高于您所看到的值,这样一来,如果您的 spin_screen_trace 超过阈值,您会收到一封电子邮件。
- 点击保存以创建提醒。向下滚动到跟踪记录表,然后点击自定义跟踪记录标签页以查看提醒是否已启用!
13. 恭喜!
恭喜!您已启用 Firebase Performance Monitoring SDK 并收集了轨迹,以衡量新功能的性能!您监控了新功能发布的关键效果指标,并在发现效果问题时快速做出响应。通过使用 Remote Config 更改配置并实时监控性能问题,这一切都是可能的。
所学内容
- 将 Firebase Performance Monitoring SDK 添加到您的应用
- 向代码添加自定义代码跟踪记录以衡量特定功能
- 设置 Remote Config 参数和条件值以控制/发布新功能
- 了解如何使用 Performance Monitoring 信息中心在发布期间发现问题
- 设置性能提醒,以便在应用性能超出您设置的阈值时收到通知