背景:
最近需要做一个防应用自启的方案,做在framework层源码里面。这里做下简单的技术方案介绍。
原理:
- 防止应用接收静态广播启动;
- 防止应用的service隐式启动。
大致方法:
防止应用接收静态广播启动方案:
要了解此方案,要先了解广播发送接收机制,请参考:https://blog.csdn.net/zhgeliang/article/details/80493390
可以在BroadcastQueue.java中的processNextBroadcast方法中处理静态广播拉起引用之前:
if ((r.curApp=mService.startProcessLocked 判断是否是白名单应用,若不是,则调用scheduleBroadcastsLocked(); 方法继续处理下一个广播,并返回。
为什么不加在processNextBroadcast的最前面?
我们要做的是防止应用自启,但应用启动后其应该接收到的广播还是应该让其接收到。
防止应用的service隐式启动
建议先了解service的启动流程,请参考:https://blog.csdn.net/freekiteyu/article/details/79785720
可以在ActiveServices.java 中的retrieveServiceLocked 中获取到ServiceRecord 之后(主要是为了获取应用相关的信息,为判断是否在白名单做准备),返回ServiceLookupResult之前 判断是否是白名单应用,若不是,则返回null。
防止应用被杀后再启动:
在killServicesLocked中"// Any services running in the application may need to be placed" 之前判断若不是白名单应用,调用bringDownServiceLocked(sr); continue;
白名单应用注意事项
Android核心应用(coreApp)应该在白名单内,系统重要应用也应该在白名单内。