跳到主要内容

应用退出原因

应用退出原因目前仅支持 Android 11/API 30 及以上版本,不支持 Android 11 以下版本。

应用退出原因用于分析 Android 应用进程退出情况,帮助您判断应用是由用户主动终止、系统回收、崩溃、ANR、应用更新覆盖等原因导致退出,并进一步查看影响范围、趋势变化、设备分布和单次退出现场。

通过该功能,您可以快速了解应用退出的情况,如:

  • 当前时间范围有多少用户和设备上报了退出原因。
  • 哪类退出原因占比最高,例如 Java 崩溃退出、Native 崩溃退出、ANR 退出、用户请求终止等。
  • 某个退出原因主要集中在哪些应用版本、操作系统或设备型号。
  • 单次退出发生前用户做了什么,是否可以关联会话回放、异常溯源或 Dump 文件。

进入应用退出原因页面

进入路径:

Mobile / 应用 / 目标应用 / 应用退出原因

进入页面后,顶部展示当前应用、时间范围、刷新间隔等全局工具栏。页面主体包括过滤条件、指标卡、趋势分析、维度分析和应用退出原因列表。

查看核心指标

页面上方展示当前筛选条件下的核心指标:

指标说明
退出次数当前筛选条件下采集到的应用退出次数
退出占比当前筛选条件下应用退出次数 / 应用启动次数
退出用户数当前筛选条件下发生应用退出的用户数
退出用户占比当前筛选条件下发生应用退出的用户数 / 活跃用户数

当您调整时间范围或过滤条件后,指标卡、趋势分析、维度分析和列表数据会同步更新。

使用过滤条件定位问题

点击页面上方的过滤条件栏,可以按应用版本、设备、操作系统、地域、是否用户主动退出、退出原因类型、自定义属性等条件筛选数据。

在“退出原因类型”中,系统会按退出主原因展示,例如:

  • Java 崩溃退出
  • Native 崩溃退出
  • ANR 退出
  • 应用更新覆盖退出
  • 用户请求终止
  • 其他原因

选择某个退出主原因后,可以继续选择对应的退出子原因,例如强制停止、移除任务等。

过滤退出原因类型

筛选条件生效后,页面左上方会展示已选条件标签。点击标签右侧的关闭按钮,可移除该筛选条件。

筛选后的结果

分析退出趋势

趋势分析用于查看应用退出随时间变化的情况。右上角支持切换以下指标:

  • 退出次数
  • 退出占比
  • 退出用户数
  • 退出用户占比

当选择退出次数时,图表以柱状图展示每个时间点的退出次数。切换为退出占比等比例类指标时,图表以折线方式展示变化趋势。

趋势分析

对比应用版本

在趋势分析左上角可以选择对比版本。选择版本后,图表会同时展示全部版本和所选版本的数据,便于判断某个版本是否出现退出异常升高。

选择对比版本

将鼠标悬停在趋势图的数据点上,可查看该时间点的详细数据,例如退出占比、退出次数和启动次数。

查看维度分析

维度分析用于查看应用退出在不同维度下的分布情况。当前支持以下维度:

  • 退出原因类型
  • 应用版本
  • 操作系统
  • 设备型号

维度分析

表格中展示影响设备数、退出用户数、退出次数和占比。您可以根据占比和数量判断优先排查方向。

当未选择具体退出原因类型时,退出原因类型维度展示各主原因的分布。当已筛选某个退出主原因时,该维度会进一步展示该原因下的子原因分布。

查看应用退出原因列表

应用退出原因列表按退出原因 + 退出子原因聚合展示,不按单条日志逐条展示。列表用于快速识别需要重点关注的退出问题。

应用退出原因列表

列表字段说明:

字段说明
退出原因聚合后的退出原因,包含中文名称、系统编码和原因描述
版本该退出原因涉及的应用版本范围
最近上报最近一次采集到该退出原因的时间
发生次数/占比该退出原因的发生次数及占比
影响设备数/占比该退出原因影响的设备数及占比

列表上方支持按字段搜索,例如按进程名称输入关键字搜索。点击导出可导出当前列表数据。

点击列表中的退出原因名称,可以进入退出原因详情页。

查看退出原因详情

退出原因详情页展示某一类退出原因的概览、样本列表、设备信息、退出信息、异常溯源和文件下载。

退出原因详情

概览信息

