01 · 模块全景与分层
本文回答两个核心问题:项目有多少个模块?每个模块都是做什么的? 统计口径:
find . -name build.gradle实际存在的 Gradle 子模块(不含根项目和 buildSrc),共 35 个。
一、四层分层架构
项目按职责分为 4 个顶层目录(layer),依赖方向自上而下单向,page 模块之间不互相依赖:
┌─────────────────────────────────────────────────────────────┐
│ app/ (1 个 application 模块) 应用入口、首页壳 │
├─────────────────────────────────────────────────────────────┤
│ settingsPage/ (16 个 library) 各功能业务页面 │
├─────────────────────────────────────────────────────────────┤
│ base/ (11 个 library) 基础能力与车辆抽象 │
├─────────────────────────────────────────────────────────────┤
│ settingsCommon/ (7 个: 5 java-lib + 2 lib) 路由/语音/RTI/工具 │
└─────────────────────────────────────────────────────────────┘
依赖核心链(典型的功能页模块依赖关系):
settingsPage/micarXxx
├── base/settingsBaseUi (Fragment/Controller/Preference 控件)
├── base/settingsBaseLib (非 UI 基础设施: 账号/推送/许可/埋点)
├── base/settingsVehicleLib (车辆信号抽象)
└── kapt settingsCommon/plugin/router/routerApt + voice/voicesearchapt
二、35 个模块逐个说明
第 1 层:app(1 个)
| 模块 | 类型 | 职责 |
|---|---|---|
| app | com.android.application | 唯一应用入口。包含 SettingsApplication(启动初始化)、BaseCarSettingsActivity(双面板 Activity 基类)、TopLevelMenuFragment(左侧菜单)、DeeplinkActivity(语音中转)、FallbackHome(备用 Launcher)、PageRouterConfig(深链映射)。三 flavor 通过 sourceSet 区分。 |
app 内部关键包:
com.android.car.settings
├── miauto/ SettingsApplication, HomePageActivityReal,
│ MainThreadStartTask, AsyncThreadStartTask
├── common/ BaseCarSettingsActivity, CarSettingActivities,
│ TopLevelMenuFragment, SubSettingsActivity
├── pageroute/ PageRouterConfig (pageId → preference key)
└── micar.settings/ menu/ (DynamicMenu, MenuAccountController 等)
第 2 层:settingsPage(16 个功能业务模块)
每个都是 com.android.library,承载一个或多个一级/二级设置页。统一范式见《07-功能页面模块架构》。
| 模块 | 业务域 | 默认入口 Fragment | 说明 |
|---|---|---|---|
| VehicleBodyControl | 车身控制 | VehicleControlSettingsFragment(首页默认选中) | 座椅/方向盘/后视镜/手套箱/前机盖;Quick Control 快控面板 |
| micarLightSettings | 灯光 | LightsSettingsFragment | 大灯/雾灯/阅读灯/氛围灯/按键背光 |
| micarLockSettings | 锁车门窗 | VehicleLockSettingsFragment | 车门/车窗/童锁/电动尾门/智能车顶/锁车鸣笛 |
| micarDrivingSettings | 驾驶 | 驾驶偏好页 | 驾驶模式/能量模式/便利进出/洗车模式/HDC |
| settingsAutoPilot | 辅助驾驶 | AutopilotSettingsFragment(海外用 GlobalAutopilotSettingsFragment) | LCA/RCTAB/RCW/DOW 等智驾辅助 |
| micarSafetyServiceSettings | 安全安防 | 安全服务页 | DMS 分心/疲劳/摄像头/雷达/安全模式 |
| micarChargeSettings | 充电能量 | EnergyManagerFragment | 充放电/定时充电/预热/能量管理/预约充电位置(绑定 com.micar.scene) |
| micarConnectionSettings | 连接 | 连接页 | 蓝牙/WiFi/热点/数字钥匙 |
| micarDisplaySettings | 显示 | DisplayAtmosphereSettingsFragment | 屏显/HUD/主题/氛围灯联动 |
| micarVolume | 音量声音 | VolumeSettingsFragment | 音量/声场/平衡/提示音 |
| micarIotSettings | 智能设备 | IotSettingsFragment | 米家 IoT 设备接入(走 IotClientManager,不经 CarProperty) |
| xiaoAiSettings | 智能语音 | 小爱设置页 | 小爱语音助手设置 |
| settingsSystem | 系统 | UniversalSettingsFragment | 系统/硬件信息/存储清理/语言/开发者选项(含 dcddif/xcddif 同名类差异) |
| micarMedia | 媒体 | 媒体页 | 媒体源相关 |
| micarSnapshot | 快照 | 快照页 | 车辆状态快照 |
| globalOnly | 海外专属 | Location/Privacy 等 | 仅 globalImplementation 引入;隐私/位置/锁屏 PIN/谷歌设置注入。不依赖 settingsVehicleLib,不用路由 APT |
包名两套并存(历史演进):新代码用
com.android.micar.settings.<feature>(如 energy/iot/autopilot),旧代码用com.android.car.settings.miauto.<feature>(如 display/volume/lights/driving)。新功能走前者。
第 3 层:base(11 个基础库)
依赖关系(自顶向下):
settingsVehicleLib ──→ settingsBaseUi ──→ settingsBaseLib ──→ settingsBasePB
│ │
└→ settingsLibAndroid ──→ settingsLibUtils
└→ settingsLibAdaptiveIcon ──→ settingsLibTile
└→ iconloaderlib
settingsBaseLib ──→ WifiTrackerLib
| 模块 | 类型 | 职责 | 关键类 |
|---|---|---|---|
| settingsBaseLib | library | 非 UI 跨领域基础设施:账号同步、MQTT 推送、许可证管理、Retrofit 网络、埋点、语音助手、IoT、MIS 规格、启动调度、工具类 | BaseApplication、AppStartTaskDispatcher、MQTTManager、LicenseMaster、RetrofitManager、SettingsTrack、GlobalViewModel、IotClientManager、MiCarPropertyIds(全部车辆信号 ID 定义在此)、DeviceUtil、PreferenceXmlParser |
| settingsBaseUi | library | UI 基类 + 控件 + 资源。整个 PreferenceController 范式的核心载体 | PreferenceController(857 行根基类)、BaseXmlParserSettingsFragment(1562 行核心父类)、SettingsFragment、TopLevelSettingsFragment、BaseRightFragment、PreferenceControllerListHelper、40+ 自定义 Preference 控件、CarSettingsJump(URI 常量)、PageAlias、VoiceSearchManager、HiddenFeaturesKeyListHelper |
| settingsVehicleLib | library | 车辆信号领域抽象层。封装 Android Car API,提供缓存/超时/生命周期/Flow | SettingsCarPropertyManager(693 行核心)、LocalCarManager(Car 单例)、VehicleControlManager、CarPropertyCacheManager、CarPropertyRepo(Flow)、CarPropertyMgrPreferenceController、BaseVehicleNewSwitchPrefController 等 8 个车控 Controller 基类、CarConfigManager(配置字) |
| settingsBasePB | library (protobuf) | Protobuf 协议定义 | 3 个 proto:micar_nickname(改昵称)、digital_carkey(数字钥匙删除 push)、RemoteLocation(远程位置开关)。用于 HTTP 序列化 + MQTT push 反序列化 |
| settingsLibAndroid | library | AOSP SettingsLib 移植,通用上下文/工具 | com.android.settingslib 命名空间 |
| settingsLibUtils | library | SettingsLib 通用工具 | com.android.settingslib.utils |
| settingsLibAdaptiveIcon | library | 自适应图标 | com.android.settingslib.widget |
| settingsLibTile | library | Dashboard Tile 快捷方式 | com.android.settingslib.drawer |
| settingsLibDisplayUtils | library | 显示工具 | com.android.settingslib.display |
| iconloaderlib | library | 图标加载(移植自 Launcher3) | com.android.launcher3.icons |
| WifiTrackerLib | library | WiFi 追踪 | com.android.wifitrackerlib |
重要边界:UI 基类(
PreferenceController/BaseXmlParserSettingsFragment)在 settingsBaseUi,不在 settingsBaseLib。settingsBaseLib 是非 UI 的纯基础设施。这是常见的认知误区。
第 4 层:settingsCommon(7 个横切模块)
| 模块 | 类型 | 职责 |
|---|---|---|
| plugin/router/annotation | java-library | 路由注解定义:@RouterProvider、@Module、@Modules |
| plugin/router/routerApt | java-library | 路由注解处理器(javapoet 生成 Module_<name>.java + RouterHelper.java) |
| plugin/router/routerManager | library | 路由运行时:Router 单例、RouterTabs 路由表、IPageRouteHandler 回调契约、SettingsConstant 模块标签 |
| plugin/voice/voicesearchannotation | java-library | 语音搜索注解:@VoiceSearchProvider、VoiceSearchPageData |
| plugin/voice/voicesearchapt | java-library | 语音搜索处理器(生成 VoiceSearch_<name>.java + VoiceSearchWidgetProvider.java) |
| rtiLib | library | RTI Connext DDS 中间件包装(发布/订阅),用于整车跨域信号通信。DOMAIN_VEHICLE=1,平板设备禁用 |
| tools/qualitytools | library | 质量/监控工具包(binder hook、服务监控) |
RTI 不是「后触摸界面」,是 RTI Connext DDS(车载 ECU 跨域发布/订阅中间件)。证据:
nddsjava.jar、com.rti.dds.*导入。
三、模块依赖关系总图
┌───────────┐
│ app │
└─────┬─────┘
│ implementation
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ settingsPage│ ... │ globalOnly │ │ (15 个) │
│ (16 个) │ │ (仅 global) │ │ │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└──────────┬────────┴────────────────────┘
▼
┌─────────────────┐ kapt ┌─────────────────────┐
│ base/ (11 个) │ ◄────────── │ settingsCommon/ (7) │
│ VehicleLib │ │ router/voice APT │
│ BaseUi │ implementation│ rtiLib, qualitytools│
│ BaseLib │ ◄─────────────┘ │
└─────────────────┘
│
▼ compileOnly (framework.jar 注入)
┌─────────────────────────┐
│ 小米车机 platform jar │
│ (dcd: watt / xcd: xcd) │
└─────────────────────────┘
四、构建产物:三个 Flavor APK
| Flavor | 平台 | 地区 | sourceSet 拼图 |
|---|---|---|---|
| dcd | DCD(ro.board.platform==msmnile) | 国内 | main + dcddif + region/cn |
| xcd | XCD(新一代平台) | 国内 | main + xcddif + region/cn |
| global | 复用 XCD 二进制 | 海外 | main + xcddif + region/global(换 Manifest)+ globalOnly 模块 |
「dcd/xcd 不是 debug/release,是两套不同的车机硬件平台」——它们各自有独立的
framework.jar/android.car.jar,在编译期通过bootstrapClasspath前置切换。详见《06-多Flavor与海外适配》。
五、一句话总结每个层
- app = 「壳」:启动、首页双面板、入口路由。
- settingsPage = 「业务」:16 个功能域,每个 = N 个 Fragment + N 个 Controller + XML。
- base = 「底座」:UI 范式(BaseUi)+ 非 UI 设施(BaseLib)+ 车辆抽象(VehicleLib)+ 协议(PB)+ 一堆移植工具库。
- settingsCommon = 「横切」:编译期代码生成(路由/语音 APT)+ 运行时中间件(RTI)+ 工具。