一、从插件中bindService的流程
bindService要比startService复杂一些,比如涉及到bind模式(BIND_AUTO_CREATE)的不同,远程VActivityManagerService会有不同的处理等等。
过程分拆:
1、Hook工作
在插件内调用bindService,会进入hooked BindService方法。BindService向ServiceConnectionDelegate查询一个包装IServiceConnection的本地Stub(没有的话会新建)。然后以这个Stub为参数去调用VActivityManager的public intbindService(IBinder caller, IBinder token, Intent service, String resolvedType, IServiceConnection connection,intflags,intuserId)方法,当然,其实最终是调用了:x进程的VActivityManagerService的对应方法。
2、VActivityManagerService内部处理之一
bindService方法会查询对应的Service是否已经启动,如果没有启动,分两种情况处理:
1)如果使用了BIND_AUTO_CREATE模式,则调用内部的startServiceCommon方法启动Service,参考之前的《VirtualApp拆解之三:Service启动流程》;
2)如果没有使用BIND_AUTO_CREATE模式,则需要记录此次bind的ServiceRecord。
3、VActivityManagerService内部处理之二
如果Service已启动启动,调用远程ApplicationThread的scheduleBindService方法。
4、Service所在进程处理之一(全是android源码)
ApplicationThread的scheduleBindService方法会向ActivityThread发送BIND_SERVICE消息,ActivityThread接收此消息后调用handleBindService方法,内部会调用Service的onBind方法等返回对外的Binder,然后,利用这个Binder作为参数调用ActivityManagerNative.getDefault()的publishService方法告知远程我要发布一个Service的Binder。
5、hook publishService
不过,publishService也被hook了,它会查找ServiceRecord之前保存的远程IServiceConnection,然后将对外的Binder通过IServiceConnectio的connected方法发布出去。