概览信息展示当前聚合问题的基础统计,包括:

  • 退出原因
  • 系统编码
  • 退出次数
  • 影响设备数

页面右上角支持生成分享链接,便于将当前问题发送给其他成员协同排查。

异常列表

异常列表展示该退出原因下的具体样本。常见字段包括:

  • 异常发生时间
  • UserID
  • 设备 ID
  • App 版本
  • 操作系统
  • 设备型号

点击某条样本后,下方会展示该样本对应的设备现场数据和退出信息。

设备现场数据

设备现场数据用于还原退出发生时的用户和设备环境,包括:

  • UserID、设备 ID、SessionID
  • 启动时间、发生时间、会话时长
  • 应用版本、设备型号、操作系统
  • 地域、运营商、接入方式

这些信息可用于判断问题是否集中在特定用户、特定设备、特定系统版本或特定网络环境。

查看退出信息

在详情页下方选择“退出信息”页签,可以查看当前样本的进程与退出详情,例如:

  • 进程名与 PID
  • 退出时间
  • 退出原因
  • 退出子原因
  • PSS 内存大小
  • RSS 内存大小
  • 描述信息
  • 退出信号
  • importance 信息

这些字段可以帮助判断退出发生时进程状态、退出类型和系统返回的补充信息。

查看异常溯源

选择异常溯源页签,可以查看退出发生前后的用户操作和页面轨迹。页面以时间线方式展示操作名称、页面名称以及距离退出原因发生的时长。

异常溯源

通过异常溯源,您可以观察退出发生前用户是否执行了某个特定操作,例如点击按钮、页面切换、前后台切换等,从而辅助判断退出原因是否与业务操作有关。

下载 Dump 文件

选择文件下载页签,可以下载当前样本关联的文件。

文件下载

仅以下退出类型会携带 Dump 文件:

  • ANR 退出:支持下载与本次 ANR 相关的 Dump 文件( ANR 相应的 trace 文本信息)。

  • Native 崩溃退出:Android 12(API 31)及以上版本支持获取 Native Crash 对应的 tombstone trace 文件。该文件为 Protobuf 编码格式,可参考 Android AOSP 中的 tombstone.proto 结构进行解析。

其他退出类型默认不携带 Dump 文件。如果当前样本未生成可下载文件,文件下载页签可能为空或不展示下载项。

跳转查看会话详情

在退出原因详情页,点击跳转到会话详情,可以进入该样本对应的会话回放详情页。

会话详情

会话详情页可查看:

  • Replay:会话回放
  • Timeline:时间线
  • DevTools:网络请求、资源加载等调试信息
  • Interaction:交互操作和页面事件

当会话中存在退出原因事件时,可以在时间线中查看对应事件,并结合用户操作、页面访问和网络请求进行排查。

退出原因支持类型列表

ApplicationExitInfo.getReason() 返回的整数值。

常量名:应用退出时的常量字段名。

