最近一直关注合规问题,其中有一次被检测到风险是:
在Google的pixel设备中,某个进程被杀死后,然后又自动被「拉活」了,排查发现可能是各种注册的Service因为其onStartCommand返回START_STICKY导致。
那么问题来了:
- 当Service onStartCommand返回START_STICKY后,进程被杀系统是如何「复活」所在进程的?
- 面对项目中一堆Service可能返回START_STICKY,如何可以在原生系统上避免被「拉活」?
更多问答 >>
-
2022-05-27 20:55
-
2022-06-12 14:41
-
【大家提问】Android中的匿名binder与线程相关的一些问题
2022-07-03 10:48 -
每日一问 View.post 又来了与View.postOnAnimation 有什么区别?
2022-07-03 10:47 -
大家提问 Android中前后台切换监听,如果涉及到多进程如何完美的解决?
2022-12-04 22:50 -
2022-05-06 11:37
-
每日一问 | 可以不借助 bindService,实现跨进程 binder 通信吗?
2022-04-27 23:43 -
每日一问 | 被声明为private final 的内部类,能生成一个子类对象吗?逆天篡改~
2022-04-15 21:13 -
每日一问 .class vs Class.forName() vs loadClass() 类加载傻傻分不清楚?
2022-02-11 14:22
每日一问 | Service onStartCommand 返回STICKY是如何做到被拉活的?
最近一直关注合规问题,其中有一次被检测到风险是:
在Google的pixel设备中,某个进程被杀死后,然后又自动被「拉活」了,排查发现可能是各种注册的Service因为其onStartCommand返回START_STICKY导致。
那么问题来了:
1.关于进程被杀系统是如何「复活」所在进程的?
1.1 如何监听进程被系统杀死
Binder机制中有 死亡讣告 的事件通知机制,当进程销毁时,其对应的 本地Binder 会通过 AppDeathRecipient 通知 代理Binder进程 销毁了。
所以当Service所在的App进程被系统杀死后,就会将这个事件通过 Binder死亡讣告 通知ActivityManagerService(管理四大组件,自然包括Service组件)。既然要知道Service如何被“复活”,那么肯定要先知道它是如何“出生”,下面是start Service的大概流程图:
由上图中我们关注一下Service进程被Zygote fork创建后执行ActivityTh.attach()方法,通过Binder调用ActivityManagerProxy.attchApplication()方法想ActivityManagerService绑定初始化当前新建的Service进程。
1.2 AMS知道杀死带START_STICKY标记的Service进程后,如何「复活」
在ActivityManagerService启动完成后,向Service反馈,然后Service处理完成后有汇报给ActivityManagerService,然后交给ActiveService处理,将标识START_STICKY的Service对应信息封装类ServiceRecord的stopIfKilled设为false,表示杀死之后重启。
承接上一小节的appDiedLocked()方法,主要是清理应用进程逻辑,对于发现符合重启条件的Service,将ServiceRestarter(实现Runnable)的任务post到ActivityManagerService的Handler执行恢复Service逻辑。
2.面对项目中一堆Service可能返回START_STICKY,如何可以在原生系统上避免被「拉活」?
一般来说Service拉活,无论是官方方法还是黑科技在国产ROM一般不管用,当然洋叔是在Pixel机子上原生系统遇到这问题,只能从项目的方面入手,而不是FrameWork。毫无疑问解决方法非常有限:Hook收敛 。依据业务建立黑白名单管理,根据需求Hook掉Service的onStartCommand(),将其返回值设为START_NOT_STICKY即能解决拉活问题。Hook方案很多,根据项目实际任君选择:
如果图片挂了看不到,请查看在线PDF文件:https://gitee.com/pgm250/blog_img_bed/raw/master/wanan/Service%20onStartCommand ...查看更多
如果图片挂了看不到,请查看在线PDF文件:https://gitee.com/pgm250/blog_img_bed/raw/master/wanan/Service%20onStartCommand%20%E8%BF%94%E5%9B%9ESTICKY%E6%98%AF%E5%A6%82%E4%BD%95%E5%81%9A%E5%88%B0%E8%A2%AB%E6%8B%89%E6%B4%BB%E7%9A%84%EF%BC%9F.pdf
每日一学,感谢缘佬。
不好意思!您可能认错人了哦,我不是您说的那位同学。
adf