???????????????
1主流車載操作系統(tǒng)架構(gòu)

?????當(dāng)前國內(nèi)主流車載操作系統(tǒng)的架構(gòu)如上所示,左側(cè)是汽車的儀表屏幕,一般是?QNX?系統(tǒng),右側(cè)是汽車的中控、副駕屏幕,操作系統(tǒng)一般是Android。
1.1CAN
控制器局域網(wǎng)(Controller Area Network,簡稱CAN或者CAN bus) 是一種功能豐富的車用總線標(biāo)準(zhǔn)。被設(shè)計用于在不需要主機(jī)(Host)的情況下,允許網(wǎng)絡(luò)上的單片機(jī)和儀器相互通信。 它基于消息傳遞協(xié) 議,設(shè)計之初在車輛上采用復(fù)用通信線纜,以降低銅線使用量,后來也被其他行業(yè)所使用。
CAN 是車載領(lǐng)域很重要的一種通信總線,我們在中控屏上可以隨時查看、設(shè)置車門、發(fā)動機(jī)、后備箱這些模塊,其實(shí)就是借助CAN bus實(shí)現(xiàn)的。
1.2MCU
微控制器單元,它負(fù)責(zé)著汽車很大一部分的功能,例如通過車載控制器對各項(xiàng)數(shù)據(jù)進(jìn)行分析處理,以做出最優(yōu)決策;負(fù)責(zé)對車輛的信息娛樂交互和運(yùn)動控制等等。
總的來說,MCU可以應(yīng)用于車輛的通訊、能源、存儲、感知以及計算,對汽車行業(yè)有著重要的作用。
1.3 SOC
SOC的定義多種多樣,由于其內(nèi)涵豐富、應(yīng)用范圍廣,很難給出準(zhǔn)確定義。一般說來, SOC稱為系統(tǒng)級芯片 ,也有稱片上系統(tǒng)(System on Chip ),意指它是一個產(chǎn)品,是一個有專用目標(biāo)的集成電路,其中包含完整系統(tǒng)并有嵌入軟件的全部內(nèi)容。
車載Soc和常見的手機(jī) Soc 非常類似,內(nèi)部集成了 CPU 和 GPU 。目前最主流的車載 Soc 是高通的 8155 ,它就是高通在手機(jī)Soc 驍龍 855 的基礎(chǔ)上發(fā)展而來的。
1.4 QNX
QNX是商業(yè)類 Unix實(shí)時操作系統(tǒng),主要針對嵌入式系統(tǒng)市場。QNX采取微核心架構(gòu),操作系統(tǒng)中的多數(shù)功能是以許多小型的task來執(zhí)行,它們被稱為server。這樣的架構(gòu)使得用戶和開發(fā)者可以關(guān)閉不需要的功能,而不需要改變操作系統(tǒng)本身。
QNX的應(yīng)用十分廣泛,被廣泛應(yīng)用于汽車、軌道交通、航空航天等對安全性、實(shí)時性要求較高的領(lǐng)域,在汽車領(lǐng)域的市場占有率極高。
1.5 Hypervisor
一種運(yùn)行在基礎(chǔ)物理服務(wù)器和操作系統(tǒng)之間的中間軟件層,可允許多個操作系統(tǒng)和應(yīng)用共享硬件。也可叫做VMM( virtual machine monitor ),即虛擬機(jī)監(jiān)視器。
目前國內(nèi)主流的汽車座艙,都是在一個SOC 上同時運(yùn)行著兩個不同特性的操作系統(tǒng)。對娛樂、應(yīng)用生態(tài)有需求的中控、副駕一般由Android 系統(tǒng)控制,而對穩(wěn)定性、安全性要求較高的儀表盤,則由 QNX 系統(tǒng)直接控制,Android可以看做是一個運(yùn)行在 QNX 上的虛擬系統(tǒng),其底層技術(shù)原理就是Hypervisor。
其實(shí)以上說得這些都是從Android 工程師角度看到的車載操作系統(tǒng),實(shí)際上這只是車載操作系統(tǒng)的冰山 一角,最底層的 Other Hardware 更能代表智能汽車操作系統(tǒng)的核心,它包含高級駕駛輔助系統(tǒng)、泊車 輔助系統(tǒng)、自動駕駛系統(tǒng)、 TCU 、 4G/5G 網(wǎng)關(guān)、中央控制器等等。這些復(fù)雜的硬件與軟件共同組成了一 個智能汽車操作系統(tǒng)。
2 Android Automotive平臺
???2.1?????Android Automotive是通過?Android?的通用框架,語言和?API來實(shí)現(xiàn)的一個全棧,開源,高度可定制的平臺

