Reference
源码
进程的优先级与回收机制
|
|
ADJ 级别 | 取值(Android 7.0 以前的值) | 含义 |
---|---|---|
NATIVE_ADJ | -1000(-17) | native 进程(不被系统管理) |
SYSTEM_ADJ | -900(-16) | 仅指 system_server 进程 |
PERSISTENT_PROC_ADJ | -800(-12) | 系统 persistent 进程,比如 telephony |
PERSISTENT_SERVICE_ADJ | -700(-11) | 关联着系统或 persistent 进程 |
FOREGROUND_APP_ADJ |
0(0) | 前台进程 |
VISIBLE_APP_ADJ |
100(1) | 可见进程 |
PERCEPTIBLE_APP_ADJ |
200(2) | 可感知进程,比如后台音乐播放 |
BACKUP_APP_ADJ |
300(3) | 备份进程 |
HEAVY_WEIGHT_APP_ADJ | 400(4) | 后台的重量级进程 |
SERVICE_ADJ | 500(5) | 服务进程 |
HOME_APP_ADJ | 600(6) | Home 进程 |
PREVIOUS_APP_ADJ | 700(7) | 上一个 app 的进程(往往通过按返回键) |
SERVICE_B_ADJ | 800(8) | B List 中的 Service |
CACHED_APP_MIN_ADJ |
900(9) | 不可见进程的 ADJ 最小值 |
CACHED_APP_MAX_ADJ |
906(15) | 不可见进程的 ADJ 最大值 |
UNKNOWN_ADJ | 1001(16) | 一般指将要会缓存进程,无法获取确定值 |
进程回收机制:Low Memory Killer
当系统剩余空闲内存低于某阈值(比如 147 MB),则从 ADJ 大于或等于相应阈值(比如 900)的进程中,杀死 ADJ 值最大的进程,如果存在多个 ADJ 相同的进程,则杀死内存最大的进程。
查看内存阈值
|
|
单位是 4KB(一页),所以对于该设备:
- 前台进程:18432 * 4KB / 1024 = 72 MB
- 可见进程:90 MB
- 可感知进程:108 MB
- 备份进程:126 MB
- 不可见进程的 ADJ 最小值:216 MB
- 不可见进程的 ADJ 最大值:315 MB
查看进程的优先级
1、确定进程值,是 3107:
2、查看进程的优先级:
启动 app 后,查看 app 进程的优先级是前台进程;
1、如果按返回键,是 8;
2、如果按 HOME 键,是 6;
3、锁屏不会改变优先级。
ADJ 算法
- updateOomAdjLocked:更新 ADJ,当目标进程为空,或者被杀则返回 false;否则返回 true;
- computeOomAdjLocked:计算 ADJ,返回计算后的 RawAdj 值;
- applyOomAdjLocked:使用 ADJ,当需要杀掉目标进程则返回 false;否则返回 true。
app 保活
提升进程的优先级
操作流程:启动 app -> 按 HOME 键回到桌面 -> 锁屏 -> 解锁
默认进程优先级的变化:
1 像素法
使用 1 像素法后进程优先级的变化:
原理:在 Application 里注册广播,监听锁屏和解锁的事件;当收到锁屏广播时启动一个 1 像素的页面,当收到解锁广播时关闭这个页面。
缺点:只在锁屏时有效。
1、注册广播:
|
|
|
|
2、1 像素的页面:
前台进程法
使用前台进程法后进程优先级的变化:
原理:在 Application 里启动前台进程。
缺点:自 Android 8.0 开始会在通知栏显示消息。
|
|
加入系统白名单
以华为为例:
app 拉活
全家桶
监听其他大厂的 app 发出的广播进行拉活。
账号同步
原理:系统有自动同步账号数据的机制。
缺点:时间不确定。
添加账号:
|
|
当用户主动同步或者系统自动同步账号数据时,会进行拉活:
推送
接入各个手机厂商的推送。