常量名描述备注
0REASON_UNKNOWN未知原因系统最终记录到了进程退出,但没有拿到足够信息去归类到更明确的退出路径。通常表示只有结果,没有完整上下文,常见于补充信息缺失、路径未覆盖或厂商扩展未映射。
1REASON_EXIT_SELF进程主动退出进程是自行结束的,不是被 AMS、LMKD 或系统外部强制杀掉。常见于应用主动调用 System.exit()、native 层调用 exit()/_exit()、守护流程主动收尾等场景。
2REASON_SIGNALED信号终止退出进程收到 Unix signal 后结束,例如 SIGKILLSIGTERMSIGABRT等。它表示“退出是由信号触发”,但不直接说明信号来自系统、内核、shell 还是其他进程,需要结合子原因或日志进一步判断。
3REASON_LOW_MEMORY低内存退出系统进入内存紧张状态后,为释放 RAM 主动终止该进程。常见于 LMKD/AMS 回收后台进程、缓存进程、空进程等内存治理场景,是 Android 最典型的系统被动杀进程原因之一。
4REASON_CRASHJava 崩溃退出进程在 Java/Kotlin 层发生未捕获异常,最终导致主线程或关键线程异常终止,系统将其记录为 Java 崩溃。通常可与 FATAL EXCEPTIONRuntimeExceptionNullPointerException等日志对应。
5REASON_CRASH_NATIVENative 崩溃退出进程在 native 层发生崩溃,例如段错误、非法指令、堆破坏、abort 等,通常会伴随 tombstone、SIGSEGVSIGABRTbacktrace 等信息。适用于 JNI、C/C++ 库、渲染引擎、第三方 so 等异常。
6REASON_ANRANR 退出应用长时间未响应输入、广播、Service 或 ContentProvider 调用后,系统触发 ANR 流程,并可能在用户选择关闭、系统治理或后续恢复过程中终止该进程。
7REASON_INITIALIZATION_FAILURE初始化失败退出进程在创建早期阶段就失败了,例如 Application初始化、关键系统依赖准备、进程绑定、运行时启动等步骤异常,导致系统认为该进程未能成功建立运行态。
8REASON_PERMISSION_CHANGE权限变化退出应用运行期间其关键权限状态发生变化,例如权限被撤销、受限策略变化或用户/系统修改授权状态,系统为了让新权限状态生效,主动结束现有进程。
9REASON_EXCESSIVE_RESOURCE_USAGE资源占用过高退出应用在 CPU、内存、Binder、广播、后台行为等方面占用或消耗异常,达到系统治理阈值后被终止。它强调资源滥用或过度占用,不一定只指内存。
10REASON_USER_REQUESTED用户请求终止用户层面触发的显式终止动作,例如设置页强行停止、某些系统界面的清理动作、从最近任务中移除后触发的关联杀进程等。它表示退出符合用户意图
11REASON_USER_STOPPED用户停止进程通常对应用户对应用、用户空间或相关运行实体执行了更强语义的“停止”操作,不只是一次普通杀进程,而是带有停止其继续运行、继续拉起或继续保活的系统语义。
12REASON_DEPENDENCY_DIED依赖进程死亡退出当前进程所依赖的关键宿主、沙箱、zygote 派生关系、绑定服务或关联进程先死亡,导致该进程失去继续运行条件,系统因此连带终止它。
13REASON_OTHER其他原因系统确认退出原因不属于已定义主类,或当前路径选择统一归到兜底分类。比 UNKNOWN更偏向有原因但未单独立项/未公开暴露
14REASON_FREEZERFreezer 终止退出与进程冻结机制有关。应用在被冻结、解冻或冻结态通信治理过程中出现异常或不再适合继续保留时,系统以 Freezer 路径结束进程,常要结合对应 subreason 一起看。
15REASON_PACKAGE_STATE_CHANGE应用状态变更退出应用包状态发生变化,例如启用/禁用、组件开关变化、策略调整等,而调用路径未要求保留现有进程,系统就会直接终止正在运行的进程以让新包状态立即生效。
16REASON_PACKAGE_UPDATED应用更新覆盖退出应用安装新版本、覆盖安装、分包更新或系统替换组件时,旧进程继续运行会持有旧代码和旧资源,因此系统通常先杀掉旧进程,再让后续启动进入新版本环境。
  • 退出子原因

值、常量名ApplicationExitInfo.toString() 返回的值、常量字段名。