???????????????????????????。
Service Layer
系統(tǒng)服務(wù)包含在服務(wù)層中,由SystemServer啟動。它們以系統(tǒng)進(jìn)程的形式運(yùn)行,這使它們擁有普通 Android 服務(wù)所不具備的額外權(quán)限。OEM 廠商可以利用這些服務(wù)開發(fā)其他應(yīng)用程序,而不需要編寫重復(fù)的代碼。此外,OEM 也可以將服務(wù)作為一個額外的安全層,以避免應(yīng)用程序和硬件抽象層之間的直接通信。
Vehicle HAL
VHAL的作用是向系統(tǒng)服務(wù)層公開通用的汽車接口,且接口可擴(kuò)展、與特定車輛型號無關(guān)。這些接口包括:
訪問&發(fā)送車輛 ECU 的信號
訪問從車輛ECU到 IVI 操作系統(tǒng)產(chǎn)生的信號
訪問車輛網(wǎng)絡(luò)上的面向服務(wù)的功能(例如SOME-IP)
2.2 ?根目錄結(jié)構(gòu)
├── abi/ ?????????????????????????# 應(yīng)用二進(jìn)制接口定義
├── art/ ?????????????????????????# Android Runtime (ART)
├── bionic/ ??????????????????????# C 運(yùn)行時庫 (libc, libm 等)
├── bootable/ ????????????????????# 啟動相關(guān)代碼
│ ??├── bootloader/ ??????????????# Bootloader 抽象層
│ ??├── recovery/ ????????????????# Recovery 模式代碼
├── build/ ???????????????????????# 構(gòu)建系統(tǒng)核心
│ ??├── blueprint/ ???????????????# Soong 構(gòu)建系統(tǒng)定義
│ ??├── make/ ????????????????????# Makefile 遺留系統(tǒng)
│ ??├── soong/ ???????????????????# Soong 構(gòu)建邏輯
├── cts/ ?????????????????????????# 兼容性測試套件
├── dalvik/ ??????????????????????# Dalvik 虛擬機(jī) (歷史遺留)
├── developers/ ??????????????????# 開發(fā)者工具
├── development/ ?????????????????# 開發(fā)工具和腳本
├── device/ ??????????????????????# 設(shè)備專屬配置
│ ??├── common/ ??????????????????# 通用設(shè)備配置
│ ??├── automotive/ ??????????????# Automotive 設(shè)備配置
│ ??│ ??├── emulator/ ????????????# Automotive 模擬器配置
│ ??│ ??├── <OEM>/ ???????????????# 車廠定制配置 (e.g., gm, ford)
│ ??│ ??│ ??├── sepolicy/ ????????# 設(shè)備 SELinux 策略
│ ??│ ??│ ??├── overlay/ ?????????# 資源覆蓋配置
├── docs/ ????????????????????????# 官方文檔
├── external/ ????????????????????# 第三方開源項(xiàng)目
│ ??├── v8/ ??????????????????????# V8 JavaScript 引擎
│ ??├── openssl/ ?????????????????# OpenSSL 加密庫
│ ??├── automotive/ ??????????????# Automotive 第三方庫
│ ??│ ??├── vehicle_support/ ?????# 車輛網(wǎng)絡(luò)協(xié)議庫 (CAN, LIN)
├── frameworks/ ??????????????????# 核心框架層
│ ??├── base/ ????????????????????# Android 基礎(chǔ)服務(wù)
│ ??├── native/ ??????????????????# Native 層框架
│ ??├── opt/ ?????????????????????# 可選框架
│ ??│ ??├── automotive/ ??????????# Automotive 特有框架
│ ??│ ??│ ??├── vehicle/ ????????# 車輛服務(wù)框架
│ ??│ ??│ ??├── dashboard/ ???????# 數(shù)字儀表盤支持
│ ??├── av/ ??????????????????????# 多媒體框架
│ ??├── auto/ ????????????????????# Automotive 核心服務(wù) (Android 10+)
├── hardware/ ????????????????????# 硬件抽象層 (HAL)
│ ??├── interfaces/ ??????????????# HAL 接口定義
│ ??│ ??├── automotive/ ?????????# Automotive HAL
│ ??│ ??│ ??├── vehicle/ ????????# 車輛 HAL (VHAL)
│ ??│ ??│ ??├── can/ ????????????# CAN 總線 HAL
│ ??│ ??│ ??├── display/ ????????# 多屏顯示 HAL
│ ??├── libhardware/ ?????????????# HAL 核心庫
│ ??├── libhardware_legacy/ ??????# 遺留 HAL
├── packages/ ????????????????????# 系統(tǒng)應(yīng)用和服務(wù)
│ ??├── apps/ ????????????????????# 預(yù)裝應(yīng)用
│ ??│ ??├── Car/ ?????????????????# Automotive 核心應(yīng)用
│ ??│ ??│ ??├── Launcher/ ???????# 車載啟動器
│ ??│ ??│ ??├── Settings/ ???????# 車載設(shè)置
│ ??│ ??│ ??├── Radio/ ??????????# 車載收音機(jī)
│ ??├── services/ ????????????????# 后臺服務(wù)
│ ??│ ??├── Car/ ????????????????# Automotive 服務(wù)
│ ??│ ??│ ??├── Service/ ????????# CarService 主服務(wù)
│ ??│ ??│ ??├── Projection/ ?????# 手機(jī)投影服務(wù) (Android Auto/CarPlay)
├── system/ ??????????????????????# 底層系統(tǒng)組件
│ ??├── core/ ????????????????????# init、adb 等核心工具
│ ??├── extras/ ??????????????????# 附加工具
│ ??├── vold/ ????????????????????# 卷管理守護(hù)進(jìn)程
│ ??├── automotive/ ??????????????# Automotive 系統(tǒng)擴(kuò)展
│ ??│ ??├── power/ ??????????????# 車輛電源管理
│ ??│ ??├── thermal/ ????????????# 車載熱管理
├── test/ ????????????????????????# 測試框架
├── toolchain/ ???????????????????# 工具鏈配置
├── tools/ ???????????????????????# 開發(fā)工具
├── vendor/ ??????????????????????# 供應(yīng)商定制代碼
│ ??├── automotive/ ??????????????# Automotive 供應(yīng)商擴(kuò)展
│ ??│ ??├── <Tier1>/ ????????????# Tier1 供應(yīng)商代碼 (e.g., Bosch, Continental)
│ ??│ ??│ ??├── hal/ ????????????# 定制 HAL 實(shí)現(xiàn)
│ ??│ ??│ ??├── firmware/ ???????# 車載固件鏡像
├── prebuilts/ ???????????????????# 預(yù)編譯二進(jìn)制文件
├── out/ ?????????????????????????# 編譯輸出目錄
3?以Carservice 為例
?
?
3.1類圖
?

