Andorid 12 CarUserService,CarOccupantZoneService 多屏幕流程分析(一)

本章主要記錄一下自己在工作中,遇到車機(jī)多屏幕操作時(shí)CarUserService中的邏輯實(shí)現(xiàn)流程,所以啟動(dòng)方面就簡(jiǎn)單分析一下:

  1. 和汽車相關(guān)的服務(wù)主要依賴系統(tǒng)服務(wù) CarServiceHelperService 開機(jī)時(shí)在 SystemServer 中啟動(dòng),如圖:
    判斷是車,然后啟動(dòng)服務(wù)
  2. 隨后通過類名加載類,并且通過反射構(gòu)造服務(wù)類,并且調(diào)用startService啟動(dòng)如圖:
    通過包路徑com.android.internal.car.CarServiceHelperService加載類

    通過包路徑com.android.internal.car.CarServiceHelperService加載類

    通過反射調(diào)用構(gòu)造函數(shù)
  3. startService 方法中,將構(gòu)造完成的對(duì)象添加到mServices中,并且調(diào)用onStart,如圖:
    startService(@NonNull final SystemService service)
  4. CarServiceHelperServiceonStart中會(huì)綁定一個(gè)包名為 com.android.car,action為android.car.ICar的服務(wù),這就是系統(tǒng)中和汽車相關(guān)的核心服務(wù) CarService ,如圖:
    常量CAR_SERVICE_INTERFACE

    綁定CarService
  5. 綁定 CarService 的時(shí)候,在 CarServiceonCreate方法中,構(gòu)造了一個(gè)具體實(shí)現(xiàn)類mICarImpl,并且在onBind方法中返回mICarImpl,如圖:
    構(gòu)造一個(gè)實(shí)現(xiàn)類

    onBind返回實(shí)現(xiàn)類
  6. ICarImpl 的構(gòu)造方法中,新建了 CarUserServiceCarOccupantZoneService,CarUserService 是用來(lái)管理車載環(huán)境中多用戶操作。而
    CarOccupantZoneService 用來(lái)管理多用戶和座位的對(duì)應(yīng)關(guān)系,這里我們只分析和顯示屏有關(guān)的,在車載環(huán)境中,可能有一個(gè)座位對(duì)應(yīng)了一個(gè)顯示屏提供給用戶操作,初始化的代碼如圖:
    初始化CarUserService和CarOccupantZoneService
  7. ICarImpl 構(gòu)造方法的最后,將所有構(gòu)造完成的服務(wù)對(duì)象添加到成員變量mAllServices中。
    添加到mAllServices
  8. ICarImpl 中,constructWithTrace方法初始化了各個(gè)服務(wù),它的邏輯是在調(diào)用對(duì)應(yīng)類的構(gòu)造方法之后,把它加入到 CarLocalServices 的成員變量sLocalServiceObjects中:
    callable調(diào)用call,把返回的對(duì)象加入到一個(gè)ArrayMap中

    將class作為key,進(jìn)行了判重
  9. 隨后在 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
  10. CarService 綁定成功之后,又到了 CarServiceHelperService 成員變量mCarServiceConnectiononServiceConnected方法中,并且執(zhí)行handleCarServiceConnection,如圖
    image.png
  11. handleCarServiceConnection方法中,將mCarServiceBinder指向iBinder,至此 CarServiceHelperService 可以通過mCarServiceBinderCarService 進(jìn)行進(jìn)程間通信;隨后調(diào)用了sendSetSystemServerConnectionsCall方法,如圖:
    mCarServiceBinder = iBinder
  12. sendSetSystemServerConnectionsCall中,顧名思義,是將 CarServiceHelperServiceBinder 發(fā)送給 CarService ,code取值是FIRST_CALL_TRANSACTION = 0x00000001LAST_CALL_TRANSACTION = 0x00ffffff之間,這里之直接傳的FIRST_CALL_TRANSACTION值為1,說明是aidl定義中為0的方法,如圖:
    transact(0,null,Binder.FLAG_ONEWAY)
  13. sendSetSystemServerConnectionsCall方法中binder的具體實(shí)現(xiàn)類是 ICarImpl ,通過查看 ICarImpl 源碼,我們得知 ICarImplICar.Stub 的子類,查看 ICar.aidl,得知,code = FIRST_CALL_TRANSACTION時(shí),實(shí)際調(diào)用的是setSystemServerConnections方法,如圖:
    sendSetSystemServerConnectionsCall在aidl中的值為0
  14. 也可以在系統(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);
  1. 查看實(shí)現(xiàn)類 ICarImpl 中的sendSetSystemServerConnectionsCall方法,將成員變量mICarServiceHelper指向carServiceHelper,并且將引用同步更新到各個(gè)功能模塊中,至此 CarService 可以通過mICarServiceHelper進(jìn)行跨進(jìn)程通信,如圖:
    mICarServiceHelper = carServiceHelper

下一章繼續(xù)分析CarOccupantZoneService和CarUserService的init中,做了什么

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容