一恕洲、從插件中bindService的流程
bindService要比startService復(fù)雜一些,比如涉及到bind模式(BIND_AUTO_CREATE)的不同禁熏,遠(yuǎn)程VActivityManagerService會(huì)有不同的處理等等。
過(guò)程分拆:
1、Hook工作
在插件內(nèi)調(diào)用bindService得湘,會(huì)進(jìn)入hooked BindService方法。BindService向ServiceConnectionDelegate查詢一個(gè)包裝IServiceConnection的本地Stub(沒(méi)有的話會(huì)新建)顿仇。然后以這個(gè)Stub為參數(shù)去調(diào)用VActivityManager的public intbindService(IBinder caller, IBinder token, Intent service, String resolvedType, IServiceConnection connection,intflags,intuserId)方法淘正,當(dāng)然,其實(shí)最終是調(diào)用了:x進(jìn)程的VActivityManagerService的對(duì)應(yīng)方法臼闻。
2鸿吆、VActivityManagerService內(nèi)部處理之一
bindService方法會(huì)查詢對(duì)應(yīng)的Service是否已經(jīng)啟動(dòng),如果沒(méi)有啟動(dòng)述呐,分兩種情況處理:
1)如果使用了BIND_AUTO_CREATE模式惩淳,則調(diào)用內(nèi)部的startServiceCommon方法啟動(dòng)Service,參考之前的《VirtualApp拆解之三:Service啟動(dòng)流程》乓搬;
2)如果沒(méi)有使用BIND_AUTO_CREATE模式思犁,則需要記錄此次bind的ServiceRecord。
3进肯、VActivityManagerService內(nèi)部處理之二
如果Service已啟動(dòng)啟動(dòng)激蹲,調(diào)用遠(yuǎn)程ApplicationThread的scheduleBindService方法。
4江掩、Service所在進(jìn)程處理之一(全是android源碼)
ApplicationThread的scheduleBindService方法會(huì)向ActivityThread發(fā)送BIND_SERVICE消息学辱,ActivityThread接收此消息后調(diào)用handleBindService方法,內(nèi)部會(huì)調(diào)用Service的onBind方法等返回對(duì)外的Binder环形,然后策泣,利用這個(gè)Binder作為參數(shù)調(diào)用ActivityManagerNative.getDefault()的publishService方法告知遠(yuǎn)程我要發(fā)布一個(gè)Service的Binder。
5抬吟、hook publishService
不過(guò)着降,publishService也被hook了,它會(huì)查找ServiceRecord之前保存的遠(yuǎn)程IServiceConnection拗军,然后將對(duì)外的Binder通過(guò)IServiceConnectio的connected方法發(fā)布出去任洞。