Android 进程保活(不死进程)

释放双眼,带上耳机,听听看~!

当前业界的 Android 进程保活手段主要分为“黑、白、灰”三种,其大致的实现思路如下:
1、黑色保活:不同的 App 进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)。
2、白色保活:启动前台 Service。
3、灰色保活:利用系统的漏洞启动前台 Service。

一、黑色保活

所谓黑色保活,就是利用不同的 App 进程使用广播来进行相互唤醒。举个3个比较常见的场景:
场景1:开机,网络切换、拍照、拍视频时候,利用系统产生的广播唤醒app。
场景2:接入第三方 SDK 也会唤醒相应的 App 进程,如微信 SDK 会唤醒微信,支付宝 SDK 会唤醒支付宝。
场景3:假如你手机里装了支付宝、淘宝、天猫、UC 等阿里系的 App ,那么你打开任意一个阿里系的 App 后,有可能就顺便把其他阿里系的 App 给唤醒了。(只是拿阿里打个比方,其实BAT系都差不多)

二、白色保活

白色保活手段非常简单,就是调用系统 API 启动一个前台的 Service进程,这样会在系统的通知栏生成一个 Notification,用来让用户知道有这样一个 App 在运行着,哪怕当前的 App 退到了后台。如QQ音乐这样。

三、灰色保活

灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的 Service 进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个 Notification,看起来就如同运行着一个后台 Service 进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到 Notification),但你的进程优先级又是高于普通后台进程的。那么如何利用系统的漏洞呢,大致的实现思路和代码如下:
思路一:API < 18,启动前台 Service 时直接传入new Notification();
思路二:API >= 18,同时启动两个id相同的前台 Service,然后再将后启动的 Service 做 stop 处理。

Android 系统出于体验和性能上的考虑,App 在退到后台时系统并不会真正的 kill 掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要 kill 掉哪些进程,以腾出内存来供给需要的 App。这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于 Linux 内核的 OOM Killer(Out-Of-Memory killer)机制诞生。

进程的重要性,划分5级:
前台进程 (Foreground process)
可见进程 (Visible process)
服务进程 (Service process)
后台进程 (Background process)
空进程 (Empty process)

了解完 Low Memory Killer,再科普一下 oom_adj。什么是 oom_adj?它是 linux 内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于 oom_adj 的作用,你只需要记住以下几点即可:
进程的 oom_adj 越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收。
普通 App 进程的 oom_adj>=0,系统进程的 oom_adj 才可能<0
有些手机厂商把这些知名的 App 放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通 App 一样躲避不了被杀的命运,为了尽量避免被杀,还是老老实实去做好优化工作吧。

所以,进程保活的根本方案终究还是回到了性能优化上,进程永生不死终究是个彻头彻尾的伪命题!

 

人已赞赏
Android文章

Android 组件化最佳实践 ARetrofit 原理

2019-10-17 8:32:00

Android文章

Android 一个超高自定义度又简单使用的页面状态管理库

2019-10-19 1:59:47

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索