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 == 12vendor.micar.hardware.vehicle@1.0-service(HIDL)Android 12 XCD
is-mivendor-region-cn == trueTARGET_PRODUCTcn@1.0-service(HIDL)CN 版
其余(含 yu7 / newton,非 CN 非 A12)vendor.micar.hardware.vehicle@2.0-serviceAIDLnewton / YU7 / 海外

💡 旧知识库「2.1 替换 @1.0-service、2.2 调试 @2.0::IVehicle」的混乱根因:作者把”源码里 vehicle/1.0vehicle/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/defaultAAOSVehicleHal + AAOSVehicleHardwareaaos/AOSP 标准 CarService(GAS 兼容)224 个 AOSP VehicleProperty::,来自 MiVehicleProperties.json
IVehicle/micarMiVehicleHal + MiVehicleHardwaremicar/小米车控上层(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 mockvc_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–31groupMICAR=0x60000000SYSTEM=0x10000000VENDOR=0x20000000
20–27typeINT32=0x00400000
8–19zoneDOOR=0x00003100
0–7ordinal0x01

0x66403101 = 0x60000000 | 0x00400000 | 0x00003100 | 0x01 = 1715482881

字典文件(按权威性)

  1. 代码生成源vehicle/1.0/scripts/SOA_signal_parse/soa_excel/A3.xlsx(SOA Excel 真源)→ 由 soa_parser.py 生成下两套;
  2. AIDL / 2.0hal-impl/aidlproperty/.../MiVehicleProperty.aidl(3791 条枚举)+ 同目录 DefaultAidlVehicleConfig.cpp(3792 条配置);
  3. HIDL / 1.0hidlproperty/1.0/types.hal(3788 条)+ MiVehicleDefaultConfig.cpp
  4. AIDL 运行时 JSONMiVehicleProperties.json(224 条,全是 AOSP prop,0 条 micar 自定义),只喂 /default 实例。

六、areaId 语义(含常见误标纠正)

--get 返回的 areaId 取值(MiVehicleZone / VehicleAreaBodyExt):

areaId语义(取决于 prop 所属 zone)
1 / 4 / 16 / 64AOSP VehicleAreaSeat:1=ROW1左, 4=ROW1右, 16=ROW2左, 64=ROW2右;或 micar VehicleAreaBodyExt:1=FRONT, 4=REAR, 0x10=LEFT, 0x40=RIGHT
0全局属性(无 area)

⚠️ 误标纠正:若在日志 / dump 里看到 areaId = 268435456536870912它们不是 area

  • 268435456 = 0x10000000 = MiVehiclePropertyGroup.SYSTEM
  • 536870912 = 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 信号体系实现》(信号体系设计)。