使用高可用性渲染程序 (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-xcrate 完成。例如har-platform-linux或har-platform-android。
如果没有指定的平台实现,您将无法构建或测试 HAR crate。这是有意为之,因为 HAR 框架是一个框架。
指定了平台的应用必须使用此框架进行构建,才能正常运行和接受测试。下图展示了 HAR 框架与平台之间的连接:
图 1. HAR crate。
display-safety 中的常规结构
此设计向 display_safety 代码库添加了一系列新的 crate,如图 2 所示:
图 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 锁定,以防止包含在正式版 build 中。 |
命名惯例和框架结构
下表列出了这些名称和结构:
HAR 框架提供的预期子系统
trait实例。每个trait都代表一个必须实现的平台专用子系统。任何平台 crate 中平台专用子系统实现的预期名称。基于 HAR 的应用需要实现这些特定名称。
相关的 HAR 框架
enum和struct实例,通常用于将信息从平台相关实现传递到 HAR 框架。
| 特征名称 | 实现名称 | HAR 框架枚举和结构体 |
|---|---|---|
GlContextFactory |
OpenGL |
trait harry::Rendererharry::DisplayRotation |
AudioApiFactory |
Audio |
harry::AudioApiharry::AudioDeviceharry::VolumeMillibel |
ICameraManager |
Camera |
harry::ICameraDeviceharry::CameraDescriptor |
Looper |
Looper |
harry::LooperMessageharry::LooperOptionsharry::DisplayId |
PlatformVehicleData |
VehicleData |
harry::VehicleDataTypeharry::VehicleDataListener |
ResourceManager(结构体) |
ResourceManager |
harry::ResourceManagerMessageharry::ResourceTokenharry::RawImageData |
PlatformTracing |
Tracing |
不适用 |
HarPerformanceMonitor |
Monitoring |
harry::Rendererharry::ResolveLatencyToken |
PlatformTestSupport |
TestSupport |
harry::TestConfigharry::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 build(由 Android.bp 文件定义),测试会作为 Android 平台 build 系统的一部分进行编译,其执行由 atest 管理。
运行测试套件
如需测试单个平台,请将 atest 命令与相关测试目标(例如 atest <module_name>)搭配使用。此命令会在 Android 设备或模拟器上部署并运行测试。