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

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

  1. 和汽車相關的服務主要依賴系統(tǒng)服務 CarServiceHelperService 開機時在 SystemServer 中啟動谣膳,如圖:
    判斷是車,然后啟動服務
  2. 隨后通過類名加載類铅乡,并且通過反射構造服務類继谚,并且調(diào)用startService啟動如圖:
    通過包路徑com.android.internal.car.CarServiceHelperService加載類

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

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

    綁定CarService
  5. 綁定 CarService 的時候侨嘀,在 CarServiceonCreate方法中,構造了一個具體實現(xiàn)類mICarImpl捂襟,并且在onBind方法中返回mICarImpl咬腕,如圖:
    構造一個實現(xiàn)類

    onBind返回實現(xiàn)類
  6. ICarImpl 的構造方法中,新建了 CarUserServiceCarOccupantZoneService葬荷,CarUserService 是用來管理車載環(huán)境中多用戶操作涨共。而
    CarOccupantZoneService 用來管理多用戶和座位的對應關系纽帖,這里我們只分析和顯示屏有關的,在車載環(huán)境中举反,可能有一個座位對應了一個顯示屏提供給用戶操作懊直,初始化的代碼如圖:
    初始化CarUserService和CarOccupantZoneService
  7. ICarImpl 構造方法的最后,將所有構造完成的服務對象添加到成員變量mAllServices中火鼻。
    添加到mAllServices
  8. ICarImpl 中室囊,constructWithTrace方法初始化了各個服務,它的邏輯是在調(diào)用對應類的構造方法之后魁索,把它加入到 CarLocalServices 的成員變量sLocalServiceObjects中:
    callable調(diào)用call,把返回的對象加入到一個ArrayMap中

    將class作為key,進行了判重
  9. 隨后在 CarService 中調(diào)用了init方法融撞,初始化車載的各個服務,每一個子服務都實現(xiàn)了 CarServiceBase 的接口粗蔚,如圖:
    各個服務類在構造完成之后調(diào)用init初始化

    ICarImpl內(nèi)部是通過遍歷mAllServices尝偎,對每一個子服務調(diào)用init

    CarServiceBase
  10. CarService 綁定成功之后,又到了 CarServiceHelperService 成員變量mCarServiceConnectiononServiceConnected方法中鹏控,并且執(zhí)行handleCarServiceConnection,如圖
    image.png
  11. handleCarServiceConnection方法中致扯,將mCarServiceBinder指向iBinder,至此 CarServiceHelperService 可以通過mCarServiceBinderCarService 進行進程間通信牧挣;隨后調(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的具體實現(xiàn)類是 ICarImpl ,通過查看 ICarImpl 源碼世吨,我們得知 ICarImplICar.Stub 的子類,查看 ICar.aidl呻征,得知耘婚,code = FIRST_CALL_TRANSACTION時,實際調(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時,對應的方法是sendSetSystemServerConnectionsCall,如圖:
    TRANSACTION_setSystemServerConnections = 1

    case 1 : this.setSystemServerConnections(_arg0, _result);
  1. 查看實現(xiàn)類 ICarImpl 中的sendSetSystemServerConnectionsCall方法灾锯,將成員變量mICarServiceHelper指向carServiceHelper兢榨,并且將引用同步更新到各個功能模塊中,至此 CarService 可以通過mICarServiceHelper進行跨進程通信,如圖:
    mICarServiceHelper = carServiceHelper

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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吵聪,一起剝皮案震驚了整個濱河市凌那,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吟逝,老刑警劉巖帽蝶,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異块攒,居然都是意外死亡嘲碱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門局蚀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麦锯,“玉大人,你說我怎么就攤上這事琅绅》鲂溃” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵千扶,是天一觀的道長料祠。 經(jīng)常有香客問我,道長澎羞,這世上最難降的妖魔是什么髓绽? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮妆绞,結果婚禮上顺呕,老公的妹妹穿的比我還像新娘。我一直安慰自己括饶,他們只是感情好株茶,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著图焰,像睡著了一般启盛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上技羔,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天僵闯,我揣著相機與錄音,去河邊找鬼藤滥。 笑死鳖粟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的超陆。 我是一名探鬼主播牺弹,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼时呀!你這毒婦竟也來了张漂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谨娜,失蹤者是張志新(化名)和其女友劉穎航攒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趴梢,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡漠畜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坞靶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憔狞。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖彰阴,靈堂內(nèi)的尸體忽然破棺而出瘾敢,到底是詐尸還是另有隱情,我是刑警寧澤尿这,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布簇抵,位于F島的核電站,受9級特大地震影響射众,放射性物質(zhì)發(fā)生泄漏碟摆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一叨橱、第九天 我趴在偏房一處隱蔽的房頂上張望典蜕。 院中可真熱鬧,春花似錦罗洗、人聲如沸嘉裤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屑宠。三九已至,卻和暖如春仇让,著一層夾襖步出監(jiān)牢的瞬間典奉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工丧叽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卫玖,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓踊淳,卻偏偏與公主長得像假瞬,于是被迫代替她去往敵國和親陕靠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容