应用被查杀问题检测方法
===========

#### 概述

应用闪退是指应用使用过程中突然发生了预期之外的异常终止。当应用行为异常，比如消耗CPU、内存等系统资源过多时，系统为了保持整机处于健康状态，会按照一定规则挑选应用进行查杀，一般是从服务进程向应用发出SIGKILL信号（信号值是9）来实现查杀的，而操作系统对SIGKILL默认的行为是不会生成栈日志等维测信息的，这就会造成应用闪退而在faultlogger中无日志的情况。

应用退出一般包含如下几种情况：

1.  有维测日志场景：
    1.  应用自身发生异常或者主动抛出异常的行为，例如因SIGSEGV、SIGABRT触发的CPP\_CRASH异常，这类问题可被系统监控，并有维测日志。
    2.  应用发生主线程阻塞、生命周期超时、按键无响应，一般来说会出现界面冻结，通常会生成APP\_FREEZE日志。
    3.  应用资源使用过度，可能会触发系统管控查杀。如果应用资源申请处于系统容忍范围（未造成整机资源不足、卡死等问题），比如内存泄漏速度比较慢，系统管控一般会提供较为详细的RESOURCE\_OVERLIMIT维测信息；如果是应用资源申请过快导致整机资源不足，比如单应用快速申请（rss、ion、gpu内存）超过整机内存的1/3，导致整机出现低内存，系统会对应用进行管控，同步提供部分基础的RESOURCE\_OVERLIMIT维测信息。
2.  无维测日志场景：
    1.  如果是整机资源不足，比如整机低内存，系统为了迅速缓解内存紧张，会按照特定规则连续查杀多个应用，这时候也不会有维测日志。
    2.  用户主动终止应用，比如在任务列表中点击清理按钮以清除所有应用，或上划以清除单个应用，这种情况下不会生成栈等维测日志。
    3.  应用开发者主动调用exit系统调用时，这种情况下不会生成栈等维测日志。
        
        应用被查杀，运行态可通过HiAppEvent订阅[应用查杀事件](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-killed-events)进行检测。
        

#### 实现原理

内核以及部分服务进程都会对系统整体资源做监控，发现异常后挑选应用进行查杀，系统会在所有触发应用查杀的地方加上系统事件打点，打点事件中会带上uid、包名、前后台信息、查杀原因、维测信息。hiview服务进程收集到这些打点事件后，解析出包名，然后匹配各个应用的订阅情况，如果应用订阅了，则发布到相应应用的沙箱目录下，应用就能收到查杀事件了。

#### 约束和限制

1.  应用要能收到查杀事件，必须要先通过HiAppEvent订阅。
2.  查杀事件发布给应用是异步的行为，需要应用下次启动后才能收到。
3.  目前系统的查杀行为会随着版本演进持续新增，不能保证现在的查杀机制就是系统的全集。

#### 场景

目前系统里可能会存在如下触发应用查杀的场景：

1.  应用的内存、CPU和IO类负载超过一定限额，文件句柄超标、线程数量超标。
2.  整机低内存，会按照一定规则对应用查杀。
3.  功耗类的查杀，比如应用binder调用导致频繁唤醒、audio放音录音导致无法冻结、gps或者蓝牙等外设使用异常等等。