数据上报验证

最近更新时间:2025-08-14 15:29:52

我的收藏

前提条件

崩溃、ANR、OOM 是100%上报,默认开启,但不支持采样。除崩溃、ANR、OOM 外,其他监控项默认关闭,且支持采样。一般情况下,性能指标监控默认开启,性能异常监控默认关闭,用户可以通过 SDK 配置调整开启情况。在接入时,请务必确认功能的开启情况符合您的预期。
需要在 终端性能监控 Pro > 应用配置 > SDK 配置 页面创建配置任务。有关配置功能的详细说明,请参见 SDK 配置
在接入期间,建议将所有监控项的采样率调整为1.0(即 sample_ratio 和 event_sample_ratio),方便验证数据上报。接入完成后,可再根据需要调整采样率。或者创建多个配置任务,根据版本类型(对应初始化的 BuglyBuilder#appVersionType),配置开发任务、灰度任务,以及正式任务。开发任务打开所有的监控项,灰度阶段按需采样,正式发布根据需要降低采样。
检查待接入的产品是否已经 购买并绑定 生效中的资源包。如果产品没有绑定生效中的资源包,该产品将无法上报数据。

崩溃监控

崩溃监控是通过捕获应用运行时的异常和错误(如 Java 异常或 native 崩溃),收集崩溃日志和堆栈信息,帮助开发者定位和修复问题,提高应用稳定性。

模拟异常

初始化完成后,可以模拟 Java 异常,或 Native 异常来验证 SDK 的上报情况。
崩溃发生后,部分异常问题需要在第二次启动才能完成上报,为保证当次崩溃处理完成,二次启动的时间与崩溃发生时间最好间隔10s以上。上报可能存在延时,测试时建议手动多触发数次后,再刷新展示界面。
Bugly.testCrash(Bugly.JAVA_CRASH); // 模拟 Java 异常

Bugly.testCrash(Bugly.NATIVE_CRASH); // 模拟 Native 异常

检查数据上报

崩溃上报后,可在 崩溃 > 问题列表 查看上报问题。


ANR 监控

Android 的 ANR 监控是通过检测应用主线程长时间无响应(如5秒内未处理输入事件),记录和上报相关堆栈信息,帮助开发者定位和优化卡顿问题。

模拟异常

跟崩溃类似,可以通过终端性能监控 Pro 提供的测试接口来模拟 ANR,也可以自行在 UI 线程执行异常耗时任务。
接口模拟 ANR。
Bugly.testCrash(Bugly.ANR_CRASH); // 模拟 ANR
在 UI 线程执行以下耗时逻辑,触发 ANR。
private void testANR(){
try {
Thread.sleep(30000);
} catch (Exception e){
// do nothing
}
}

检查数据上报

ANR 上报后,可在 ANR > 问题列表 查看上报问题。


错误监控

错误一般是指用户自定义的异常,如已经捕获的 Java 异常,或者 C#异常、JS 异常、lua 异常等。一般通过终端性能监控 Pro 的 handleCatchException 或者 postException 来上报(详细参考其他接口/上报自定义异常或者上报 Java catch 异常部分)。

检查 SDK 配置

验证数据上报前,请在 应用配置 > SDK 配置 中检查错误的采样情况。


SDK 接入

应用可以通过终端性能监控 Pro 提供的 handleCatchException 和 postException 接口上报自定义错。
上报 Java 捕获异常,可以参考以下示例代码。
private void testJavaCatchError(){
String content = "a illegal string.";
try {
JSONObject jsonObject = new JSONObject(content);
double price = jsonObject.getDouble("price");
} catch (Throwable t) {
Bugly.handleCatchException(Thread.currentThread(), t,
"in test code for json parse fail.", content.getBytes(), true);
}
}
上报自定义异常,参考以下示例代码。
Bugly.postException(4, "testErrorType", "testErrorMsg", "testStack", null);

检查数据上报

错误上报后,可在 错误 > 问题列表 查看上报问题。


启动监控

在开启启动监控的情况下,启动模块会自动安装监控,并且在 SDK 初始化后,进行启动数据上报。用户可以通过 Bugly.reportAppFullLaunch 接口自定义启动结束点,也支持自定义标签以及通过打点接口,监控启动过程中的耗时任务。

检查 SDK 配置

验证数据上报前,请在 应用配置 > SDK 配置 中检查启动的采样情况。


SDK 接入

请查看 API 说明-启动监控 部分了解更多启动接口的使用。
private void costJobOne() {
AppLaunchProxy.getAppLaunch().addTag("has_cost_job_one");
AppLaunchProxy.getAppLaunch().spanStart("costJobOne", null);
try {
Thread.sleep(300);
} catch (Throwable t) {
Bugly.handleCatchException(Thread.currentThread(), t, "costJobOne sleep fail", null, true);
}
AppLaunchProxy.getAppLaunch().spanEnd("costJobOne");
}
private void finalJob() {
AppLaunchProxy.getAppLaunch().reportAppFullLaunch();
}

检查数据上报

数据上报后,可在 启动 > 启动个例 查看上报详情。


卡顿监控

应用卡顿是导致用户流失的重要原因之一,卡顿监控模块致力于协助用户治理卡顿问题。卡顿治理的一个重要思路是,通过提取有效的指标衡量应用当前的状况,抓取足够的信息提供优化方向。卡顿监控模块通过 FPS 及挂起率两个指标来衡量应用的流畅度情况,通过卡顿问题监控,直接抓取卡顿堆栈,协助用户定位卡顿原因,为用户提供优化方向。
卡顿指标通过稳定、轻量的采集技术,收集应用在整个运行过程中的流畅度数据。
卡顿问题监控,通过高频抓栈技术,提供丰富的现场信息,实现准确归因。
Android 平台自研快速抓栈技术,对比传统抓栈实现,性能提升6倍。
无论是卡顿指标,还是卡顿问题,都支持用户自定义采样率,同时提供了丰富的数据分析能力。

检查 SDK 配置

在验证数据上报前,请先检查 应用配置 > SDK 配置 中卡顿的配置情况。

卡顿指标:FPS 及挂起率
在开启卡顿指标("looper_metric")的情况下,SDK 会在初始化完成后,监控应用的流畅度情况。在应用运行一次期间,会先收集数据,并保存至本地,下次启动时再聚合上报。为了避免影响应用的启动,SDK 会在初始化5分钟后,再将缓存的数据聚合上报后台。
FPS:帧率,在应用运行时,GPU 和 CPU 合作可产生的图像的数量,计量单位是帧/秒(FramePerSecond,FPS),通常是评估硬件性能与应用体验流畅度的指标。
挂起率:如果应用两帧之间的刷新延时超过200ms,则认为此时应用不能很好地响应用户的交互,累加到挂起时间中。一个设备的挂起率,指这个设备在一天中,总的挂起时间除以其前台总时长,单位是秒/小时。
说明:
可以通过在 Demo 中测试滑动卡顿来观察列表滑动情况下的 FPS 以及挂起率。您可在 终端性能监控 Pro > 应用列表 页面右上角选择终端性能监控 Pro Demo

卡顿监控
开启卡顿监控("looper_stack")后,在 UI 线程执行耗时逻辑,耗时超过500ms的情况下,会触发卡顿上报。卡顿监控通过监控 UI 线程的消息执行来判断当前 UI 线程是否发生卡顿。
在验证阶段,建议将卡顿监控的"event_sample_ratio"(消息采样率)以及"sample_ratio"(设备采样率)都设置为1。这样只要满足卡顿的耗时阈值,即可触发卡顿上报。

模拟异常

参考以下示例代码模拟一个卡顿上报。
private void testLongLag() {
showToast("测试长卡顿");
sleep(200);
callFunctionA();
callFunctionB();
}

private void callFunctionA() {
sleep(400);
callFunctionB();
}

private void callFunctionB() {
sleep(300);
}
private static void sleep(long timeInMs) {
try {
Thread.sleep(timeInMs);
} catch (Throwable t) {
Bugly.handleCatchException(Thread.currentThread(), t, "sleep", null, false);
}
}

检查数据上报

卡顿上报后,可在 卡顿 > 问题列表 查看上报问题。


内存监控

内存监控当前支持内存峰值和内存详情功能,更多内存监控功能在建设中。

内存峰值

内存峰值是指,应用在整个运行期间的内存使用峰值。终端性能监控 Pro 通过定时任务,查询应用的内存使用情况,并且保存整个运行期间的最大使用量,应用下次启动后再上报。
物理内存峰值:一次运行期间,应用使用的物理内存峰值,即 PSS 峰值。
虚拟内存峰值:一次运行期间,应用使用的虚拟内存峰值,即 VSS 峰值。
Java 堆内存峰值:一次运行期间,应用所使用的 Java 堆内存峰值。

内存详情

在初始化 SDK 时,需要在 BuglyBuilder 中主动添加监控项 BuglyMonitorName.MEMORY_JAVA_CEILING。
public static void initBugly(Context context) {
// 1. 初始化参数预构建,必需设置初始化参数
String appID = "xxxxxxx"; // 【必需设置】在终端性能监控Pro 创建产品的appID
String appKey = "xxxxxxxxxxx"; // 【必需设置】在终端性能监控Pro 创建产品的appKey
BuglyBuilder builder = new BuglyBuilder(appID, appKey);
......

// 2. 开启Java内存详情
build.addMonitor(BuglyMonitorName.MEMORY_JAVA_CEILING);

// 3. 初始化,必需调用
Bugly.init(context, builder);
}
应用配置 > SDK 配置 中修改 SDK 配置任务, 调整 Java 内存详情的配置属性。
sample_ratio: 控制用户采样率,即多少设备会开启这个功能;
event_sample_ratio: 控制事件采样率,即发生内存触顶之后,是否需要上报;
threshold:设置堆转储文件的dump时机,90 代表的是在达到最大值的90%的时候开始dump,堆内存最大值对应 Runtime.getRuntime().maxMemory();


检查数据上报

触发上报后,可在 内存/内存详情 中查看上报问题。


网络监控

网络监控是通过 okhttp3的 EventListener 来监控 HTTP 请求的质量,包含请求耗时、成功率、传输数据量,以及请求过程中重要阶段的耗时。当前通过无插桩的方案实现以下能力:
1. 业务按 SDK 接入指引,使用 BuglyListenerFactory 创建的 OkHttpClient,支持监控 http/https 请求的质量。
2. 提供 BuglyURLStreamHandlerFactory,代理系统原生的 HttpURLConnection,从而支持监控使用系统原生接口实现的 http/https 请求。
说明:
当前暂不支持如下能力:
不使用原生接口或者 okhttp3实现的 HTTP 请求。
组件使用了 okhttp3库实现 HTTP 请求,但是没有调整 OkHttpClient 过程,即没有使用 BuglyListenerFactory 作为 OkHttpClient 的 EventListener.Factory。

检查 SDK 配置

验证数据上报前,请先检查 应用配置 > SDK 配置 中网络监控的配置情况。
网络监控包含以下配置属性:
sample_ratio:设备采样率,表示允许多少设备开启网络监控。
daily_report_limit:表示网络监控的数据上报,每天最多允许上报多少次。网络监控的数据是合并上报的,具体合并的情况由 max_batch_count 和 min_batch_cout 来决定。
max_batch_count:表示一条网络监控的数据上报中,最多包含多少条 HTTP 请求质量的明细数据,默认是100。
min_batch_count:表示一条网络监控的数据上报中,最少包含多少条 HTTP 请求质量的明细数据,默认是50 。


注意:
在自测阶段,推荐修改 sample_ratio 为1,自测结束后,根据实际情况调整设备采样率。
在自测阶段,推荐修改 min_batch_count 为5或者10,这样可以将数据尽快上报到后台。自测结束后,推荐根据业务的实际情况来调整,或者还原为默认值。

SDK 接入

1. 代理系统原生的 HttpURLConnection。如果不想代理使用系统原生接口的 HTTP 请求,则无需执行此步骤。
如果想代理「使用系统原生接口」的Http请求,推荐在 Application#onCreate 时尽早开启代理。
// 开启代理
BuglyURLStreamHandlerFactory.init(okHttpClient);
开启代理后,也可以通过以下代码关闭。
// 关闭代理
BuglyURLStreamHandlerFactory.reset();
2. 创建 OkHttpClient 时,使用 BuglyListenerFactory。
OkHttpClient client = new OkHttpClient.Builder()
.eventListenerFactory(BuglyListenerFactory.getInstance())
.build();

检查数据上报

完成接入后,可在 网络 > HTTP 或者 网络 > 网络错误 查看上报数据。


流量监控

流量监控的核心功能在于它能够实时监控应用程序的数据使用情况。通过实时监控,可以随时了解应用的数据消耗情况,及时发现流量使用异常等问题。这有助于用户避免超出数据计划或产生额外费用。此外,流量监控还能帮助用户优化应用程序的功耗,减少不必要的数据请求,提供更高效的用户体验,并延长设备的电池寿命。流量监控还具备下钻到域名级别的能力,用户可以了解哪些域名或服务消耗了大量的流量,从而采取相应的措施来优化数据传输。

检查 SDK 配置

验证数据上报前,请先检查 应用配置 > SDK 配置 中流量监控的配置情况。流量监控包含流量--10分钟流量流量--单次进程流量两个配置项。


SDK 接入

在客户端,SDK 需要在初始化的时候执行以下语句,同时在后台配置开启流量监控功能,才会真正开启。
...
buglyBuilder.addMonitor(BuglyMonitorName.TRAFFIC);
buglyBuilder.addMonitor(BuglyMonitorName.TRAFFIC_DETAIL);
...
// 初始化Bugly SDK
Bugly.init(application, buglyBuilder);
SDK 还提供了自定义场景流量上报接口。
CustomTrafficStatistic.getInstance().addHttpToQueue(SocketInfo socketInfo);
socketInfo 还有很多其他字段,统计流量只需要给以下字段来赋值,其他成员变量可以暂时忽略。
class SocketInfo {
receivedBytes; // 收到多少字节
sendBytes; // 发送了多少字节
networkType; // 网络类型,WiFi流量填1, 5G流量填2, 无网络情况填3
frontState; // 前后台状态,前台填1,后台填2
host; // 域名,例如www.baidu.com
startTimeStamp; // 网络请求开始时间戳,精确到ms
......
}

检查数据上报

数据上报后,可在 流量 > 指标分析 或者 流量 > 异常分析 中查看数据。


页面性能

在移动应用开发中,用户体验(User Experience,UX)是一个至关重要的因素。随着智能手机硬件性能的提升和用户需求的不断增加,用户对应用的响应速度和流畅度有了更高的期望。特别是在移动端应用中,页面启动时间是用户体验的一个关键指标。页面启动时间过长会导致用户感到不耐烦,甚至可能导致用户流失。

终端性能监控 Pro 的页面启动耗时默认会监控 Activity 的冷启动耗时,耗时信息也分为两类:页面渲染耗时和页面加载耗时。
页面渲染耗时:从 Activity 的 onCreate 调用到第一帧画面渲染完成的时间。
页面加载耗时:其值默认与页面渲染耗时相同,但用户可以通过 reportActivityFullLaunch 接口来自定义 Activity 的加载结束时间。

检查 SDK 配置

验证数据上报前,请先检查 应用配置 > SDK 配置页面性能的配置情况。
sample_ratio:控制用户采样率,即多少设备会开启这个功能,1代表所有设备开启,0代表所有设备都不开。


SDK 接入

客户端在调用 Bugly.init 接口之前,需添加如下代码。
...
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 会覆盖前面的。
可参考以下示例代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

PageLaunchMonitor.getInstance().startSpan(this, "MemoryTracerTest", "");
PageLaunchMonitor.getInstance().startSpan(this, "onCreate", "MemoryTracerTest");
startMemoryTrace();
PageLaunchMonitor.getInstance().endSpan(this, "onCreate");
}

@Override
public 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);
}

检查数据上报

数据上报后,可在 页面性能 > 指标分析 查看上报数据。