一、從插件中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方法發布出去。