06 · 调试与 mock 复现指南

车门信号调试、AIDL/HIDL mock 注入、日志关键字、排查方法论

1. 平台判定(AIDL vs HIDL)

不同车型平台的车信号 mock 路径不同,先判定平台

adb shell service list | grep automotive.vehicle
输出平台典型车型
android.hardware.automotive.vehicle.IVehicleAIDLnewton(Lemans 27B)/ 大多数新平台
android.hardware.automotive.vehicle@2.0::IVehicleHIDLsuiren(YU7)等老平台

2. mock 注入命令

2.1 AIDL 平台(newton / Lemans 27B)

# 触发离车提醒弹窗(JIRA 1838/1839 复现)
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/micar \
    --mock_from_car 0x61403156 -a 0x0 --stat 0x0 -i 1   # v=1 LOCK_FAIL 弹窗
 
# 模拟取消
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/micar \
    --mock_from_car 0x61403156 -a 0x0 --stat 0x0 -i 2   # v=2 CANCEL 自杀
 
# 模拟车门状态(某 area 开/关)
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/micar \
    --mock_from_car 0x66403101 -a 0x40 --stat 0x0 -i 1  # 右后门(0x40) 开

参数含义:-a = area(位掩码),--stat = status,-i = int value。

2.2 HIDL 平台(suiren / YU7)

adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle \
    --mock_from_car 0x61403156 -a 0x0 -i 1

⚠️ HIDL lshal 在 AIDL 平台(newton)上报 does not exist/no permission(即使 setenforce 0),反之亦然。务必先做平台判定。

2.3 验证 mock 通道生效(timestamp 法)

# mock 前后各取一次 ElapsedRealtimeNanos,变化即通道生效
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/micar | grep ElapsedRealtimeNanos

2.4 复现注意事项

  • 首次 mock 像冷启动:car_service 缓存空时,能暴露「首帧默认态」窗口(JIRA 1839 现象)。
  • 后续 mock 不复现首帧问题car_service 系统层缓存 Door.STATE 全关,onChangeEvent 快速到达跳过 XML 默认窗口。要稳定复现需 reboot 车机让 car_service 冷。
  • force-stop car.settings 无效:只清 app 层 CarPropertyCacheManager 单例,car_service 层缓存仍在

3. 实时查询车信号(dumpsys car_service)

# 查某 propId 的配置 + 订阅者
adb shell dumpsys car_service --services CarPropertyService | grep -A5 0x66403101
 
# 查车门状态所有 area
adb shell dumpsys car_service --services CarPropertyService | grep -A20 0x66403101

JIRA 1839 现场取证输出示例:

0x61403156  GLOBAL  1 client
0x66403101  areaType=DOOR  6 area  MiCarPropertyService 11 个订阅者
  ROW_1_LEFT=0x1  ROW_1_RIGHT=0x4  ROW_2_LEFT=0x10  ROW_2_RIGHT=0x40
  HOOD=0x10000000  REAR=0x20000000

4. 日志关键字速查

关键字出现位置排查什么
VehicleControlManagerlogcatset 是否打印(下行是否发出)
CarPropertyCacheManagerlogcat上报是否到达(onChangeEvent)
onPropertyChangedCarSettings logcat是否分发到业务层
[Delay] register callbackDoorUnLockActivity 自打首注册耗时(JIRA 1839 异步铁证)
un-excepted observe propIdSCPM logcat [:682]信号没进 observedSet,业务层收不到回调
onSetPropertyTimeoutSCPM logcat下发超时未回弹
onDataVerifyFailedSCPM logcat下发值 ≠ 回弹值
mock error / mock timeoutSCPM logcat本地 mock 错误/超时开关被触发
START DoorUnLockActivitylogcat弹窗拉起
Displayed com.android.car.settings...DoorUnLockActivitylogcat弹窗真正显示

5. 三层 ground truth 方法论

调试车控 bug,按可信度从高到低取证:

graph TD
    A["① milogcat CARSIGNAL<br/>车端原始流<br/>(最底层,最可信)"]
    B["② 主txt bugreport<br/>Java/Framework 层<br/>(wm_*/Activity/SurfaceFlinger)"]
    C["③ 源码<br/>(逻辑闭环)"]
    D["JIRA 字段<br/>(弱参考,常误标)"]

    A --> B --> C
    D -.->|仅弱参考| C

    style A fill:#c8e6c9
    style D fill:#ffcdd2
  • ① milogcat:车端 3-MW 信号原始流,最能说明「车端到底发了什么」。pub p=0xXXXX,a=X,v=X 格式。
  • ② 主txt:bugreport 主文件,含 wm_create_activity / reportDrawFinished / setAlpha 等时序铁证。
  • ③ 源码:逻辑闭环,解释「为什么现象如此」。
  • JIRA 字段:误报/已修复/Gerrit 等字段常维护混乱(1838/1839 都有),仅弱参考,不能全信

6. 门开关排查 Checklist

现象「点了不生效 / 状态不刷新 / 切换后弹回」时,按链路从两头查:

[设置页主动操作 - 主线A]
用户点击
  → Controller.onClickButton 是否触发?         (断点/日志)
  → setCarPropertyBySync 是否调用?             (搜 VehicleControlManager set 日志)
  → 车端是否收到?                              (milogcat CARSIGNAL 搜 set)
  → 车端回弹?                                  (milogcat 搜对应 propId pub)
  → onChangeEvent 到达 App?                    (搜 CarPropertyCacheManager)
  → onPropertyChanged 分发?                    (搜 Controller 名字; 没收到则查 observedSet)
  → updateUI 执行?                             (断点)

[离车提醒弹窗 - 主线B]
车端发 0x61403156 v=1?                         (milogcat)
  → UnlockDoorTrigger 拉起?                    (搜 START DoorUnLockActivity)
  → DoorUnLockActivity onCreate?               (搜 wm_create_activity)
  → 首帧渲染?                                  (reportDrawFinished)
  → registerPropertyCallback 完成?             ([Delay] register callback 耗时)
  → onChangeEvent 逐门到达?                    (onPropertyChanged propertyId: 0x66403101)
  → 图标更新?                                  (setImageResource)

7. 常见坑

现象原因
收不到 onPropertyChangedset/get 都正常但回调不来propId 没加进 mObservedPropertyIdSet(没 registerPropertyCallback
首帧图标错乱弹窗首瞬显示错误态后闪烁纠正XML 默认态 + 异步注册(JIRA 1839)
弹窗重复弹短时间多次弹信号源重复发 + 上游无 cooldown(JIRA 1838)
mock 不复现第二次 mock 现象消失car_service 缓存未清,需 reboot
area 标反「左后开」实际是右后0x40=ROW_2_RIGHT,位掩码易读反
HIDL 命令失效does not exist车型是 AIDL 平台,要用 IVehicle/micar

← 返回 00-README.md | 底层机制见 SettingsCarPropertyManager源码解析