02 · 依赖关系图
源码:
base/settingsVehicleLib/src/main/java/com/android/car/settings/miauto/vehicle/SCPM 自身只持有 1 个底层代理VehicleControlManager,其余依赖通过 import 体现。
1. 数据 / 事件 / 连接 三条流向
【数据流向(读写)】
Controller → SettingsCarPropertyManager → VehicleControlManager → CarPropertyCacheManager → AOSP CarPropertyManager
【事件流向(车端回弹)】
AOSP CarPropertyEventCallback
→ CarPropertyCacheManager.mInternalCarPropertyEventCallback
→ SettingsCarPropertyManager.SettingsCarPropertyEventCallback (内部 dispatcher)
→ CarPropertyManagerCallback (业务层)
【连接监听流向】
LocalCarManager → NewBaseCarServiceManager → OnCarServiceListener → CarPropertyManagerCallback
2. 依赖关系图(classDiagram)
classDiagram class SettingsCarPropertyManager { -mCarPropMgr: VehicleControlManager -mCallback: CarPropertyManagerCallback -mPropertiesCache: HashMap -mObservedPropertyIdSet: CopyOnWriteArraySet +getProperty(propId, areaId) +setCarProperty(propId, propVal, areaId, isSync) +registerPropertyCallback(ids) +isConnected() -remoteGetProperty(propId, areaId) -cachePropVal(value) } class VehicleControlManager { +registerPropertyCallback(cb, propId) +unregisterPropertyCallback(cb, propId) +getProperty(propId, areaId) +setIntProperty / setIntPropertyBySync +setFloatProperty / setIntArrayProperty +setBatchProperty / filterSupportedProperties } class VehiclePropertyConfig { <<配置>> +TIMEOUT_IGNORE: Long +getMappingTimeoutPropId(propId) +getCustomTimeoutValue(propId, value) +getPropValueForFirstCache(value) +isCacheablePropVal(propId, propVal) } class VehiclePropertyUtil { <<工具>> +isPropertyAvailable(value) +isPropertyMockError(value, counter) +isPropertyMockTimeout(counter) +toHexId(propId) } class CarPropertyManagerCallback { <<interface>> +onPropertyManagerPrepared() +onPropertyManagerReleased() +onPropertyChanged(value) +onSetPropertyTimeout(propId, areaId) +onSetPropertyError(propId, areaId) +onDataVerifyFailed(propId, areaId, val) +getTimeoutFlag(value) +isIgnoreCache(value) +reportOneTrackWhenSetProperty(...) } class LocalCarManager { -mCar: Car +getInstance() +createCar(ctx, listener) +getCar() } class NewBaseCarServiceManager { <<abstract>> #mCarServiceManager: T +isConnected() +registerCarServiceListener(listener) +disconnect() } class OnCarServiceListener { <<interface>> +onCarServiceManagerPrepared() +onCarServiceManagerReleased() } class VehicleData { +propId: Int +propVal: Any +areaId: Int +isSync: Boolean } class CarPropertyCacheManager { <<单例>> -mCallBackMap: ConcurrentHashMap -mPropertiesCache: ConcurrentHashMap +getInstance() +registerPropertyCallback(mgr, cb, propId) +callbackByCache(...) } SettingsCarPropertyManager --> VehicleControlManager : 委托:读写/注册 SettingsCarPropertyManager --> VehiclePropertyConfig : 配置:超时/缓存规则 SettingsCarPropertyManager --> VehiclePropertyUtil : 工具:可用性/mock SettingsCarPropertyManager --> CarPropertyManagerCallback : 业务层回调 SettingsCarPropertyManager --> LocalCarManager : getCarInstance SettingsCarPropertyManager --> VehicleData : setCarProperty 入参 VehicleControlManager --|> NewBaseCarServiceManager : 继承 VehicleControlManager --> CarPropertyCacheManager : 委托:回调管理 NewBaseCarServiceManager --> LocalCarManager : 创建 Car 连接 NewBaseCarServiceManager ..> OnCarServiceListener : 内部接口
3. 各依赖类职责速查
3.1 VehicleControlManager(底层代理)
文件:vehicle/VehicleControlManager.java
职责:封装 AOSP CarPropertyManager,按 propId 注册/解注册、按类型 set/get。
| 方法 | 行号 | 说明 |
|---|---|---|
registerPropertyCallback(cb, propId) | 56 | 注册回调(委托给 CarPropertyCacheManager) |
unregisterPropertyCallback(cb, propId) | 66 | 注销回调 |
getProperty(propId, areaId) | 161 | 同步获取属性值 |
setIntProperty / setIntPropertyBySync | 114 / 118 | 异步/同步设置 int |
setFloatProperty / setFloatPropertyBySync | 129 / 133 | 异步/同步设置 float |
setIntArrayProperty / setIntArrayPropertyBySync | 144 / 149 | 异步/同步设置 int 数组 |
setBatchProperty / setBatchPropertyBySync | 171 / 175 | 批量设置 |
filterSupportedProperties(ids) | 82 | 过滤出真正支持的 propId |
getServiceName() | 53 | 返回 Car.PROPERTY_SERVICE |
3.2 VehiclePropertyConfig(配置中心)
文件:com/android/micar/settings/carproperty/VehiclePropertyConfig.java
职责:超时时间、缓存规则、值映射的配置表。
| 方法/常量 | 行号 | 说明 |
|---|---|---|
TIMEOUT_IGNORE = -1L | 48 | 强制禁用超时计时器 |
getMappingTimeoutPropId(propId) | 206 | 下行→上行超时信号映射 |
getCustomTimeoutValue(propId, value) | 218 | 按 propId+value 查超时毫秒 |
getPropValueForFirstCache(value) | 239 | 首次缓存时的”初始终态值”兜底 |
isCacheablePropVal(propId, val) | 263 | 是否可缓存(UI 回退用) |
sCustomTimeoutValue | 64 | 自定义超时配置 Map |
sTimeoutSignalMapping | 65 | 下行→上行信号映射 Map |
3.3 VehiclePropertyUtil(工具)
文件:vehicle/VehiclePropertyUtil.java
| 方法 | 行号 | 说明 |
|---|---|---|
isPropertyAvailable(value) | 173 | 检查 STATUS_AVAILABLE |
isPropertyMockError(value, counter) | 156 | Mock 错误事件 |
isPropertyMockTimeout(counter) | 144 | Mock 超时事件 |
isPropertyTimeout(value) | 196 | status timeout 位检查 |
toHexId(propId) | 236 | propId → 十六进制字符串(日志用) |
getTypedDefaultValue(propId) | 300 | 按类型取默认值 |
3.4 CarPropertyManagerCallback(业务层回调接口)
文件:vehicle/CarPropertyManagerCallback.java
| 抽象方法 | 行号 | 触发时机 |
|---|---|---|
onPropertyManagerPrepared() | 9 | Car 服务连接就绪 |
onPropertyManagerReleased() | 12 | Car 服务断开 |
onPropertyChanged(value) | 20 | 信号变化(仅 observed 集合内) |
onSetPropertyTimeout(propId, areaId) | 23 | 下发后超时未回弹 |
onSetPropertyError(propId, areaId) | 34 | 底层 onErrorEvent |
onDataVerifyFailed(propId, areaId, val) | 30 | 下发值 ≠ 回弹缓存值 |
getTimeoutFlag(value) | 16 | 返回 CONTINUE/RESTART/REMOVE |
isIgnoreCache(value) | 36 | 该值是否跳过缓存 |
reportOneTrackWhenSetProperty(...) | 40 | 下发埋点 |
3.5 LocalCarManager(Car 单例)
文件:vehicle/LocalCarManager.java
职责:全局唯一 Car 实例管理,生命周期监听。
| 方法 | 行号 | 说明 |
|---|---|---|
getInstance() | 40 | 单例 |
createCar(ctx, listener) | 82 | 创建 Car 并注册监听 |
getCar() | 124 | 取当前 Car(未连接返回 null) |
retryBindCarService() | 66 | 断线重连 |
3.6 NewBaseCarServiceManager / OnCarServiceListener
文件:vehicle/NewBaseCarServiceManager.java
职责:VehicleControlManager 的抽象父类,封装服务连接。
| 抽象方法 | 行号 | 含义 |
|---|---|---|
onCarServiceManagerPrepared() | 107 | 服务连接 + manager 就绪 |
onCarServiceManagerReleased() | 112 | 服务断开 |
3.7 VehicleData(下发参数数据类)
文件:vehicle/VehicleData.kt
| 属性 | 行号 | 默认值 |
|---|---|---|
propId | 9 | CommonConstants.BATCH_PROP |
propVal | 10 | Any(Int/Float/Array/List) |
areaId | 11 | 0 |
isSync | 12 | false |
用于
setCarProperty(data: VehicleData?)重载。
3.8 CarPropertyCacheManager(全局单例:回调分发 + 缓存)
文件:vehicle/CarPropertyCacheManager.java
职责:管理 propId → callback 集合映射,维护属性缓存。SCPM 的 VehicleControlManager 把注册委托给它。
| 方法 | 行号 | 说明 |
|---|---|---|
getInstance() | 52 | 单例 |
registerPropertyCallback(mgr, cb, propId) | 159 | 首注册到服务,后续只加本地缓存 |
unregisterPropertyCallback(cb, propId) | 239 | 注销 |
callbackByCache(...) | 197 | 首注册时同步触发(注意:else 分支不调,见 JIRA 1839) |
mInternalCarPropertyEventCallback | 56 | 内部统一回调,分发到各 SCPM |
⚠️ 关键细节(与
../座舱车门知识库/05-MANNPROB-1839-根因.md相关):registerPropertyCallback的 else 分支(首注册)显式不调用callbackByCache,导致首批事件必经 binder 异步回放——这是离车提醒车门闪烁的根因之一。
下一篇:03-读写信号全链路时序图.md