常量名描述备注
0SUBREASON_UNKNOWN未知子原因系统没有拿到更具体的子原因,或者当前杀进程路径没有补充细分类别时使用。通常只能确定“大类 reason”,无法再细分到具体场景。
1SUBREASON_WAIT_FOR_DEBUGGER等待调试器进程启动后进入“等待调试器连接”状态,长时间未继续执行,最终被系统作为特殊状态进程处理。常见于开发调试、断点挂起或 waitForDebugger场景。
2SUBREASON_TOO_MANY_CACHED缓存进程过多系统检测到缓存进程总量过多,为了回收内存、压缩 LRU 队列或维持后台进程数量上限,主动淘汰一部分缓存进程。重点是“缓存进程数量超标”。
3SUBREASON_TOO_MANY_EMPTY空进程过多空进程数量超过系统阈值时触发。空进程通常已经没有活动组件,仅保留进程壳,系统会优先清理这类进程以降低内存占用。
4SUBREASON_TRIM_EMPTY空闲进程释放系统进行空进程裁剪时触发,表示该进程被当作“可直接回收的空闲空进程”清理掉。它更偏向一次常规的后台瘦身动作。
5SUBREASON_LARGE_CACHED缓存进程过大某个缓存进程本身占用内存过大,即使缓存进程总量未必超标,也可能因单进程体积过大而被优先回收。重点是“单个缓存进程太大”。
6SUBREASON_MEMORY_PRESSURE内存压力系统整体处于内存紧张状态,AMS/LMKD/内存回收链路选择终止该进程以缓解压力。它是较典型的“因系统缺内存而被动牺牲”。
7SUBREASON_EXCESSIVE_CPUCPU 占用过高进程持续高 CPU 占用、异常抢占计算资源,影响系统流畅性或电量表现时,系统可能直接结束该进程。更偏向“资源使用异常治理”。
8SUBREASON_SYSTEM_UPDATE_DONE系统更新完成系统升级、组件更新或某些系统级切换完成后,为了让新代码/新资源生效,系统回收旧进程实例,避免继续运行旧环境。
9SUBREASON_KILL_ALL_FG杀死全部前台进程系统执行一次“清空前台相关进程”的特殊操作时使用。不是普通后台回收,而是针对前台可见/前台关联进程的集中终止。
10SUBREASON_KILL_ALL_BG_EXCEPT杀死后台进程系统批量清理后台进程,但会保留白名单、关键进程或当前指定豁免对象。常见于极限内存回收、系统维护或特定清理策略。
11SUBREASON_KILL_UID杀死指定 UID系统不是只杀单个 PID,而是按 UID 维度清理整组进程。也就是说同一应用或同一 UID 下的多个进程可能一起被处理。
12SUBREASON_KILL_PID杀死指定 PID明确针对某个具体 PID 执行终止操作。相比 KILL_UID,这里是精确打点到单一进程实例。
13SUBREASON_INVALID_START启动失败进程启动流程失败,例如依赖状态不满足、启动参数异常、拉起后立即失败等,系统因此中止该次启动并清理对应进程。
14SUBREASON_INVALID_STATE无效状态进程处于系统认为不合法或不一致的状态,例如生命周期、调度状态、组件状态异常,继续保留可能带来风险,因此被清理。
15SUBREASON_IMPERCEPTIBLE后台不可感知进程被杀进程已处于对用户“不可感知”的后台状态,同时系统资源紧张或前台负载较高,系统优先回收这类对当前用户体验影响最小的进程。
16SUBREASON_REMOVE_LRULRU 进程移除系统根据最近最少使用(LRU)策略,从后台队列尾部移除较久未使用的进程。它体现的是“按历史使用热度淘汰”。
17SUBREASON_ISOLATED_NOT_NEEDED孤立进程不再需要隔离进程(isolated process)完成任务后不再需要继续存在,例如服务调用结束、临时沙箱任务结束,系统主动清理。
18SUBREASON_CACHED_IDLE_FORCED_APP_STANDBY强制待机缓存进程终止应用已被强制置入待机/受限状态,同时进程又处于缓存且空闲较久,系统认为没有继续保留价值,因此执行终止。
19SUBREASON_FREEZER_BINDER_IOCTLFreezer Binder IOCTL进程处于 freezer/frozen 相关状态时,Binder IOCTL 交互出现问题,说明该冻结进程已不适合继续参与 IPC,系统因此结束它。
20SUBREASON_FREEZER_BINDER_TRANSACTIONFreezer Binder 事务进程冻结期间发生 Binder 事务异常,例如目标端已死、事务无法完成、冻结状态下通信不可恢复等,系统以此为子原因终止进程。
21SUBREASON_FORCE_STOP强制停止进程是被“强制停止”路径杀死的,通常对应设置页 force stop、系统/设备管理策略、某些包管理操作引发的强杀。它强调“不是普通回收,而是强停语义”。
22SUBREASON_REMOVE_TASK移除任务用户或系统移除了任务栈/最近任务后,和该任务强关联的进程被一并清理。常见于“从最近任务划掉后触发的进程回收”。
23SUBREASON_STOP_APP停止应用应用被执行了“停止应用”动作,语义上比普通后台回收更强,通常意味着系统明确要求该应用退出运行态。
24SUBREASON_KILL_BACKGROUND后台被杀进程因后台清理策略被杀,通常说明它已不在前台、也不属于当前需要重点保活的对象,是一种常见的后台治理型终止。
25SUBREASON_PACKAGE_UPDATE包更新过程被杀应用安装、升级、替换、覆盖安装或系统组件更新过程中,为避免旧进程继续占用旧代码/旧资源,系统会先杀掉现有进程再完成更新。
26SUBREASON_UNDELIVERED_BROADCAST未投递广播移除存在尚未送达或无法继续投递的广播记录,系统在清理相关状态时顺带终止该进程,避免遗留广播队列或不一致状态。
27SUBREASON_SDK_SANDBOX_DIEDSDK Sandbox 崩溃与 SDK Sandbox 相关的进程已经崩溃或异常退出,宿主侧记录该子原因,用于表明这不是普通应用逻辑退出,而是沙箱侧先发生故障。
28SUBREASON_SDK_SANDBOX_NOT_NEEDEDSDK Sandbox 清理SDK Sandbox 完成任务后已无继续存在必要,系统回收该沙箱进程。更偏向生命周期结束后的正常清理。
29SUBREASON_EXCESSIVE_BINDER_OBJECTSBinder 对象超标进程持有或创建的 Binder 对象数量异常偏多,可能导致内核资源压力、句柄膨胀或稳定性风险,因此系统触发保护性终止。
30SUBREASON_OOM_KILLOOM 直接杀死进程被低内存杀手直接按 OOM 路径杀死,说明系统已经进入较强的内存回收阶段。它比一般 MEMORY_PRESSURE更接近“直接内存淘汰”。
31SUBREASON_FREEZER_BINDER_ASYNC_FULLFreezer 异步 Binder 队列满冻结进程对应的异步 Binder 队列已满,新的异步事务无法继续排入,说明该进程在冻结状态下已形成通信阻塞风险,因此被系统处理掉。
32SUBREASON_EXCESSIVE_OUTGOING_BROADCASTS_WHILE_CACHED缓存态外发广播过多进程虽然处于缓存态,但仍大量向外发送广播,行为不符合其后台缓存预期,系统认为其后台活动异常,因而执行清理。

