美文网首页
Android 进程保活

Android 进程保活

作者: Batashi | 来源:发表于2018-05-21 11:10 被阅读0次

    一、前言

    关于进程保活,主要处理好两个关键点: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进程保活实践

    相关文章

      网友评论

          本文标题:Android 进程保活

          本文链接:https://www.haomeiwen.com/subject/igtfjftx.html