4. 稳定性度量指标

在智能座舱Android稳定性工程中,度量指标是判断系统是否“稳”的唯一客观依据。没有指标,稳定性治理就会退化为“凭感觉修Bug”;有了指标,才能把模糊的“偶发卡死”转化为可追踪、可对比、可验收的工程数据。本章围绕崩溃率、ANR率、重启率、可用性、MTBF、MTTR六个核心指标,讲清定义、采集口径与落地方法。

一、核心指标定义与计算口径

六个指标可分为三类:故障频度类(崩溃率、ANR率、重启率)、可用性类(可用性)、时间类(MTBF、MTTR)。它们共同构成稳定性度量的“频度—时长—可用”三角。

指标定义计算公式典型采集来源
崩溃率单位使用量内发生崩溃的次数崩溃次数 / 使用时长或启动次数Crash日志、tombstone、Bugly/Firebase
ANR率单位使用量内发生ANR的次数ANR次数 / 使用时长或启动次数/data/anr/traces.txt、DropBox
重启率单位使用量内系统或应用重启次数重启次数 / 运行时长bootlog、sys.boot_completed、Watchdog
可用性系统可正常服务的时间占比可用时长 / 总时长 × 100%心跳探针、健康检查
MTBF平均无故障工作时间总运行时长 / 故障次数故障事件表 + 运行时长
MTTR平均故障恢复时间总恢复耗时 / 故障次数故障工单、恢复时间戳
口径统一是度量可信的前提。崩溃率按“次/千小时”还是“次/千次启动”,MTBF是否包含计划内重启,必须在项目初期写入稳定性规范,否则跨版本数据不可比。

二、指标采集方法与数据链路

指标不是算出来的,而是采出来的。智能座舱的采集链路通常分为端侧埋点、日志落盘、上报聚合、看板呈现四层。下图展示了六个指标从故障发生到指标呈现的完整数据流。

智能座舱稳定性指标采集数据流 故障源 Java/Native崩溃 ANR、Watchdog重启 端侧埋点 CrashHandler ANR监听、BootCounter 日志落盘 tombstone / traces DropBox / bootlog 上报聚合 云端/本地 指标计算 指标计算层 崩溃率 次/千小时 ANR率 次/千小时 重启率 次/千小时 可用性 百分比 MTBF 小时 MTTR 分钟 稳定性看板与告警 版本对比 · 趋势分析 · 阈值告警 · 根因定位

采集实现上,崩溃可通过Thread.setDefaultUncaughtExceptionHandler捕获Java异常,Native崩溃依赖tombstone;ANR由系统在/data/anr/traces.txt写入堆栈,也可通过ActivityManager监听;重启则通过sys.boot_completed属性变化或BootCounter计数。以下是一个简化的崩溃埋点示例:

public class CrashCollector implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        // 1. 记录时间戳、进程名、版本号
        CrashEvent event = new CrashEvent(
            System.currentTimeMillis(),
            Process.myPid(),
            BuildConfig.VERSION_NAME,
            Log.getStackTraceString(e));
        // 2. 落盘到本地队列,避免上报失败丢失
        CrashStore.enqueue(event);
        // 3. 交给默认处理器,保留系统行为
        defaultHandler.uncaughtException(t, e);
    }
}

三、典型场景:从指标异常到根因定位

某座舱项目在OTA后崩溃率从0.3次/千小时升至1.8次/千小时,ANR率同步上升。团队按指标链路排查:先看崩溃率的分进程分布,发现集中在com.android.systemui;再看ANR traces,主线程阻塞在Binder调用;最终定位为新增的车辆信号订阅接口在熄火场景下未释放,导致Binder线程池耗尽。修复后崩溃率回落至0.25,MTTR从平均45分钟降至12分钟。

这个案例说明:指标异常是入口,不是结论。崩溃率告诉你“变差了”,ANR traces告诉你“卡在哪”,MTBF和MTTR告诉你“影响多大、恢复多快”。三者结合才能形成闭环。

常见误区:只盯崩溃率,忽略ANR率。座舱场景中,ANR往往比崩溃更影响体验——屏幕卡死但系统未崩溃,用户无法操作,实际可用性已下降。必须将ANR率与可用性联合考核。

四、指标目标设定与复盘要点

指标需要目标值才有治理方向。建议按阶段设定:

  • 崩溃率:量产阶段目标 ≤ 0.5次/千小时,开发阶段可放宽至2次/千小时用于暴露问题。
  • ANR率:量产目标 ≤ 0.3次/千小时,重点监控主线程Binder与IO阻塞。
  • 重启率:系统级重启 ≤ 0.1次/千小时,应用级重启单独统计。
  • 可用性:座舱核心服务可用性 ≥ 99.9%,即每月不可用不超过43分钟。
  • MTBF:目标 ≥ 500小时,反映系统长期稳定能力。
  • MTTR:目标 ≤ 30分钟,含故障发现、定位、恢复全流程。

复盘时需注意三点:一是口径一致性,跨版本对比前确认统计窗口和分母相同;二是样本量,低样本下的指标波动大,需结合置信区间判断;三是归因准确性,重启率上升可能源于Watchdog误杀而非真实故障,需结合bootlog区分“计划内重启”与“异常重启”。

稳定性度量的本质不是追求数字好看,而是建立“故障可发现、影响可量化、恢复可追踪”的工程能力。六个指标各司其职:崩溃率与ANR率看频度,重启率看系统韧性,可用性看服务承诺,MTBF看长期可靠性,MTTR看应急响应。只有把它们放进同一条数据链路和同一套口径中,才能真正驱动稳定性改进。