进程调度
进程有不同的优先级,对应一个值 oom_adj,值越小,优先级越高,越不容易被杀掉。
ProcessState级别 | 取值 | 解释 |
---|---|---|
PROCESS_STATE_CACHED_EMPTY | 16 | 进程处于cached状态,且为空进程 |
PROCESS_STATE_CACHED_ACTIVITY_CLIENT | 15 | 进程处于cached状态,且为另一个cached进程(内含Activity)的client进程 |
PROCESS_STATE_CACHED_ACTIVITY | 14 | 进程处于cached状态,且内含Activity |
PROCESS_STATE_LAST_ACTIVITY | 13 | 后台进程,且拥有上一次显示的Activity |
PROCESS_STATE_HOME | 12 | 后台进程,且拥有home Activity |
PROCESS_STATE_RECEIVER | 11 | 后台进程,且正在运行receiver |
PROCESS_STATE_SERVICE | 10 | 后台进程,且正在运行service |
PROCESS_STATE_HEAVY_WEIGHT | 9 | 后台进程,但无法执行restore,因此尽量避免kill该进程 |
PROCESS_STATE_BACKUP | 8 | 后台进程,正在运行backup/restore操作 |
PROCESS_STATE_IMPORTANT_BACKGROUND | 7 | 对用户很重要的进程,用户不可感知其存在 |
PROCESS_STATE_IMPORTANT_FOREGROUND | 6 | 对用户很重要的进程,用户可感知其存在 |
PROCESS_STATE_TOP_SLEEPING | 5 | 与PROCESS_STATE_TOP一样,但此时设备正处于休眠状态 |
PROCESS_STATE_FOREGROUND_SERVICE | 4 | 拥有一个前台Service |
PROCESS_STATE_BOUND_FOREGROUND_SERVICE | 3 | 拥有一个前台Service,且由系统绑定 |
PROCESS_STATE_TOP | 2 | 拥有当前用户可见的top Activity |
PROCESS_STATE_PERSISTENT_UI | 1 | persistent系统进程,并正在执行UI操作 |
PROCESS_STATE_PERSISTENT | 0 | persistent系统进程 |
PROCESS_STATE_NONEXISTENT | -1 | 不存在的进程 |
核心方法:
在 ActivityManagerService.java 中有个 OomAdjuster对象,里面有几个关键方法:
updateOomAdjLocked
:更新adj,当目标进程为空,或者被杀则返回false;否则返回true;computeOomAdjLocked
:计算adj,返回计算后RawAdj值;applyOomAdjLocked
:使用adj,当需要杀掉目标进程则返回false;否则返回true。
保活拉活
前台服务
缺点是状态栏有个通知提示
StickyService
bindService后可以持续拉活
账户同步
比较稳定,系统会统一唤醒去同步,需实现账户那一套东西
JobScheduler
启动一个定时任务,比较耗性能,可以持续拉活
双进程守护
新建一个 Module,里面启动一个新进程,两个进程用 AIDL 通信,如果断开了,在回调中重新拉起另一个进程
WorkManager
使用 androidx 的东西,定一个定时任务会拉起进程。可以在进程里面再启动一个 JobScheduler 的定时任务