HAR 平台抽象層

使用高可用性算繪器 (HAR) 顯示 Android 無法顯示的車輛資訊。這可能是因為啟動、可用性、安全性或法規等問題。HAR 是以 Rust 編寫的可攜式內建應用程式。

HAR (又稱 HAR 架構) 包含用於建構應用程式的程式碼。以 HAR 建構的應用程式稱為「以 HAR 為基礎的應用程式」。HAR 架構包含不同平台的程式碼區段。舉例來說,在 Linux 系統上,您可以使用 tinyalsa 等程式庫來處理音效。QNX 有專屬的音訊程式庫。

平台包括硬體、作業系統、系統程式庫和其他因素。平台專屬程式碼包含稱為子系統的部分。每個子系統都會處理一項平台功能,例如音訊、EVS 攝影機或車輛資料。如要支援平台,HAR 架構必須實作所有子系統。

平台專屬子系統程式碼可能會在與 HAR 型應用程式相同的程序中執行,也可能在不同的程序中執行。如果分開處理,這段程式碼會處理程序間通訊 (IPC),協助驗證平台是否支援應用程式。複雜的 IPC 機制必須屬於平台專屬程式碼。

HAR 測試套件會針對平台實作的所有子系統執行測試。使用這套工具檢查平台是否符合 HAR 需求,並找出任何新問題。

術語

本頁面包含以下條款:

以 HAR 為基礎的應用程式
使用 HAR 架構建構的 OEM 或特定功能專用應用程式。應用程式會因應用程式狀態和其他可自訂的層面而有所不同。
HAR 架構
提供用於建構應用程式的核心工具集。
HAR 平台抽象化
HAR 架構的一部分,提供所有目標平台都必須實作的已知 API。
HAR 測試套件
針對平台實作項目進行一系列已知測試,協助驗證平台實作項目是否支援特定平台上的 HAR 架構。

不在範圍內

HAR 未解決下列問題:

  • 所有目標平台的個別實作:目標平台的實作。本頁面說明平台實作項目必須滿足的介面,以及測試套件必須符合的條件。

  • 測試案例:所有介面的特定測試案例。本頁面會說明介面的個別函式,包括引數、傳回值、預期行為和預期副作用。本頁面說明測試套件,您可以在其中導入及執行測試案例。

平台抽象化高階 Crate 結構

Rust 專案是由 Crate 組成。圖 1 顯示 HAR 平台抽象層的 Crate 結構。平台抽象層會影響兩個以上的 Rust Crate:

  • 抽象化 (Rust trait 說明) 位於 HAR 架構 Crate 中。

  • 平台實作項目會使用獨立的 har-platform-x Crate。例如 har-platform-linux 或 har-platform-android。

如未指定平台實作項目,就無法建構或測試 HAR Crate。這是刻意設計,因為 HAR 架構就是架構。

指定平台的應用程式必須使用這個架構建構,才能運作及測試。下圖說明 HAR 架構與平台之間的連結:

HAR Crate

圖 1. HAR Crate。

display-safety 中的一般結構

這個設計會在 display_safety 存放區中新增一系列 Crate,如圖 2 所示:

HAR Crate、架構和應用程式

圖 2. 抽象模組。

測試套件的結構與應用程式類似,但只依賴指定的平台實作 Crate。測試套件必須參照 HAR 架構中定義的特徵和結構,但不得參照更複雜的實作項目。

平台抽象層高階說明

下表說明 HAR 平台抽象層定義的平台專屬子系統。

