前言
app使用的保活主要两大点:保活和复活
保活方案
- 1像素
- 后台无声音乐
- 前台service
- 心跳机制
- socket长连接
- 无障碍服务
复活方案
- 双进程守护(java层和native层)
- JobScheduler 定时任务
- 推送/相互唤醒
进程调度原则
framework中四大组件进程根据组件状态而动态调节自身状态。进程有两个比较重要的状态
- oom_adj,定义在frameworks/base/services/core/java/com/android/server/am /ProcessList.java中
- procState,定义在frameworks/base/core/java/android/app/ActivityManager.java中
OOM_ADJ
Android10源码中,oom_adj划分为20级[-10000,1001],Android6.0以前[-17,16]
- oom_adj值越大,被杀的可能性越高
- oom_adj<0进程是系统进程
| ADJ级别 | 取值 | 说明(可参考源码注释) |
|---|---|---|
| INVALID_ADJ | -10000 | 未初始化adj字段时的默认值 |
| UNKNOWN_ADJ | 1001 | 缓存进程,无法获取具体值 |
| CACHED_APP_MAX_ADJ | 999 | 不可见activity进程的最大值 |
| CACHED_APP_MIN_ADJ | 900 | 不可见activity进程的最小值 |
| CACHED_APP_LMK_FIRST_ADJ | 950 | lowmemorykiller优先杀死的级别值 |
| SERVICE_B_ADJ | 800 | 旧service |
| PREVIOUS_APP_ADJ | 700 | 上个应用,常见应用切换场景 |
| HOME_APP_ADJ | 600 | home进程 |
| SERVICE_ADJ | 500 | 创建了service进程 |
| HEAVY_WEIGHT_APP_ADJ | 400 | 后台重量级进程,system/rootdir/init.rc文件中设置 |
| BACKUP_APP_ADJ | 300 | 备份进程 |
| PERCEPTIBLE_LOW_APP_ADJ | 250 | 受其他进程约束的进程 |
| PERCEPTIBLE_APP_ADJ | 200 | 可感知组件的进程,比如:背景音乐播放 |
| VISIBLE_APP_ADJ | 100 | 可见进程 |
| PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ | 50 | 最近运行的后台进程 |
| FOREGROUND_APP_ADJ | 0 | 前台进程,正在与用户交互 |
| PERSISTENT_SERVICE_ADJ | -700 | 系统持久化进程已绑定的进程 |
| PERSISTENT_PROC_ADJ | -800 | 系统持久化进程,比如:telephony |
| SYSTEM_ADJ | -900 | 系统进程 |
| MATIVE_ADJ | -1000 | native进程,不受系统管理 |
查看目标进程oom_adj的值adb shell cat /proc/进程id/oom_score_adj
系统级别的语音能力进程的oom_adj=-800
用户级别的应用,在前台可与用户交互 oom_adj=0
用户级别的应用,回到后台oom_adj=200
root进程,oom_adj=-1000
ProcessState
process_state划分为23类,取值范围[-1,21]
保活核心思路
降低adj值,减少被lmk杀掉可能性。通过应用层方式最多能将adj降到100~200之间。例如:微信 支付宝 酷狗音乐。
- 微信(未登录)启动后返回桌面并息屏两个进程com.tencent.mm和com.tencent.mm:push 进程的oom_score_adj=100。
- 微信(登录后)启动后返回桌面并息屏三个进程com.tencent.mm(oom_adj=800)和com.tencent.mm:push(oom_adj=400) com.tencent.soter.soterserver微信指纹支付(oom_adj=-800)系统进程
支付宝应用:
- 六个进程除了oom_adj=915(com.eg.android.AlipayGphone:tools),其余都为oom_adj=0。0正在与用户交互,通过未知的黑科技降低了adj值。
酷狗: 两个进程分别为700和200正常app运用。