3.2?啟動流程以及App使用

1 ?CarService是車載Android系統(tǒng)的核心服務(wù)之一,所有應(yīng)用都需要通過CarService來查詢、控制整車的狀態(tài)。不僅僅是車輛控制,實(shí)際上CarService幾乎就是整個車載Framework最核心的組件。提供了一系列的服務(wù)與HAL層的VehicleHAL通信,進(jìn)而通過車載總線(例如CAN總線)與車身進(jìn)行通訊,同時它們還為應(yīng)用層的APP提供接口,從而讓APP能夠?qū)崿F(xiàn)對車身的控制與狀態(tài)的顯示。
2 CarServiceHelperService啟動SystemServer進(jìn)程啟動后會調(diào)用main()->run()->startOtherService()方法,通過判斷當(dāng)前系統(tǒng)是否是車載分支的版本(hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)),是則創(chuàng)建CarServiceHelperService。
3 CarServiceHelperService 執(zhí)行 onStart() 的時候,會將后續(xù)的工作交給?CarserviceHelperServiceUpdatableImpl來處理。其onStart() 里調(diào)用binderService()?綁定 action 為?“android.car.ICar”?、package 為?“com.android.car”?的 Service,即構(gòu)成章節(jié)里提到的?CarService組件。
4 ?Carservice的實(shí)現(xiàn)都在父類CarserviceProxy中,比如首先被調(diào)用的onCreate(),內(nèi)部將先調(diào)用 init()。init() 將構(gòu)建mRealServiceClassName?的實(shí)例,而 mRealServiceClassName 變量來自于?UpdatablePackageDependency.java?中定義的?CAR_SERVICE_IMPL_CLASS?常量即?“com.android.car.CarServiceImpl”?。init() 之后是執(zhí)行創(chuàng)建出來的 CarServiceImpl 實(shí)例的 onCreate(),可以看到是繼續(xù)創(chuàng)建關(guān)鍵類?ICarImpl的實(shí)例并再次執(zhí)行init()。
5 ICarImpl 的初始化將完成很多 vehicle 相關(guān)的重要工作.遍歷ICarImpl 實(shí)例構(gòu)造時候創(chuàng)建的各個擴(kuò)展自 CarServiceBase 的實(shí)例,逐個調(diào)用 init() 初始化.
6例如CarPropertyService 傳遞輸入相關(guān)的監(jiān)聽器Listener,PropertyHalService 將 CarPropertyService 作為 Callback 暫存,等待來自 HAL 的 Vehicle Property 變化回調(diào)。
7 對于其他App 來說,想要使用 Car API,通過連接carservice然后getCarManager獲取CarPropertyManager來讀寫車輛屬性。參數(shù)propId?來自于 VehiclePropertyIds 類中定義的屬性 ID
8VehicleHal的回調(diào)通過 onPropertySetError和onPropertyEvent來反饋給PropertyHalService,PropertyHalService通過onPropertySetError和onPropertyEvent方法給CarPropertyService,CarPropertyService通過onEvent給CarPropertyManager,CarPropertyManager通過EventType轉(zhuǎn)換給app 為onErrorEvent和onChangeEvent方法。
9通過 Car mCar= Car.createCar(mContext,mServiceConnection) 創(chuàng)建 mCar,mCar.connect。
在連接上CarService之后,在mServiceConnection會做回調(diào)。
注冊registerCallback該信號在onChangeEvent 和 ?onErrorEvent來監(jiān)聽信號的反饋。
3.3 數(shù)據(jù)流圖
?

