文章

进程保活

进程保活

进程保活手段

https://github.com/xingda920813/HelloDaemon

https://github.com/D-clock/AndroidDaemonService

利用前台服务漏洞

利用 NFC 启动 App?

https://juejin.cn/post/7095327340925812750

保活教程

灰色进程保活

什么是灰色进程保活

灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的 Service 进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个 Notification,看起来就如同运行着一个后台 Service 进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到 Notification),但你的进程优先级又是高于普通后台进程的。

判断是否用了灰色进程保活技术

使用 dumpsys activity services 包名 打印出指定包名的所有进程中的 Service 信息,看下有没有 isForeground=true 的关键信息。如果通知栏没有看到属于 app 的 Notification 且又看到 isForeground=true 则说明了,此 app 利用了这种灰色
保活的手段。

dumpsys activity services com.tencent.mm

mpvo8

可以看到微信有两个 Service 用到了灰色进程保活技术

灰色进程具体实现

思路一:API < 18,启动前台 Service 时直接传入 new Notification();
思路二:API >= 18,同时启动两个 id 相同的前台 Service,然后再将后启动的 Service 做 stop 处理;

oom_adj

oom_adj 是 linux 内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于 oom_adj 的作用,你只需要记住以下几点即可:

  • 进程的 oom_adj 越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收
  • 普通 app 进程的 oom_adj>=0,系统进程的 oom_adj 才可能<0

一般 UI 进程和灰色保活 Service 进程的 oom_adj=0,而普通后台进程 oom_adj=15;把 app 切换到后台,再进行一次 oom_adj 的检验,你会发现 UI 进程的值从 0 变成了 6,而灰色保活的 Service 进程则从 0 变成了 1。

app 退到后台时,其所有的进程优先级都会降低。但是 UI 进程是降低最为明显的,因为它占用的内存资源最多,系统内存不足的时候肯定优先杀这些占用内存高的进程来腾出资源。所以,为了尽量避免后台 UI 进程被杀,需要尽可能的释放一些不用的资源,尤其是图片、音视频之类的。

验证是否生效

1. 开启灰色进程 service,查看 oom_adj
1
2
cat /proc/14223/oom_adj
0
2. 按 home 键后置应用到后台,再查看 oom_adj
1
2
cat /proc/14223/oom_adj
1
  • 表明是灰色进程,如果是普通的进程后置,这个值一般为 6
3. 查看 service 进程信息,看是否有 isForegroud 字段,且通知栏没有 Notification

b399b - 测试了 API16 和 API21 都是可行的

Reference

关于 Android 进程保活,你所需要知道的一切
http://www.jianshu.com/p/63aafe3c12af

双进程守护

  • 双 Service 守护:

http://pan.baidu.com/s/1i5FDdad?qq-pf-to=pcqq.group

  • 微信 Android 客户端后台保活经验分享

http://www.infoq.com/cn/articles/wechat-android-background-keep-alive

  • Android 进程守护

https://github.com/vvLavida/TechNotes/issues/22

其他

从 LMK、进程优先级方面、Service 方面去答。最后说没有。然后引导 Android 电量优化这块,说下 WorkManager 做了哪些

6szcq

本文由作者按照 CC BY 4.0 进行授权