进程保活
进程保活手段
https://github.com/xingda920813/HelloDaemon
https://github.com/D-clock/AndroidDaemonService
利用前台服务漏洞
- 某音乐软件在原生 Pixel 被拦截自启动后导致系统 NFC 无限崩溃
http://weishu.me/2021/01/25/another-keep-alive-method/
利用 NFC 启动 App?
https://juejin.cn/post/7095327340925812750
保活教程
- Android 正确的保活方案,不要掉进保活需求死循环陷进
https://juejin.cn/post/7003992225575075876
灰色进程保活
什么是灰色进程保活
灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的 Service 进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个 Notification,看起来就如同运行着一个后台 Service 进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到 Notification),但你的进程优先级又是高于普通后台进程的。
判断是否用了灰色进程保活技术
使用 dumpsys activity services 包名
打印出指定包名的所有进程中的 Service 信息,看下有没有 isForeground=true 的关键信息。如果通知栏没有看到属于 app 的 Notification 且又看到 isForeground=true 则说明了,此 app 利用了这种灰色
保活的手段。
dumpsys activity services com.tencent.mm
可以看到微信有两个 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
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 做了哪些