本章主要記錄一下自己在工作中,遇到車機(jī)多屏幕操作時(shí)CarUserService中的邏輯實(shí)現(xiàn)流程,所以啟動(dòng)方面就簡(jiǎn)單分析一下:
- 和汽車相關(guān)的服務(wù)主要依賴系統(tǒng)服務(wù) CarServiceHelperService 開機(jī)時(shí)在 SystemServer 中啟動(dòng),如圖:
判斷是車,然后啟動(dòng)服務(wù) - 隨后通過類名加載類,并且通過反射構(gòu)造服務(wù)類,并且調(diào)用
startService啟動(dòng)如圖:
通過包路徑com.android.internal.car.CarServiceHelperService加載類
通過包路徑com.android.internal.car.CarServiceHelperService加載類
通過反射調(diào)用構(gòu)造函數(shù) - 在
startService方法中,將構(gòu)造完成的對(duì)象添加到mServices中,并且調(diào)用onStart,如圖:
startService(@NonNull final SystemService service) - 在 CarServiceHelperService 的
onStart中會(huì)綁定一個(gè)包名為com.android.car,action為android.car.ICar的服務(wù),這就是系統(tǒng)中和汽車相關(guān)的核心服務(wù) CarService ,如圖:
常量CAR_SERVICE_INTERFACE
綁定CarService - 綁定 CarService 的時(shí)候,在 CarService 的
onCreate方法中,構(gòu)造了一個(gè)具體實(shí)現(xiàn)類mICarImpl,并且在onBind方法中返回mICarImpl,如圖:
構(gòu)造一個(gè)實(shí)現(xiàn)類
onBind返回實(shí)現(xiàn)類 - 在 ICarImpl 的構(gòu)造方法中,新建了 CarUserService 和CarOccupantZoneService,CarUserService 是用來(lái)管理車載環(huán)境中多用戶操作。而
CarOccupantZoneService 用來(lái)管理多用戶和座位的對(duì)應(yīng)關(guān)系,這里我們只分析和顯示屏有關(guān)的,在車載環(huán)境中,可能有一個(gè)座位對(duì)應(yīng)了一個(gè)顯示屏提供給用戶操作,初始化的代碼如圖:
初始化CarUserService和CarOccupantZoneService - 在 ICarImpl 構(gòu)造方法的最后,將所有構(gòu)造完成的服務(wù)對(duì)象添加到成員變量
mAllServices中。
添加到mAllServices - 在 ICarImpl 中,
constructWithTrace方法初始化了各個(gè)服務(wù),它的邏輯是在調(diào)用對(duì)應(yīng)類的構(gòu)造方法之后,把它加入到 CarLocalServices 的成員變量sLocalServiceObjects中:
callable調(diào)用call,把返回的對(duì)象加入到一個(gè)ArrayMap中
將class作為key,進(jìn)行了判重 - 隨后在 CarService 中調(diào)用了
init方法,初始化車載的各個(gè)服務(wù),每一個(gè)子服務(wù)都實(shí)現(xiàn)了 CarServiceBase 的接口,如圖:
各個(gè)服務(wù)類在構(gòu)造完成之后調(diào)用init初始化
ICarImpl內(nèi)部是通過遍歷mAllServices,對(duì)每一個(gè)子服務(wù)調(diào)用init
CarServiceBase -
CarService 綁定成功之后,又到了 CarServiceHelperService 成員變量
mCarServiceConnection的onServiceConnected方法中,并且執(zhí)行handleCarServiceConnection,如圖
image.png - 在
handleCarServiceConnection方法中,將mCarServiceBinder指向iBinder,至此 CarServiceHelperService 可以通過mCarServiceBinder與 CarService 進(jìn)行進(jìn)程間通信;隨后調(diào)用了sendSetSystemServerConnectionsCall方法,如圖:
mCarServiceBinder = iBinder - 在
sendSetSystemServerConnectionsCall中,顧名思義,是將 CarServiceHelperService 的 Binder 發(fā)送給 CarService ,code取值是FIRST_CALL_TRANSACTION = 0x00000001到LAST_CALL_TRANSACTION = 0x00ffffff之間,這里之直接傳的FIRST_CALL_TRANSACTION值為1,說明是aidl定義中為0的方法,如圖:
transact(0,null,Binder.FLAG_ONEWAY) -
sendSetSystemServerConnectionsCall方法中binder的具體實(shí)現(xiàn)類是 ICarImpl ,通過查看 ICarImpl 源碼,我們得知 ICarImpl 是 ICar.Stub 的子類,查看 ICar.aidl,得知,code = FIRST_CALL_TRANSACTION時(shí),實(shí)際調(diào)用的是setSystemServerConnections方法,如圖:
sendSetSystemServerConnectionsCall在aidl中的值為0 - 也可以在系統(tǒng)編譯產(chǎn)物/out/target/common/obj/JAVA_LIBRARIES/android.car_intermediates/classes.jar中找到,解壓classes.jar,在android/car/ICar$Stub.class中,反編譯可以看到,在
onTransact方法中,code值為1時(shí),對(duì)應(yīng)的方法是sendSetSystemServerConnectionsCall,如圖:
TRANSACTION_setSystemServerConnections = 1
case 1 : this.setSystemServerConnections(_arg0, _result);
- 查看實(shí)現(xiàn)類 ICarImpl 中的
sendSetSystemServerConnectionsCall方法,將成員變量mICarServiceHelper指向carServiceHelper,并且將引用同步更新到各個(gè)功能模塊中,至此 CarService 可以通過mICarServiceHelper進(jìn)行跨進(jìn)程通信,如圖:
mICarServiceHelper = carServiceHelper
下一章繼續(xù)分析CarOccupantZoneService和CarUserService的init中,做了什么






















