本文介绍了 Android 和 iOS 平台页面性能监控模块的简介、配置以及功能的使用。
Android
背景
在移动应用开发中,用户体验(User Experience,UX)是一个至关重要的因素。随着智能手机硬件性能的提升和用户需求的不断增加,用户对应用的响应速度和流畅度有了更高的期望。特别是在移动端应用中,页面启动时间是用户体验的一个关键指标。页面启动时间过长会导致用户感到不耐烦,甚至可能导致用户流失,平台的页面启动监控默认会监控 Activity 的冷启动耗时,耗时信息分为两类:页面渲染耗时和页面加载耗时。
页面渲染耗时:从 Activity 的 onCreate 调用到第一帧画面渲染完成的时间。
页面加载耗时:其值默认与页面渲染耗时相同,但用户可以通过 reportActivityFullLaunch 接口来自定义 Activity 的加载结束时间。
开启步骤
1. 在 应用配置 > SDK 配置 的编辑配置页面添加如下配置项。
sample_ratio:控制用户采样率,即多少设备会开启这个功能,1 代表所有设备开启,0 代表所有设备都不开。

2. 客户端在调用 Bugly.init 接口之前,添加如下代码,Bugly.init 接口的调用请参考 SDK 初始化。
...BuglyBuilder.addMonitor(BuglyMonitorName.PAGE_LAUNCH); // 添加此语句...Bugly.init(context, builder);
接口说明
除了监控页面的整体耗时外,用户还可以通过调用以下接口,监控页面启动过程中各个 Span 的耗时。所谓 Span 可以理解为页面启动过程中的各个子阶段, 以下为 com.tencent.rmonitor.pagelaunch.PageLaunchMonitor 类的接口,该类是单例实现可以通过 PageLaunchMonitor.getInstance() 获取该单例对象。
/*** 标记 activity 启动过程中某个 Span 的开始* @param activity* @param name, Span 名字* @param parentName, 父 Span 的名字*/public void startSpan(Activity activity, String name, String parentName);/*** 标记 activity 启动过程中某个 Span 的结束* @param activity* @param name Span 名字,需要匹配 startSpan 的参数*/public void endSpan(Activity activity, String name);/*** 用户自定义 Activity 启动结束时间点,会以调用该接口的时间作为 Activity 的启动结束时间* @param activity*/public void reportActivityFullLaunch(Activity activity);
需要注意的是 startSpan 和 endSpan 需要成对匹配调用,同一 Span 名字的只会保存一条,也就是后面同名的 Span 会覆盖前面的。
示例代码
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);PageLaunchMonitor.getInstance().startSpan(this, "MemoryTracerTest", "");PageLaunchMonitor.getInstance().startSpan(this, "onCreate", "MemoryTracerTest");startMemoryTrace();PageLaunchMonitor.getInstance().endSpan(this, "onCreate");}@Overridepublic void onResume() {super.onResume();PageLaunchMonitor.getInstance().startSpan(this, "onResume", "MemoryTracerTest");reStartMemoryTrace();PageLaunchMonitor.getInstance().endSpan(this, "onResume");PageLaunchMonitor.getInstance().endSpan(this, "MemoryTracerTest");// 等页面加载完成之后,才调用 reportLaunchFinished 来定义 Activity 启动结束new Thread (new Runnable() {reportLaunchFinished();}).start();}private void reportLaunchFinished() {PageLaunchMonitor.getInstance().reportActivityFullLaunch(this);}
在上面示例中包含了三个 Span:"MemoryTracerTest"、 "onCreate"、 "onResume",其中 MemoryTracerTest 是根 Span,它的耗时是 onCreate 和 onResume 两个子 Span 的和。
日志说明
功能开启成功的日志:
10-04 10:xx:xx.xxx 14546 1819 D PageLaunchPlugin: start page launch monitor
功能关闭成功的日志:
10-04 10:xx:xx.xxx 14546 1819 D PageLaunchPlugin: stop page launch monitor
上报日志,在退后台之后,会上报记录的所有 Activity 冷启动耗时数据:
10-22 10:11:44.465 15996 16178 V RMonitor_report_Json: url: https://xxx.qq.com/v1/xxxx/upload-json?timestamp=1720059647340&nonce=xxxxxxxx eventName: page_launch, client_identify: f55e3c66c53520933d0b8c8687da6398
iOS
背景
在 iOS 应用中,页面加载耗时是一个重要的性能指标。如果某个页面的启动耗时过长,可能会导致用户体验下降,甚至影响应用的整体性能。页面性能监控主要指监控页面的加载耗时,平台的页面加载监控功能默认会监控 UIViewController 加载耗时,耗时信息分为两类:页面渲染耗时和页面加载耗时。
页面渲染耗时:从 UIViewController 的 loadView: 调用到 viewDidAppear: 调用的时间。
页面加载耗时:其值默认与页面渲染耗时相同,但用户可以通过 endVCRender 接口来自定义 VC 的加载结束时间。
开启步骤
页面加载耗时分析是新增功能,与平台其他功能一样,需要在客户端先执行如下代码开启,同时在平台后台配置合适的采样率。
1. 在启动模块中包含 Bugly_MODULE_PAGE_LAUNCH 或使用 RM_MODULE_ALL。
[Bugly start:@[Bugly_MODUEL_PAGE_LAUNCH, /*...*/] config:config completeHandler:^{/*...*/}];// 或[Bugly start:RM_MODULE_ALL config:config completeHandler:^{/*...*/}];
2. 在 应用配置 > SDK 配置 的编辑配置页面添加如下配置项:
sample_ratio:控制用户采样率,即多少设备会开启这个功能,1 代表所有设备开启, 0 代表所有设备都不开。

接口说明
除了监控页面的渲染和加载耗时外,用户还可以通过调用以下接口,监控页面启动过程中各个 Span 的耗时,所谓 Span 可以理解为页面启动过程中的各个子阶段。
以下为 BuglyPageLoadMonitor 的定义。
@interface BuglyPageLoadMonitor : NSObject/*** 标识当前 VC 渲染完成* 若始终未调用此方法,则使用 viewDidAppear 为结束时间* @param vc 对应 VC 对象*/+ (void)endVCRender:(UIViewController *)vc;/*** 添加一组 Spans 为当前 vc* @param Spans 添加的 Spans* @param vc 对应 VC 对象*/+ (void)addSpans:(NSArray<RMSpan *> *)Spans forVC:(UIViewController *)vc;@end
日志说明
成功开启后,会在 SDK 启动时,输出的模块开启日志中包含对应的模块名称:
[Bugly][Event][BuglyDAUReporter.m:100][SDK setup] Activate Module:("launch.page_launch"...)
同理,上报日志中,包含如下信息:
[Bugly][Event][RMReportQueue.m:601][Report] [launch.page_launch] report id:xxx error:(null)
数据分析
以下内容以 Android 平台页面性能模块为例进行说明,iOS 可参考如下内容进行分析。
指标分析
在指标分析页面,我们可以了解到如下的指标信息:
页面渲染耗时的平均值和分位值。
页面加载耗时的平均值和分位值。
秒开率:页面渲染耗时小于1秒的占比。
慢开率:页面渲染耗时大于3秒的占比。
跳出率:页面启动过程中没等渲染完就退出页面的占比(可以用来统计打开页面后一直白屏,然后用户就选择退出页面的概率)。


耗时分析
耗时分析页面,如页面的整体耗时指标一样,可以清楚地了解每个 Span 的平均值和各个分位值信息,也支持多种筛选项。
