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 个)

模块类型职责
appcom.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(海外用 GlobalAutopilotSettingsFragmentLCA/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
模块类型职责关键类
settingsBaseLiblibrary非 UI 跨领域基础设施:账号同步、MQTT 推送、许可证管理、Retrofit 网络、埋点、语音助手、IoT、MIS 规格、启动调度、工具类BaseApplicationAppStartTaskDispatcherMQTTManagerLicenseMasterRetrofitManagerSettingsTrackGlobalViewModelIotClientManagerMiCarPropertyIds全部车辆信号 ID 定义在此)、DeviceUtilPreferenceXmlParser
settingsBaseUilibraryUI 基类 + 控件 + 资源。整个 PreferenceController 范式的核心载体PreferenceController(857 行根基类)、BaseXmlParserSettingsFragment(1562 行核心父类)、SettingsFragmentTopLevelSettingsFragmentBaseRightFragmentPreferenceControllerListHelper、40+ 自定义 Preference 控件、CarSettingsJump(URI 常量)、PageAliasVoiceSearchManagerHiddenFeaturesKeyListHelper
settingsVehicleLiblibrary车辆信号领域抽象层。封装 Android Car API,提供缓存/超时/生命周期/FlowSettingsCarPropertyManager(693 行核心)、LocalCarManager(Car 单例)、VehicleControlManagerCarPropertyCacheManagerCarPropertyRepo(Flow)、CarPropertyMgrPreferenceControllerBaseVehicleNewSwitchPrefController 等 8 个车控 Controller 基类、CarConfigManager(配置字)
settingsBasePBlibrary (protobuf)Protobuf 协议定义3 个 proto:micar_nickname(改昵称)、digital_carkey(数字钥匙删除 push)、RemoteLocation(远程位置开关)。用于 HTTP 序列化 + MQTT push 反序列化
settingsLibAndroidlibraryAOSP SettingsLib 移植,通用上下文/工具com.android.settingslib 命名空间
settingsLibUtilslibrarySettingsLib 通用工具com.android.settingslib.utils
settingsLibAdaptiveIconlibrary自适应图标com.android.settingslib.widget
settingsLibTilelibraryDashboard Tile 快捷方式com.android.settingslib.drawer
settingsLibDisplayUtilslibrary显示工具com.android.settingslib.display
iconloaderliblibrary图标加载(移植自 Launcher3)com.android.launcher3.icons
WifiTrackerLiblibraryWiFi 追踪com.android.wifitrackerlib

重要边界:UI 基类(PreferenceController/BaseXmlParserSettingsFragment)在 settingsBaseUi,不在 settingsBaseLib。settingsBaseLib 是非 UI 的纯基础设施。这是常见的认知误区。

第 4 层:settingsCommon(7 个横切模块)

模块类型职责
plugin/router/annotationjava-library路由注解定义:@RouterProvider@Module@Modules
plugin/router/routerAptjava-library路由注解处理器(javapoet 生成 Module_<name>.java + RouterHelper.java
plugin/router/routerManagerlibrary路由运行时:Router 单例、RouterTabs 路由表、IPageRouteHandler 回调契约、SettingsConstant 模块标签
plugin/voice/voicesearchannotationjava-library语音搜索注解:@VoiceSearchProviderVoiceSearchPageData
plugin/voice/voicesearchaptjava-library语音搜索处理器(生成 VoiceSearch_<name>.java + VoiceSearchWidgetProvider.java
rtiLiblibraryRTI Connext DDS 中间件包装(发布/订阅),用于整车跨域信号通信。DOMAIN_VEHICLE=1,平板设备禁用
tools/qualitytoolslibrary质量/监控工具包(binder hook、服务监控)

RTI 不是「后触摸界面」,是 RTI Connext DDS(车载 ECU 跨域发布/订阅中间件)。证据:nddsjava.jarcom.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 拼图
dcdDCD(ro.board.platform==msmnile国内main + dcddif + region/cn
xcdXCD(新一代平台)国内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)+ 工具。