?
?
數(shù)據(jù)流說明
?1. 系統(tǒng)啟動流程
SystemServer → CarServiceHelperService → CarServiceProxy → CarServiceImpl → ICarImpl
?↓ ?????
ICarImpl初始化 → 創(chuàng)建PropertyHalService和CarPropertyService
?
?
2. 屬性讀寫流
應(yīng)用層(App) → CarPropertyManager → CarPropertyService → PropertyHalService → VehicleHal → ECU硬件
↓ ?
ECU傳感器數(shù)據(jù) → VehicleHal → PropertyHalService → CarPropertyService → CarPropertyManager → App
3. 事件回調(diào)流
ECU硬件中斷 → VehicleHal → PropertyHalService → CarPropertyService → CarPropertyManager → App ?????
↓ ?
錯誤事件路徑:VehicleHal.onPropertySetError() → 同上
4. 元數(shù)據(jù)依賴
VehiclePropertyIds數(shù)據(jù)庫 → 所有層級 ?????
↓ ?
屬性ID校驗(yàn)、協(xié)議轉(zhuǎn)換、參數(shù)合法性檢查
?
?
?
3.4 用例圖

正向通道:乘客通過發(fā)送乘客請求用例將操作指令(如座椅加熱級別)發(fā)送至CAN總線
反向通道:CAN總線通過接收車輛反饋用例將執(zhí)行結(jié)果(成功/失敗)或傳感器數(shù)據(jù)(當(dāng)前溫度)返回給乘客