本文详细介绍终端性能监控 Pro SDK 的各功能接口,帮助您更加灵活、深度地使用 SDK。
初始化接口
SDK 在初始化时,BuglyConfig 除了设置 appId 和 appKey 以外,还可以设置一系列用户参数。
/// 设置自定义版本号@property (nonatomic, copy) NSString *appVersion;/// 设置自定义设备唯一标识@property (nonatomic, copy) NSString *deviceIdentifier;/// 自定义用户id@property (nonatomic, copy) NSString *userIdentifier;/// build config,用于拉取不同的配置@property (nonatomic, assign) BuglyBuildConfig buildConfig;/// Bugly Delegate@property (nonatomic, assign) id<BuglyDelegate> delegate;
回调接口
设置 Crash 附件信息回调
SDK 处理 Crash 异常时可以回调业务,业务可以在回调中加入自定义的逻辑,或提供额外信息跟随异常一起上报。
/// 允许业务带附件到个例上报中/// @param eventType 个例事件类型/// @param customData 业务自定义字段/// @param eventInfo 个例信息,暂为空- (NSDictionary<NSString *, NSString *> *)attachmentForEvent:(NSString *)eventTypecustomData:(BuglyCustomData *)customDataeventInfo:(NSDictionary *)eventInfo;#### 2. 回调 Crash 信息供设置信息Bugly上报Crash异常时可以回调业务,业务可以在回调中加入自定义的逻辑。``` objective-c/*** 发生异常时回调* @param exception 异常信息* @return 返回需上报记录,随异常上报一起上报*/- (NSString * __nullable)attachmentForException:(NSException * __nullable)exception;
设置日志回调接口
1. 实现一个函数回调方法。
/// 自定义 log 函数static void logger_func(RMLoggerLevel level, const char *log) {//handle sdk log.}
2. 并注册该方法。
// 注册 Bugly 日志输出[Bugly registerLogCallback:logger_func];
其他接口
其他接口的调用均需在 SDK 初始化之后,初始化之前调用无效,SDK 提供其他接口功能如下。
更新设备 ID
/*** 更新设备 id* @param deviceId 设备 id*/+ (void)updateDeviceIdentifier:(NSString *)deviceId;
更新用户 ID
/*** 更新userId* @param userId 用户id*/+ (void)updateUserIdentifier:(NSString *)userId;
获取 SDK 版本号
/*** 获取 SDK 版本信息* @return SDK版本号*/+ (NSString *)sdkVersion;
上报自定义异常
/*** @brief 上报自定义错误** @param category 类型(Cocoa=3,CSharp=4,JS=5,Lua=6)* @param aName 名称* @param aReason 错误原因* @param aStackArray 堆栈* @param info 附加数据* @param terminate 上报后是否退出应用进程*/+ (void)reportExceptionWithCategory:(NSUInteger)categoryname:(NSString *)aNamereason:(NSString *)aReasoncallStack:(NSArray *)aStackArrayextraInfo:(NSDictionary *)infoterminateApp:(BOOL)terminate;
上报自定义错误
/*** 上报错误** @param error 错误信息*/+ (void)reportError:(NSError *)error;
上报 OC 异常
/*** 上报自定义Objective-C异常** @param exception 异常信息*/+ (void)reportException:(NSException *)exception;
设置个例标签
/*** 更新个例标签,需要在 bugly sdk 完成初始化(Bugly setup completeHandler 回调)后调用,否则可能导致数据丢失* SDK版本: 2.7.53.3+* @params tagArr 字符串数组,字符串限长 1024 字节,数组限长 30*/+ (void)updateCaseTags:(NSArray<NSString *> *)tagArr;
设置业务下钻
/*** 更新业务下钻,需要在 bugly sdk 完成初始化(Bugly setup completeHandler 回调)后调用,否则可能导致数据丢失* SDK版本: 2.7.53.3+* @params tagArr 字符串数组,字符串限长 1024 字节,数组限长 30*/+ (void)updateTestTags:(NSArray<NSString *> *)tagArr;
自定义数据
添加自定义数据(Crash 监控)
终端性能监控 Pro 支持业务添加自定义数据,可以保存在 Crash 发生时,或发生前的一些自定义环境信息。自定义数据会随异常一起上报,并在异常个例详情界面的自定义字段中展示。自定义数据最多支持50对 key-value。
/*** 设置关键数据,随崩溃信息上报** @param value KEY* @param key VALUE*/+ (void)setUserValue:(NSString *)value forKey:(NSString *)key;
获取已设置自定义数据,可通过如下接口进行操作。
/*** 获取自定义数据** @return 关键数据*/+ (NSDictionary * _Nullable)allUserValues;
设置/更新自定义文件上传路径(Crash 监控)
终端性能监控 Pro 支持业务上传自定义大文件,并关联至异常个例。自定义文件的上传采用独立于异常上报的通道,对异常处理流程无干扰,且支持配置多个文件。业务可以在发生异常之前的任意时间段,通过如下接口设置/更新文件路径的数组。进程发生异常重启后,会上报这些自定义文件,将上报至异常个例的附件中,展示为 custom_log.zip。
/*** 设置自定义附件的绝对路径的集合。* 文件压缩后的大小不大于10M,二次启动时上报。*/+ (void)setAdditionalAttachmentPaths:(NSArray<NSString *>*)pathArray;
注意:
该接口最多设置10个文件路径。
需上传文件压缩后的大小限制为10MB,若超过该大小,则不会被上传。
该接口可被多次调用,更新的文件路径会覆盖之前的值。
自定义文件的上传时机在进程二次启动时,与异常上报间存在一定延迟。
频繁发生崩溃异常会触发文件清理逻辑,可能会导致文件漏传。
可以通过配置设置自定义文件上传的采样率,配置方式可以参见 SDK 配置。
在崩溃发生时调用此接口无法生效,因此需要业务提前设置路径。
进入/退出自定义场景(性能监控)
在性能监控中,业务可以自定义场景,并根据场景来执行特定的监控或回调操作。使用如下接口来进入、重置自定义场景。
设定自定义场景
/// 更新场景信息/// @param key 场景 id,卡顿、内存、资源监控等功能会根据该值进行聚类+ (void)setScene:(NSString *)key;
重置自定义场景
/// 结束自定义场景信息,继续使用 RMonitor 自动获取的场景信息+ (void)resetScene;
添加/移除自定义数据采集器(性能监控)
终端性能监控 Pro 性能监控模块的自定义设置方式不同于 Crash 监控模块,性能监控模块的自定义数据支持两类:自定义维度和自定义字段。
自定义维度:指由 SDK 指定了三组 Key(详细见
BuglyCustomData.h
),每组10个。应用可以根据需要,选择合适的 Key 上报数据。在控制管理台,用户可以给这些 Key 设置别名,方便查看和分析。对于自定义维度,服务器存储时是每个字段分开存储的。后续可以提供丰富的查询和分析能力。当前支持全局设置,或者数据上报前的回调设置。自定义字段:指 Key 和 Value 都由应用自由设置,SDK 不理解字段的类型,统一作为字符串存储。用户可以在控制管理台,在问题列表和问题详情,通过自定义字段查询包含指定内容的上报。
说明:
全局设置指应用可以随时调用全局设置接口,设置自定义维度,相同key的数据,重复设置表示更新。性能上报在需要上报时,会获取全局缓存的自定义维度数据。
可以通过如下接口来获取默认的全局自定义维度收集回调,并设置全局自定义维度。
/*** 添加自定义上报的 tag, SDK 初始化前调用无效* @param data 需要更新的自定义字段*/+ (void)updateCustomData:(BuglyCustomData *)data;/*** 获取当前自定标签的副本信息,若未设置,返回空* @return 已设置的用户自定义字段*/+ (nullable BuglyCustomData *)currentCustomData;/*** 添加自定义数据为特定的事件上报* @param data 需要更新的自定义字段* @param eventType 对应的事件类型*/+ (void)updateCustomData:(BuglyCustomData *)data forEvent:(BuglyEventTypeName)eventType;/*** 获取特定事件的当前自定义数据* @param eventType 需要获取的事件类型* @return 对应已设置的自定义字段*/+ (nullable BuglyCustomData *)currentCustomDataForEvent:(BuglyEventTypeName)eventType;/*** 使用新的自定义字段更新此自定义数据* @param dict 符合 BuglyCustomData 存储格式的字典信息* @return 返回在次数据基础上更新后的新数据*/- (BuglyCustomData *)customDataByUpdateDict:(NSDictionary *)dict;/*** 获取设置的数字类型的自定义数据* @param key 如果 KEY 不在 NumberParamKey 定义中,直接返回0.0* @return 如果有设置,则返回当前值,如果没有设置,返回0.0*/- (nullable NSNumber *)getNumberParam:(BuglyCustomNumberDataKey)key;/*** 设置数字类型的自定义数据* @param key 如果 KEY 不在 NumberParamKey 定义中,则添加失败* @param param NUMBER VALUE*/- (BOOL)putNumberParam:(nullable NSNumber *)param forKey:(BuglyCustomNumberDataKey)key;/*** 获取设置的字符串类型的自定义数据* @param key 如果 KEY 不在 StringParamKey 定义中,直接返回""* @return 如果有设置,则返回当前值,如果没有设置,返回""*/- (nullable NSString *)getStringParam:(BuglyCustomStringDataKey)key;/*** 设置字符串类型的自定义数据* @param key 如果 KEY 不在 StringParamKey 定义中,则添加失败* @param param 长度不能超过 BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH* value = null, 则会设置空串* value = 长度超标字符串,则会截取前 BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH 个字符设置*/- (BOOL)putStringParam:(nullable NSString *)param forKey:(BuglyCustomStringDataKey)key;/*** 获取字符串数组类型的自定义数据* @param key 如果 KEY 不在 StringArrayParamKey 定义中,则直接返回空列表* @return 如果有设置,则返回相关设置数据,如果没有设置,则直接返回空列表, 返回的 List 不可以修改。*/- (nullable NSArray<NSString *> *)getStringArrayParam:(BuglyCustomArrayDataKey)key;/*** 添加顺序是:A1 -> A2 -> A2 -> A3 -> A4, 这个接口产生的结果类似:[A1, A2, A3, A4]* 为字符串数组类型的自定义数据,增加VALUE* @param key 如果 KEY 不在 StringArrayParamKey 定义中,则添加失败* @param param 非空值,非空串,如果 value 不存在,则添加,如果存在,则直接返回,长度不能超过 BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH*/- (BOOL)addStringToStringArrayParam:(NSString *)param forKey:(BuglyCustomArrayDataKey)key;/*** 从字符串数组类型的自定义数据中,移除 VALUE* @param key 如果 KEY 不在 StringArrayParamKey 定义中,则移除失败* @param param 如果 value 存在,则移除,如果不存在,则直接返回*/- (BOOL)removeStringFromStringArrayParam:(NSString *)param forKey:(BuglyCustomArrayDataKey)key;/*** 添加顺序是:A1 -> A2 -> A2 -> A3 -> A4, 这个接口产生的结果类似:[A1, A2, A2, A3, A4]* 为字符串数组类型的自定义数据,增加VALUE* @param key 如果 KEY 不在 StringArrayParamKey 定义中,则添加失败* @param param 长度不能超过 BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH, 无论是否存在,都会添加,即可以存在重复的 value* @return value 是空值,空串,或者超长,或者已经达字符串数组最大值,返回失败,否则还回成功*/- (BOOL)addStringToSequence:(NSString *)param forKey:(BuglyCustomArrayDataKey)key;
启动监控
定义
冷启动耗时计算规则分为 iOS 15之前的版本和 iOS 15之后的版本两种。
iOS 15以前的版本:冷启动耗时 = 第一帧 UI 上屏时间 - App 进程创建时间。
iOS 15及以上版本:
苹果在 iOS 15上增加了 Prewarming 的新特性,可以预启动进程,导致从“App 进程初始化结束时间”到“
main
函数执行时间”这段时间变得非常不确定。因此冷启动耗时减去中间这段不确定的时间,调整为:冷启动耗时 = 第一帧 UI 上屏时间 - main 函数执行时间 + App 进程初始化结束时间 - App 进程创建时间。API 介绍
自定义场景区间耗时统计
调用
BuglyLaunchMonitorPlugin
的+ (void)startSpan:(NSString *)spanName parentSpanName:(nullable NSString *)parentSpanName
,记录自定义场景开始时间戳。[BuglyLaunchMonitorPlugin startSpan:@"testSpan" parentSpanName:nil];
调用
BuglyLaunchMonitorPlugin
的+ (void)endSpan:(NSString *)spanName
,记录自定义场景区间结束,请务必跟开启打点的spanName相同,否则记为无效数据。[BuglyLaunchMonitorPlugin endSpan:@"testSpan"];
调用
BuglyLaunchMonitorPlugin
的+ (void)endSpanFromLaunch:(NSString *)spanName
,记录从进程创建开始统计的 span 耗时。[BuglyLaunchMonitorPlugin endSpanFromLaunch:@"testSpan"];
设置启动 tag
调用
BuglyLaunchMonitorPlugin
的 - (void)addTag:(NSString *)tagName
,添加一个 tag。调用
BuglyLaunchMonitorPlugin
的 - (void)removeTag:(NSString *)tagName
,删除一个 tag。[BuglyLaunchMonitorPlugin addTag:@"tagTest1"];[BuglyLaunchMonitorPlugin removeTag:@"tagTest1"];
自定义启动结束时间
因为业务特性,业务定义启动结束时间点并不仅是到
CA::Transaction::commit
结束。所以增加 - (void)endColdLaunch
接口用于业务主动调用声明冷启动已经结束,调用该接口会触发启动数据上报,后续更新tag或者span信息将不会生效。如果接口未被调用,退后台、闪退、或者超过一定时间后(默认3分钟)也会触发启动数据上报。
[BuglyLaunchMonitorPlugin endColdLaunch];