Newton / YU7 VHAL 架构与调试入口(AIDL)
📌 本篇基于 yu7 整机源码核实,沉淀 2026-07 对 newton/YU7 平台 VHAL 的调研结论。 一句话:newton/YU7 跑的是纯 AIDL
vendor.micar.hardware.vehicle@2.0-service,老 HIDL 的lshal debug命令全部失效,改用dumpsys。 配套调试命令详见《车辆信号调试 Q&A — CarService与VHAL》2.2,本篇讲清”为什么”与”架构全貌”。
TL;DR
# 1. 平台判定(AIDL vs HIDL)
adb shell service list | grep automotive.vehicle
# android.hardware.automotive.vehicle.IVehicle → AIDL(newton / YU7 / 新平台)
# android.hardware.automotive.vehicle@2.0::IVehicle → HIDL(suiren 等老平台)
# 2. AIDL 平台调试主力(newton)
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/micar # VHAL 状态总览
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/micar --get 0x66403101 # 读 prop(DOOR_STATE)
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/micar --mock_from_car 0x66403101 -i 1 -a 0x40 --stat 0 # 注入(右后门开)
adb shell dumpsys micar_property # 全量 prop config(推荐)一、平台演进:1.0 HIDL → 2.0 AIDL
newton/YU7 实际打包启用 2.0(AIDL),1.0 不编译进镜像。决策在 device/micar/common/vendor/vendor_common.mk:9-28:
| 条件 | 启用的 VHAL | 平台 |
|---|---|---|
PLATFORM_VERSION == 12 | vendor.micar.hardware.vehicle@1.0-service(HIDL) | Android 12 XCD |
is-mivendor-region-cn == true(TARGET_PRODUCT 含 cn) | @1.0-service(HIDL) | CN 版 |
| 其余(含 yu7 / newton,非 CN 非 A12) | vendor.micar.hardware.vehicle@2.0-service(AIDL) | newton / YU7 / 海外 |
💡 旧知识库「2.1 替换
@1.0-service、2.2 调试@2.0::IVehicle」的混乱根因:作者把”源码里vehicle/1.0与vehicle/2.0目录并存”误读为”两套都在跑”。实际 yu7 只编译 2.0;1.0/是给 CN/A12 平台共用的遗留。@1.0与@2.0指两个不同的 HAL(micar 私有 transport vs AOSP 标准 vehicle),不是同一接口的两个版本。
二、AIDL VHAL 架构:同进程双实例
2.0-service 在一个进程里注册两个 IVehicle AIDL 实例(hal-impl/service/aidlvhal/MiAidlVehicleManager.cpp:47-75):
| 实例 | 实现类 | 用途 | prop 来源 |
|---|---|---|---|
IVehicle/default | AAOSVehicleHal + AAOSVehicleHardware(aaos/) | AOSP 标准 CarService(GAS 兼容) | 224 个 AOSP VehicleProperty::,来自 MiVehicleProperties.json |
IVehicle/micar | MiVehicleHal + MiVehicleHardware(micar/) | 小米车控上层(MiVehicleService / support-lib) | ~3791 个自定义 MiVehicleProperty,来自 MiVehicleProperty.aidl + DefaultAidlVehicleConfig.cpp |
两实例共享同一个 MiVehicleClient,通过 GasVehiclePropertyMapper 做 micar↔GAS 属性双向映射,让 /default 上的标准 Car API 能落到 micar 信号链路。车控调试用 /micar。
三、完整信号链路
Framework(CarService Java)
↓ IVehicle AIDL
vehicle@2.0-service(VHAL):/default(AAOS) + /micar(扩展)
↓ IntraClient(进程内 vhal_interface)
CarService C++ 中间件(vendor/micar/middleware/CarService)
↓ AIDL binder
vehiclecore-service(IMiVehicleCore/default) ← MCU 信号枢纽
↓ SPI / GPIO / Ethernet
MCU / CAN / QNX
vehiclecore(vendor.micar.hardware.vehiclecore.IMiVehicleCore/default)不是 VHAL 的一部分,而是更底层的 MCU 桥:所有车端原始信号经它入 SOC,所有下行控制经它出 MCU。VHAL 不直接碰 MCU。这也解释了为什么 ps 里看到的 vendor.micar.hardware.vehicle@2.0-service 与调试用的 IVehicle/micar 是两层东西——一个是 transport/服务进程,一个是可 dump 的 AIDL 接口。
四、调试入口总表(AIDL / newton)
| 入口 | 命令 | 用途 |
|---|---|---|
| VHAL 直连 | dumpsys android.hardware.automotive.vehicle.IVehicle/micar | 状态总览 / --get / --set / --mock_from_car(仅此 3 子命令) |
| 框架属性层(推荐查配置) | dumpsys micar_property | 全量 ~3951 VehiclePropConfig(prop / access / area / 取值范围) |
| CarService 层 | dumpsys car_service inject-vhal-event / publish-vhal-event | 框架层注入 / 下发 |
| 车端信号流 | adb shell milogcat -s CARSIGNAL | 车端原始信号(目录 /data/milog/milogcat/CARSIGNAL/) |
| vehiclecore mock | vc_client_mock(已进 PRODUCT_PACKAGES) | 订阅 / 发送 vehiclecore 信号 |
VHAL dump 三子命令(源码 hal-impl/service/common/MiVehicleClient.cpp:501-516):
--get PROP [PROP...]:读,自动遍历该 prop 所有 area,无副作用。--set PROP [-i/-i64/-f 多值] [-s/-b/-a/-t 单值]:真实写入并下发到车端。--mock_from_car PROP [flag val]...:注入伪造”车端上报”事件(不真写源,只扇出给订阅者);每个 flag 只接 1 个值(多值需重复 flag);--stat 0/1/2 = AVAILABLE/UNAVAILABLE/ERROR;timestamp 自动。
⚠️
-h/--help永远空输出(源码无 help 分支,未知子命令直接return "")。 已废弃(AIDL 已删,勿用):--mock_set_enable、--log_optional_enable、--manager、--rebuild_connection。 ⚠️ user 版系统下cmd car_service的交互式 get/set 会被SecurityException拦(需 userdebug/eng);VHAL 层dumpsys ... --get / --mock_from_car不受此限。
五、prop 字典:ID 含义与位布局
**示例 prop 1715482881 = 0x66403101 = MiVehicleProperty::DOOR_STATE(车门状态)**(hidlproperty/1.0/types.hal:4704-4710)。旧文档/Q&A 里反复出现的 1715482881` 就是它。
prop ID 位布局(AOSP VehicleProperty 惯例,micar 扩展了 group):
| bits | 字段 | 示例值 |
|---|---|---|
| 28–31 | group | MICAR=0x60000000(SYSTEM=0x10000000、VENDOR=0x20000000) |
| 20–27 | type | INT32=0x00400000 |
| 8–19 | zone | DOOR=0x00003100 |
| 0–7 | ordinal | 0x01 |
0x66403101 = 0x60000000 | 0x00400000 | 0x00003100 | 0x01 = 1715482881 ✓
字典文件(按权威性):
- 代码生成源:
vehicle/1.0/scripts/SOA_signal_parse/soa_excel/A3.xlsx(SOA Excel 真源)→ 由soa_parser.py生成下两套; - AIDL / 2.0:
hal-impl/aidlproperty/.../MiVehicleProperty.aidl(3791 条枚举)+ 同目录DefaultAidlVehicleConfig.cpp(3792 条配置); - HIDL / 1.0:
hidlproperty/1.0/types.hal(3788 条)+MiVehicleDefaultConfig.cpp; - AIDL 运行时 JSON:
MiVehicleProperties.json(224 条,全是 AOSP prop,0 条 micar 自定义),只喂/default实例。
六、areaId 语义(含常见误标纠正)
--get 返回的 areaId 取值(MiVehicleZone / VehicleAreaBodyExt):
| areaId | 语义(取决于 prop 所属 zone) |
|---|---|
| 1 / 4 / 16 / 64 | AOSP VehicleAreaSeat:1=ROW1左, 4=ROW1右, 16=ROW2左, 64=ROW2右;或 micar VehicleAreaBodyExt:1=FRONT, 4=REAR, 0x10=LEFT, 0x40=RIGHT |
| 0 | 全局属性(无 area) |
⚠️ 误标纠正:若在日志 / dump 里看到
areaId = 268435456或536870912,它们不是 area:
268435456 = 0x10000000=MiVehiclePropertyGroup.SYSTEM536870912 = 0x20000000=MiVehiclePropertyGroup.VENDOR这是 prop ID 高 nibble 的 group 位,出现在 areaId 字段是采集 / 打印端误标。真正 micar 自定义 group 是
MICAR = 0x60000000。
七、关键源码索引(yu7)
- 版本决策:
device/micar/common/vendor/vendor_common.mk:9-28;region 宏device/xiaomi/common/vendor/definitions.mk:5-7 - 2.0 服务入口:
vendor/micar/proprietary/interfaces/vehicle/2.0/aidl/main.cpp - 双实例注册:
vendor/micar/.../hal-impl/service/aidlvhal/MiAidlVehicleManager.cpp:47-75 - dump 子命令解析:
vendor/micar/.../hal-impl/service/common/MiVehicleClient.cpp:501-943 - vehiclecore MCU 桥:
vendor/micar/.../vehiclecore/.../IMiVehicleCore.aidl - prop 字典(AIDL):
vendor/micar/.../hal-impl/aidlproperty/.../MiVehicleProperty.aidl+DefaultAidlVehicleConfig.cpp - prop 字典(HIDL):
vendor/micar/.../hidlproperty/1.0/types.hal+MiVehicleDefaultConfig.cpp - zone/area 枚举:
MiVehicleZone.aidl/VehicleAreaBodyExt.aidl/VehicleAreaSeatExt.aidl - 架构文档(⚠️ 以 1.0-service 视角写,对 newton 需按本篇校正):
vendor/micar/.../hal-impl/docs/CODEMAPS/
🔗 配套阅读:《车辆信号调试 Q&A — CarService与VHAL》(调试命令)、《MiCarPropertyService 接入文档》(框架属性层 API)、《Mi AAOS 信号体系实现》(信号体系设计)。