抽象名稱 相關函式 說明 附註
OpenGL 2D 算繪 為 HAR 架構 Crate 提供 OpenGLES 2.0/3.0 算繪功能。
Audio 音訊算繪 提供 Android SoundPool 介面,用於管理及播放系統音訊。
Camera 車輛攝影機畫面 提供類似 EVS HAL 的介面,可管理及顯示車輛攝影機資訊。
Looper 應用程式主迴圈和顯示設定 提供類似 Android Looper 的介面,用於管理平台專屬的應用程式主迴圈和顯示設定。
UserInput 觸控、鍵盤、方向盤或旋轉控制器,以及其他平台專屬輸入方式 提供介面,可為以 HAR 為基礎的應用程式提供觸控和鍵盤輸入功能。以 Linux evdev 為基礎的參考實作 har-user-input-evdev。
VehicleData 車輛狀態輸入 提供介面,可為以 HAR 為基礎的應用程式提供任意車輛資料串流,例如 Android VHAL 或 CAN 匯流排提供的資料。
ResourceManager 應用程式專屬的快取設計文件 提供 HAR 啟動所需的資源 (例如快取圖片和設計文件) 記憶體內快取。目前尚未實作磁碟快取。
Logging 系統記錄和遙測 使用追蹤系統提供平台專屬的記錄支援。這項功能可收集平台所需的遙測資料。
Tracing 系統追蹤 提供抽象機制,可與追蹤和剖析系統整合。
Monitoring 系統監控 這個工具包可監控 HAR 架構內的效能和延遲時間。
Commlib 車輛資料 使用 protobuf 序列化的參考實作。 已淘汰:請使用 reference/harry-control-api 中定義的 API,並實作 harry-grpcio-server 和 harry-tonic-server (參考實作)。
TestSupport 測試支援掛鉤 支援測試案例的建構和拆解、測試事件的產生,以及測試構件的建立。例如,產生模擬觸控事件來測試 UserInput,以及產生螢幕截圖以供分析。 Rust 會鎖定這項功能,避免納入正式版建構作業。

命名慣例和架構結構

下表列出這些名稱和結構:

  • HAR 架構提供的預期子系統 trait 例項。每個 trait 代表必須實作的平台專屬子系統。

  • 任何平台 Crate 中平台專屬子系統實作項目的預期名稱。以 HAR 為基礎的應用程式會預期實作這些特定名稱。

  • 相關的 HAR 架構 enum 和 struct 執行個體通常用於將資訊從平台相關實作項目傳遞至 HAR 架構。

特徵名稱 實作名稱 HAR 架構列舉和結構體
GlContextFactory OpenGL trait harry::Renderer
harry::DisplayRotation
AudioApiFactory Audio harry::AudioApi
harry::AudioDevice
harry::VolumeMillibel
ICameraManager Camera harry::ICameraDevice
harry::CameraDescriptor
Looper Looper harry::LooperMessage
harry::LooperOptions
harry::DisplayId
PlatformVehicleData VehicleData harry::VehicleDataType
harry::VehicleDataListener
ResourceManager (結構) ResourceManager harry::ResourceManagerMessage
harry::ResourceToken
harry::RawImageData
PlatformTracing Tracing 不適用
HarPerformanceMonitor Monitoring harry::Renderer
harry::ResolveLatencyToken
PlatformTestSupport TestSupport harry::TestConfig
harry::TestDisplayConfig

錯誤與錯誤處理機制

建議的 API 使用 Rust Result<> 型別。Rust 會要求您檢查攜帶錯誤的型別。Result否則,編譯器會產生警告或錯誤。建構時間檢查會強制執行平台專屬程式碼的錯誤檢查。

平台實作項目傳回的錯誤屬於 harry::error::Error 類型。如要確認平台錯誤類型不會洩漏到應用程式程式碼中,請使用 HAR 架構提供的標準錯誤類型。

harry::error::Error 型別會擴充,納入所有子系統的特定錯誤:

// This is Rust
pub enum Error {
  Msg(String), // A generic message string
  // Legacy error type, likely to be removed or merged into Msg
  Audio(String),
}

無法復原的錯誤主要會透過定義的介面和回呼傳回。

測試套件詳細設計

本節說明測試套件的設計,該套件會驗證抽象概念的平台專屬實作項目。

建構測試套件測試

如果是 Soong 建構作業 (由 Android.bp 檔案定義),測試會編譯為 Android 平台建構系統的一部分,並由 atest 管理執行作業。

執行測試套件

如要測試個別平台:

使用 atest 指令搭配相關測試目標 (例如 atest <module_name>)。這項指令會在 Android 裝置或模擬器上部署及執行測試。