VirtualApp拆解之四:bindService和unBindService

一、从插件中bindService的流程

bindService要比startService复杂一些,比如涉及到bind模式(BIND_AUTO_CREATE)的不同,远程VActivityManagerService会有不同的处理等等。


VirtualApp拆解之四:bindService和unBindService_第1张图片


bindService

过程分拆:

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方法发布出去。

你可能感兴趣的:(VirtualApp拆解之四:bindService和unBindService)