配置退出原因采集

如果页面没有退出原因数据,请先确认应用配置中已开启退出原因采集。

进入路径:

Mobile / 应用 / 目标应用 / 应用设置 / 安全设置

异常模块中找到退出原因,开启开关后即可采集退出原因数据。页面还支持设置文件阈值,默认值为 1024 KB,阈值范围[0,5120]。超过阈值的文件将被丢弃。

退出原因配置

配置变更后,需等待 SDK 上报新数据,页面才会展示对应分析结果。

常见问题

为什么没有应用退出原因数据?

请检查以下事项:

  • 当前应用是否为 Android 应用。
  • 设备系统版本是否为 Android 11/API 30 及以上。
  • 应用设置中是否已开启退出原因采集开关。
  • 当前时间范围内是否有退出原因上报。
  • 过滤条件是否过窄,可尝试清空筛选条件后重新查看。

为什么某些退出子原因显示为未知子原因?

当系统未返回明确子原因,或平台暂未识别该子原因时,会展示为未知子原因。此时仍可结合退出主原因、描述信息、退出信号、设备现场数据和异常溯源继续排查。

退出占比是如何理解的?

退出占比用于衡量应用退出在启动中的占比。占比升高通常表示当前时间范围内应用退出问题增多,需要结合退出原因类型、应用版本、操作系统和设备型号进一步分析。

用户请求终止是否一定代表用户主动退出?

不一定。用户请求终止通常表示应用被用户或系统以用户请求相关方式终止,例如强制停止、从最近任务移除等。建议结合退出子原因、异常溯源和会话详情判断具体场景。

Java 崩溃退出和 Native 崩溃退出有什么区别?

Java 崩溃退出通常表示 Java 层异常导致进程退出;Native 崩溃退出通常表示 Native 层崩溃导致进程退出。仅 Android 12/API 31 及以上版本的 Native 崩溃退出支持携带 Dump 文件。

为什么没有 Dump 文件?

仅 ANR 退出和 Android 12/API 31 及以上版本的 Native 崩溃退出会携带 Dump 文件。其他退出类型,或 Android 12 以下版本的 Native 崩溃退出,默认不提供 Dump 文件下载。

排查建议

当发现退出问题升高时,建议按以下顺序排查:

  1. 先查看指标卡,确认退出次数、退出占比、退出用户数是否异常。
  2. 在趋势分析中确认异常升高的时间点。
  3. 切换维度分析,查看是否集中在某个退出原因、应用版本、操作系统或设备型号。
  4. 在应用退出原因列表中进入占比较高的问题详情。
  5. 查看异常列表和设备现场数据,确认受影响用户和设备环境。
  6. 查看退出信息、异常溯源和会话详情,定位退出前的操作路径。
  7. 如有关联文件,下载 Dump 文件进一步分析。