02 - 版本配置与拉取链路

维度:MiCarSettings 版本号在哪里配、apk 怎么从 maven 拉下来 核心文件:manifest.xml(版本配置)、sync_maven_apk.py(拉取脚本)


一、版本配置:manifest 三级覆盖

版本号存在 vendor/micar/prebuilts/packages/ 下的 manifest XML 的 revision 属性里,三级覆盖(优先级低→高):

manifest.xml              (通用默认,所有车型)
  └── cn|global/manifest.xml   (区域覆盖,cn 或 global)
       └── cn/{车型}.xml        (车型覆盖,如 cn/watt.xml)

MiCarSettings 各 manifest 的版本(研究时实测)

文件行号revision适用
manifest.xml1311.0.0.165-dev-xcdXCD 通用默认(YU7 走这条)
global/manifest.xml61.0.0.165-dev-globalGlobal 区域
cn/watt.xml181.0.0.165-dev-dcdWatt(DCD)
cn/hertz.xml201.0.0.165-dev-dcdHertz(DCD)
cn/newton.xml-1.0.0.137-dev-a17老车型(a17)
cn/suiren.xml-不覆盖 MiCarSettingsYU7 → 落回通用 manifest.xml

⚠️ 关键:cn/suiren.xml 存在但不覆盖 MiCarSettings(它只覆盖 VoiceAssistant/PHud 等)。所以 YU7 的 MiCarSettings 版本由通用 manifest.xml:131 决定。

覆盖规则示例

<project type="apk" group="com.mi.car" name="MiCarSettings" revision="1.0.0.194-dev-xcd" />
  • group="com.mi.car" + name="MiCarSettings" = maven 坐标 com.mi.car:MiCarSettings
  • revision = 版本号(含 flavor 后缀)

二、拉取脚本 sync_maven_apk.py

文件:vendor/micar/prebuilts/packages/sync_maven_apk.py 调用:Android.mk:46/64/72 在编译配置阶段用 $(shell ...) 调用

调用顺序(XCD 平台,YU7)

# Android.mk:46  步骤1:通用 manifest
sync_maven_apk.py manifest
 
# Android.mk:64  步骤2:区域 manifest(cn 或 global)
sync_maven_apk.py $(CONFIG_DIR)/manifest
 
# Android.mk:72  步骤3:车型 manifest(仅 miproduct 组件)
sync_maven_apk.py $(CONFIG_DIR)/$(车型) $(阶段码)

YU7 编译时:sync_maven_apk.py manifest → 读通用 manifest.xml → 拉到 MiCarSettings:1.0.0.194-dev-xcd。后续 cn/manifest、cn/suiren 不覆盖,保持。

内部拉取命令(mvn CLI)

# 1. 从 maven 仓库获取
mvn dependency:get \
  -DremoteRepositories=https://pkgs.d.xiaomi.net:443/artifactory/maven-release-virtual \
  -Dartifact=com.mi.car:MiCarSettings:1.0.0.194-dev-xcd:apk \
  -Dtransitive=false
 
# 2. 复制到 apps 目录
mvn dependency:copy \
  -Dmaven.legacyLocalRepo=true \
  -Dartifact=com.mi.car:MiCarSettings:1.0.0.194-dev-xcd:apk \
  -DoutputDirectory=<prebuilts/packages>/apps
 
# 3. 重命名(去掉版本号)
mv apps/MiCarSettings-1.0.0.194-dev-xcd.apk apps/MiCarSettings.apk

最终落到 vendor/micar/prebuilts/packages/apps/MiCarSettings.apk,供 Android.mk:1445 LOCAL_SRC_FILES 引用。

MD5 缓存机制

sync_maven_apk.py 用 manifest 的 MD5 判断是否需要重新下载,缓存在 apps/manifest_md5换版本后必须清缓存,否则脚本认为 manifest 没变、不重拉:

rm -f vendor/micar/prebuilts/packages/apps/manifest_md5

(首次编译 apps/ 不存在,无需清。)


三、拉取认证:内网白名单(免账号)

整机编译从 maven 拉 apk 走内网 IP 白名单,不需要 artifactory 账号密码。这与 MiCarSettings 独立发布(要 artifactory_user/password)是两套独立场景:

场景认证触发
独立发布 apk 到 maven(updateApkAssembleXcdRelease)artifactory 账号(env/project.properties)开发者主动
整机编译从 maven 拉 apk(sync_maven_apk.py)内网 IP 白名单(免账号)mibuild.sh 自动

前提:编译机在内网(或 VPN),能访问 pkgs.d.xiaomi.net


四、拉取流程图

flowchart TD
    A["编译触发<br/>mibuild.sh"] --> B["Android.mk 配置阶段"]
    B --> C["sync_maven_apk.py manifest"]
    C --> D["解析 project 节点<br/>group+name+revision"]
    D --> E["mvn dependency:get<br/>内网白名单"]
    E --> F{"apps/manifest_md5<br/>变化?"}
    F -->|是| G["下载 apk 到 apps/"]
    F -->|否| H["跳过(用缓存)"]
    G --> I["重命名 apps/MiCarSettings.apk"]
    H --> I
    I --> J["Android.mk BUILD_PREBUILT 引用"]

    style E fill:#e1f5e1
    style F fill:#fff3e0
    style I fill:#e1e1ff

五、官方升级 SOP(.micode/commands/app_upgrade.toml)

文件:vendor/micar/prebuilts/packages/.micode/commands/app_upgrade.toml(27KB)

小米已内置 CarSettings 升级标准操作指南:

  • 智能识别平台后缀(-xcd / -dcd)
  • -xcd → 仅更新通用 manifest.xml
  • -dcd → 更新 dcd 相关 manifest(watt/hertz 等)
  • 升级后在该文件记录变更信息
  • 版本号格式遵循 CarSettings 团队规范

这说明”改 manifest.xml revision”是官方认可的标准升级方式。本知识库的方案与该 SOP 一致。


六、两种解耦拉取机制对比

整机源码里有两套”从 maven 拉”的机制,别混淆:

机制脚本配置用途代表
APK 拉取sync_maven_apk.pyXML(manifest)车载 APK 安装包MiCarSettings, CarMap
依赖库拉取prebuilts_build3.pyJSONAAR/JAR 依赖库PowerKeeper, MiuiBluetooth

MiCarSettings 用前者(sync_maven_apk.py + manifest.xml),不是 prebuilts_build3.py。


七、关键源码行号索引

内容文件:行号
MiCarSettings 通用版本vendor/micar/prebuilts/packages/manifest.xml:131
sync 调用(通用)vendor/micar/prebuilts/packages/Android.mk:46
sync 调用(区域)同上 :64
sync 调用(车型)同上 :72
mvn 拉取命令vendor/micar/prebuilts/packages/sync_maven_apk.py:40-48
官方 SOPvendor/micar/prebuilts/packages/.micode/commands/app_upgrade.toml