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 / setIntPropertyBySync114 / 118异步/同步设置 int
setFloatProperty / setFloatPropertyBySync129 / 133异步/同步设置 float
setIntArrayProperty / setIntArrayPropertyBySync144 / 149异步/同步设置 int 数组
setBatchProperty / setBatchPropertyBySync171 / 175批量设置
filterSupportedProperties(ids)82过滤出真正支持的 propId
getServiceName()53返回 Car.PROPERTY_SERVICE

3.2 VehiclePropertyConfig(配置中心)

文件com/android/micar/settings/carproperty/VehiclePropertyConfig.java 职责:超时时间、缓存规则、值映射的配置表。

方法/常量行号说明
TIMEOUT_IGNORE = -1L48强制禁用超时计时器
getMappingTimeoutPropId(propId)206下行→上行超时信号映射
getCustomTimeoutValue(propId, value)218按 propId+value 查超时毫秒
getPropValueForFirstCache(value)239首次缓存时的”初始终态值”兜底
isCacheablePropVal(propId, val)263是否可缓存(UI 回退用)
sCustomTimeoutValue64自定义超时配置 Map
sTimeoutSignalMapping65下行→上行信号映射 Map

3.3 VehiclePropertyUtil(工具)

文件vehicle/VehiclePropertyUtil.java

方法行号说明
isPropertyAvailable(value)173检查 STATUS_AVAILABLE
isPropertyMockError(value, counter)156Mock 错误事件
isPropertyMockTimeout(counter)144Mock 超时事件
isPropertyTimeout(value)196status timeout 位检查
toHexId(propId)236propId → 十六进制字符串(日志用)
getTypedDefaultValue(propId)300按类型取默认值

3.4 CarPropertyManagerCallback(业务层回调接口)

文件vehicle/CarPropertyManagerCallback.java

抽象方法行号触发时机
onPropertyManagerPrepared()9Car 服务连接就绪
onPropertyManagerReleased()12Car 服务断开
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

属性行号默认值
propId9CommonConstants.BATCH_PROP
propVal10Any(Int/Float/Array/List)
areaId110
isSync12false

用于 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
mInternalCarPropertyEventCallback56内部统一回调,分发到各 SCPM

⚠️ 关键细节(与 ../座舱车门知识库/05-MANNPROB-1839-根因.md 相关):registerPropertyCallback 的 else 分支(首注册)显式不调用 callbackByCache,导致首批事件必经 binder 异步回放——这是离车提醒车门闪烁的根因之一。


下一篇:03-读写信号全链路时序图.md