app保活

249 阅读3分钟

前言

app使用的保活主要两大点:保活和复活

保活方案

  1. 1像素
  2. 后台无声音乐
  3. 前台service
  4. 心跳机制
  5. socket长连接
  6. 无障碍服务

复活方案

  1. 双进程守护(java层和native层)
  2. JobScheduler 定时任务
  3. 推送/相互唤醒

进程调度原则

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_ADJ1001缓存进程,无法获取具体值
CACHED_APP_MAX_ADJ999不可见activity进程的最大值
CACHED_APP_MIN_ADJ900不可见activity进程的最小值
CACHED_APP_LMK_FIRST_ADJ950lowmemorykiller优先杀死的级别值
SERVICE_B_ADJ800旧service
PREVIOUS_APP_ADJ700上个应用,常见应用切换场景
HOME_APP_ADJ600home进程
SERVICE_ADJ500创建了service进程
HEAVY_WEIGHT_APP_ADJ400后台重量级进程,system/rootdir/init.rc文件中设置
BACKUP_APP_ADJ300备份进程
PERCEPTIBLE_LOW_APP_ADJ250受其他进程约束的进程
PERCEPTIBLE_APP_ADJ200可感知组件的进程,比如:背景音乐播放
VISIBLE_APP_ADJ100可见进程
PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ50最近运行的后台进程
FOREGROUND_APP_ADJ0前台进程,正在与用户交互
PERSISTENT_SERVICE_ADJ-700系统持久化进程已绑定的进程
PERSISTENT_PROC_ADJ-800系统持久化进程,比如:telephony
SYSTEM_ADJ-900系统进程
MATIVE_ADJ-1000native进程,不受系统管理

查看目标进程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运用。