04 - 实战升级与验收手册
维度:把 MiCarSettings 升级到新版本(如 1.0.0.194-dev-xcd)的完整操作 + 编译后验收 + 踩坑 本文基于 2026-07-15 真实研究(4 Agent 对抗 + 实际改配置验证)
一、升级四步法(标准操作)
STEP 1:确认目标版本已发布
# 在 MiCarSettings 项目验证版本已传到 maven
curl -sI --max-time 10 \
https://pkgs.d.xiaomi.net/artifactory/releases/com/mi/car/MiCarSettings/1.0.0.194-dev-xcd/MiCarSettings-1.0.0.194-dev-xcd.apk \
| grep -E "^HTTP|Content-Length"
# 期望:HTTP/1.1 200,Content-Length: 371603583若 404 → 先在 MiCarSettings 项目发布(见 Artifactory发布知识库)。
STEP 2:改 manifest revision(YU7 只改一处)
cd /home/zbc/pangu/yu7/vendor/micar/prebuilts/packages
# 确认 YU7(suiren)是否在 cn/suiren.xml 覆盖 MiCarSettings
grep "MiCarSettings" cn/suiren.xml || echo "→ suiren 不覆盖,改通用 manifest.xml"
# 改通用 manifest.xml 的 MiCarSettings revision
# :131 revision="1.0.0.165-dev-xcd" → revision="1.0.0.194-dev-xcd"为什么只改通用 manifest.xml:YU7=suiren=XCD,cn/suiren.xml 不覆盖 MiCarSettings → 落回通用 manifest.xml:131。
若是 DCD 车型(watt/hertz),改
cn/watt.xml/cn/hertz.xml的 revision(带-dcd)。 若是 global,改global/manifest.xml(带-global)。
STEP 3:清 MD5 缓存(换版本必做)
cd /home/zbc/pangu/yu7/vendor/micar/prebuilts/packages
rm -f apps/manifest_md5 # 清缓存,否则 sync 不重拉
rm -f apps/MiCarSettings.apk # 清旧 apk(若有)首次编译 apps/ 不存在,跳过。
STEP 4:整机编译
cd /home/zbc/pangu/yu7
./mibuild.sh -l suiren-userdebug -t full -u cn编译时 Android.mk:46 自动调 sync_maven_apk.py manifest 拉新版本 apk。
二、编译后验收清单(复制即用)
YU7=/home/zbc/pangu/yu7
OUT=$YU7/out/target/product
AAPT=$YU7/prebuilts/sdk/tools/linux/bin/aapt
# 1) apk 落盘 + 版本(必须 1.0.0.194-dev / 2026071501)
APK=$(find $OUT -path "*priv-app/MiCarSettings/MiCarSettings.apk" | head -1)
echo "APK: $APK"
$AAPT dump badging "$APK" | grep -E "package:|versionName"
# 期望: versionName='1.0.0.194-dev' versionCode='2026071501'
# 2) target_files 里有(路径 PRODUCT/product/priv-app/)
unzip -l $OUT/suiren/*-target_files-*.zip | grep "MiCarSettings"
# 3) 签名 = platform
$YU7/prebuilts/sdk/tools/linux/bin/apksigner verify --print-certs "$APK" 2>/dev/null | grep -i "SHA-256\|Subject"
# 4) super.img 里(挂载验证)
mkdir -p /tmp/super_mount && sudo mount -o loop $OUT/suiren/super.img /tmp/super_mount
find /tmp/super_mount -name "MiCarSettings.apk"
$AAPT dump badging /tmp/super_mount/product/priv-app/MiCarSettings/MiCarSettings.apk | grep versionName
sudo umount /tmp/super_mount
# 5) 拉取日志确认版本
grep -i "MiCarSettings" $YU7/vendor/micar/prebuilts/packages/sync_maven_apk.log验收标准
| 检查项 | 期望值 |
|---|---|
| apk 路径 | PRODUCT/product/priv-app/MiCarSettings/MiCarSettings.apk |
| versionName | 1.0.0.194-dev |
| versionCode | 2026071501 |
| 签名 | platform |
| sync 日志 | MiCarSettings revision:1.0.0.194-dev |
三、实战时序
sequenceDiagram participant Dev as 开发者 participant Manifest as manifest.xml participant Sync as sync_maven_apk.py participant Maven as pkgs.d.xiaomi.net participant Build as mibuild/make participant Img as product.img Dev->>Manifest: STEP2 改 revision 1.0.0.194-dev-xcd Dev->>Dev: STEP3 清 manifest_md5 Dev->>Build: STEP4 mibuild.sh -l suiren-userdebug -t full -u cn Build->>Sync: Android.mk:46 调 sync_maven_apk.py manifest Sync->>Manifest: 读 MiCarSettings revision Sync->>Maven: mvn dependency:get ...1.0.0.194-dev-xcd:apk Maven-->>Sync: apk(内网白名单免认证) Sync->>Sync: 落 apps/MiCarSettings.apk Build->>Img: BUILD_PREBUILT → /product/priv-app/MiCarSettings/ Build-->>Dev: BUILD SUCCESSFUL Dev->>Img: 验收(aapt dump badging → 1.0.0.194-dev)
四、踩坑表
| # | 坑 | 症状 | 解法 |
|---|---|---|---|
| 1 | 改错 manifest | 改了 cn/suiren.xml 但 YU7 版本没变 | YU7 的 MiCarSettings 走通用 manifest.xml:131(suiren.xml 不覆盖)→ 改通用 |
| 2 | 没清 MD5 缓存 | 改了 revision 但 sync 不重拉旧版本 | rm apps/manifest_md5 |
| 3 | global 版本未发布 | 编译 -u global 拉 1.0.0.165-dev-global(旧) | global 要先在 MiCarSettings 发布 1.0.0.194-dev-global 再改 global/manifest.xml |
| 4 | 分区路径误判 | 以为是 /product/app/ | 实为 /product/priv-app/(LOCAL_PRIVILEGED_MODULE:=true) |
| 5 | 找 “yu7” 目录 | 找不到 yu7 车型 | YU7 车型代号是 suiren,目录 device/xiaomi/suiren/ |
| 6 | 以为要 artifactory 账号 | 编译拉 apk 报认证? | 整机编译走内网白名单免账号(编译机在内网即可);账号是独立发布才要 |
| 7 | apk 不在源码树 | find 不到 MiCarSettings.apk | 正常,编译时 sync_maven_apk.py 才拉到 apps/ |
| 8 | 混淆两套拉取机制 | 以为 MiCarSettings 用 prebuilts_build3.py | MiCarSettings 用 sync_maven_apk.py + manifest XML;prebuilts_build3.py 是依赖库(AAR/JAR)用 |
五、对抗裁决(资深工程师视角)
本研究用 4 Agent 对抗,以下分歧由源码核对裁定:
| 分歧 | 说法 | 裁定(源码为准) |
|---|---|---|
| cn/suiren.xml 存在? | Agent4 称不存在 | ❌ 存在(但不覆盖 MiCarSettings,结论仍改通用 manifest) |
| MiCarSettings 分区 | Agent3 称 /product/app | ❌ /product/priv-app/(Android.mk:1435 LOCAL_PRIVILEGED_MODULE:=true) |
| 拉取认证 | Agent2 称免账号 | ✅ 整机走内网白名单;独立发布才要账号 |
教训:Agent 可能误报事实(如 Agent4 的 suiren.xml),关键决策点必须自己用源码核对(
grep/ls/读 Android.mk)。
六、本次实战记录(2026-07-15)
| 步骤 | 状态 |
|---|---|
| 4 Agent 对抗研究 | ✅ 完成(prebuilt/拉取/编译/验收) |
| 核对 suiren.xml 不覆盖 MiCarSettings | ✅(纠正 Agent4) |
| 改 manifest.xml:131 → 1.0.0.194-dev-xcd | ✅ 已改 |
| 拉取可达验证 | ✅(curl HTTP 200,apk 371603583 字节) |
| 整机编译产物验收 | ⏳ 待编译(用户选择先不编译) |
当前状态:manifest.xml:131 已配置为 1.0.0.194-dev-xcd,等待用户触发 ./mibuild.sh -l suiren-userdebug -t full -u cn 后用上述清单验收。
七、快速升级速查(复制即用)
# === 升级 MiCarSettings 到 1.0.0.194-dev-xcd(YU7/suiren/XCD) ===
cd /home/zbc/pangu/yu7/vendor/micar/prebuilts/packages
# 1. 改版本(YU7 走通用 manifest.xml)
sed -i 's|name="MiCarSettings" revision="1.0.0.165-dev-xcd"|name="MiCarSettings" revision="1.0.0.194-dev-xcd"|' manifest.xml
grep MiCarSettings manifest.xml # 确认
# 2. 清缓存
rm -f apps/manifest_md5 apps/MiCarSettings.apk
# 3. 编译
cd /home/zbc/pangu/yu7
./mibuild.sh -l suiren-userdebug -t full -u cn
# 4. 验收
APK=$(find out/target/product -path "*priv-app/MiCarSettings/MiCarSettings.apk" | head -1)
prebuilts/sdk/tools/linux/bin/aapt dump badging "$APK" | grep versionName
# 期望: versionName='1.0.0.194-dev'