Android 进程调度以及保活拉活

幻昼 2021年10月09日 303次浏览

进程调度

进程有不同的优先级,对应一个值 oom_adj,值越小,优先级越高,越不容易被杀掉。

ProcessState级别取值解释
PROCESS_STATE_CACHED_EMPTY16进程处于cached状态,且为空进程
PROCESS_STATE_CACHED_ACTIVITY_CLIENT15进程处于cached状态,且为另一个cached进程(内含Activity)的client进程
PROCESS_STATE_CACHED_ACTIVITY14进程处于cached状态,且内含Activity
PROCESS_STATE_LAST_ACTIVITY13后台进程,且拥有上一次显示的Activity
PROCESS_STATE_HOME12后台进程,且拥有home Activity
PROCESS_STATE_RECEIVER11后台进程,且正在运行receiver
PROCESS_STATE_SERVICE10后台进程,且正在运行service
PROCESS_STATE_HEAVY_WEIGHT9后台进程,但无法执行restore,因此尽量避免kill该进程
PROCESS_STATE_BACKUP8后台进程,正在运行backup/restore操作
PROCESS_STATE_IMPORTANT_BACKGROUND7对用户很重要的进程,用户不可感知其存在
PROCESS_STATE_IMPORTANT_FOREGROUND6对用户很重要的进程,用户可感知其存在
PROCESS_STATE_TOP_SLEEPING5与PROCESS_STATE_TOP一样,但此时设备正处于休眠状态
PROCESS_STATE_FOREGROUND_SERVICE4拥有一个前台Service
PROCESS_STATE_BOUND_FOREGROUND_SERVICE3拥有一个前台Service,且由系统绑定
PROCESS_STATE_TOP2拥有当前用户可见的top Activity
PROCESS_STATE_PERSISTENT_UI1persistent系统进程,并正在执行UI操作
PROCESS_STATE_PERSISTENT0persistent系统进程
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 的定时任务