Android 应用稳定性优化实战指南
对稳定性的理解
应用稳定性是衡量 APP 质量的核心指标之一,也是构建体系中的基本盘。如果应用的稳定性出现问题,对产品口碑和用户留存造成的伤害往往是致命的。本文将从稳定性指标、Crash 处理流程、全链路治理策略、高可用性建设以及面试常见问题等方面,系统性地整理 Android 稳定性优化的知识体系。
需要说明的是,广义的稳定性不仅仅包含崩溃问题,还包括卡顿(Jank)、耗电异常、发热严重等性能指标。但本文主要聚焦于崩溃率(Crash Rate)的角度进行深入探讨,因为这是最直接影响用户体验和留存的因素。
稳定性常见指标分类
异常分类:Exception 与 ANR
Android 的崩溃问题主要分为两大类:Exception 和 ANR。
- Exception:应用内部代码发生未捕获的异常。
- JE (Java Exception):在 Java 代码中发生的未捕获异常,如 NullPointerException, ClassCastException 等。
- NE (Native Exception):在 Native 代码中访问非法地址,程序主动 abort 等导致的崩溃。
- ANR (Application Not Responding):应用无响应。通常是因为主线程被阻塞超过一定时间(默认 5 秒),不一定是代码逻辑直接导致的 Crash,但会导致用户感知到应用卡死。
JE、NE、ANR 既可以独立统计,也可以汇总后作为总体崩溃率进行监控。
PV 与 UV
PV 和 UV 是衡量应用软件使用量的基础指标,也是计算崩溃率的分母依据。
- PV (Page View):指页面的全部展示量,不区分用户。如果一名用户打开了 100 次页面,PV=100。
- UV (Unique Visitor):指对用户去重后的访问量统计。如果一名用户打开了 100 次页面,UV=1。
因此,崩溃率在 PV 和 UV 两个维度上都可以进行统计:
- PV Crash:评估问题影响严重程度,反映单位请求下的失败概率。
- UV Crash:评估问题在用户群体内的影响范围,反映有多少比例的用户遇到了问题。
增量崩溃率与存量崩溃率
- 增量崩溃:由当前新增代码或近期变更导致的崩溃。这是导致大盘崩溃率发生波动的主要原因。处理策略应为重要且紧急,需早发现早解决,避免带到线上成为存量崩溃。
- 存量崩溃:由存量代码引起,通常是历史遗留问题。是需要持续跟进的问题,解决存量崩溃有助于拉低线上大盘的崩溃率。处理策略为重要不紧急,需制定计划定期整治。
崩溃率评价指标
统计口径通常为:
- 分子:
JE + NE + ANR发生总次数 - 分母:PV(日活跃用户数或启动次数)
行业通用标准参考:
<2‰为合格<1‰(万级)为优秀
处理 Crash 的一般步骤
在处理 Crash 时,核心分为采集现场数据和分析崩溃原因两个步骤。能够复现的崩溃才是好崩溃,现场信息保留着排查问题的关键线索。
采集现场数据
根据层级的不同,将现场信息分为崩溃本身、运行时状态、系统状态三个层级。成熟的崩溃采集平台(如 Bugly、Sentry)可以覆盖大部分内容,但应用开发者仍需上传用户操作日志等自定义信息以辅助定位。
崩溃本身
主要是崩溃堆栈和进程、线程信息。
- 崩溃堆栈:这是最重要的信息,反映了崩溃时函数的调用栈。如果代码经过混淆,堆栈信息里的类名和方法名需要经过反混淆后才能进行分析,因此保存打包时的 mapping 文件至关重要。


