一、前言
关于进程保活,主要处理好两个关键点:1.提高进程的优先级;2.弄清什么场景下进程容易被kill,然后对该场景进行优化。
二、Android 进程分类
想要提高进程的优先级就首先要了解Android 的5种进程:
- 前台进程 (Foreground process)
- 可见进程 (Visible process)
- 服务进程 (Service process)
- 后台进程 (Background process)
- 空进程 (Empty process)
具体可通过oom_adj值来判断:oom_adj的值越大越容易被杀,越小代表优先级超高,越不会被杀。前台进程的oom_adj = 0。
oom_adj 存储在proc/PID/oom_adj文件中,其中PID是进程的id,直接 adb shell进入手机根目录查看这个文件即可(前提是手机是root状态)。下面看一个例子:
QQ截图20171103114340.png
该进程的PID为:16457
1526869895(1).jpg
即该进程的oom_adj == 0。对应的是前台进程 (Foreground process),此时进程的优先级是最高的,一般情况下都不会被杀。
当我们按下返回键返回桌面后,再次查看oom_adj:
shell@libra:/ $ cat proc/16457/oom_adj
9
// 过几十秒再查看的结果
shell@libra:/ $ cat proc/16457/oom_adj
11
此时oom_adj变成9了,然后过一会再看的时候,又变成11了。代表其优先级越来越低,在后台很容易被kill。一般oom_adj < 5的进程不会轻易被kill。
我们再试试按下Home键返回桌面后,oom_adj的值是多少:
shell@libra:/ $ cat proc/16457/oom_adj
7
可得出结论,按Home键退回桌面的进程优先级比按返回键退回桌面的优先级要高一些。但是都 > 5,意思是还是很容易被LMK(Low Memory Killer)干掉的。于是,我们的保活工作就是提高oom_adj,从而让进程能够在后台存活得更久。
三、如何提高oom_adj
大体来说,可以有以下几种方案:1.1像素页面保活;2.Service.startForeground();3.引导用户开启开机自启动、加入白名单、忽略电池优化、保持后台运行等等权限。
方案1和2都是减小oom_adj,即提高优先级。方案1可以把oom_adj减小到0,方案2可以减小到2。这两种方案都能成功地保证进程的存活。当然,还是躲不过一键清理的。如果想要躲过一键清理,那就要用方案3了。不过,国内手机厂商太多,跳转相关权限设置的路径千差万别,做越来十分烦琐。这里只讨论方案2,即通过startForeground()把进程变为前台进程,从而尽量避免被LMK干掉。这也是三种方案中最优雅的一种了。下面请看代码:
通过startForeground提高进程优先级
Android进程保活实践
网友评论