06 · 调试与 mock 复现指南
车门信号调试、AIDL/HIDL mock 注入、日志关键字、排查方法论
1. 平台判定(AIDL vs HIDL)
不同车型平台的车信号 mock 路径不同,先判定平台:
adb shell service list | grep automotive.vehicle| 输出 | 平台 | 典型车型 |
|---|---|---|
android.hardware.automotive.vehicle.IVehicle | AIDL | newton(Lemans 27B)/ 大多数新平台 |
android.hardware.automotive.vehicle@2.0::IVehicle | HIDL | suiren(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 ElapsedRealtimeNanos2.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 0x66403101JIRA 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. 日志关键字速查
| 关键字 | 出现位置 | 排查什么 |
|---|---|---|
VehicleControlManager | logcat | set 是否打印(下行是否发出) |
CarPropertyCacheManager | logcat | 上报是否到达(onChangeEvent) |
onPropertyChanged | CarSettings logcat | 是否分发到业务层 |
[Delay] register callback | DoorUnLockActivity 自打 | 首注册耗时(JIRA 1839 异步铁证) |
un-excepted observe propId | SCPM logcat [:682] | 信号没进 observedSet,业务层收不到回调 |
onSetPropertyTimeout | SCPM logcat | 下发超时未回弹 |
onDataVerifyFailed | SCPM logcat | 下发值 ≠ 回弹值 |
mock error / mock timeout | SCPM logcat | 本地 mock 错误/超时开关被触发 |
START DoorUnLockActivity | logcat | 弹窗拉起 |
Displayed com.android.car.settings...DoorUnLockActivity | logcat | 弹窗真正显示 |
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. 常见坑
| 坑 | 现象 | 原因 |
|---|---|---|
收不到 onPropertyChanged | set/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源码解析