一次真实提效实践:用 AI 把Android升级包出包时间从 3 小时压到 20 分钟
本文记录一次完整的"AI 辅助工程提效"实践:针对嵌入式 Android 设备升级包的日常发布痛点,借助 AI(Claude Code)从 0 到 1 设计并落地一套免整编离线重打包方案
关键词:AI 提效、嵌入式 Android、A/B OTA、离线重打包、target_files、工程自动化
〇、摘要
- 痛点:每次只换一个预置文件(组件包 / APK),却要做 2~4 小时的全量整编。
- 方案:利用 AOSP 构建系统自带的
target_files+otatools+ota_from_target_files工具链,构建一个自包含的离线重打包工具包,任何一台 Linux x86_64 机器、无需源码环境即可 20 分钟出正式升级包。 - AI 的角色:架构设计、脚本编写、踩坑排查、文档沉淀全流程由 AI 辅助完成,工程师负责决策、验证与安全把关。整个方案的落地周期约一天,而传统做法(人工摸索这套工具链)通常以周计。
一、背景:一个典型的嵌入式Android发布痛点
我们维护一类基于 RK 平台、采用A/B 分区 OTA的 Android 设备。日常最高频的发布需求是:
“团队更新了一个组件包 / 换了一个第三方 APK,出一版升级包下发设备。”
这类变更只涉及 system 分区里的一个预置文件,不改任何代码。但按原有流程,仍然必须:
- 全量整编 Android(内核 + u-boot + framework + 应用),2~4 小时;
- 编译机资源紧张时还需排队;
- 编译过程脆弱,偶发环境问题导致返工。
换一个 5MB 的文件,付出 3 小时级的成本——这是典型的"流程惯性浪费"。我们决定用 AI 一起把它解决掉。
二、AI 提效的第一课:让 AI 先理解"为什么可行"
很多人把 AI 当"代码补全器",这是最大的浪费。我们的做法是先让 AI 建立全局认知:
- 把构建入口脚本、打包脚本、升级包加密流程全部"喂给" AI 阅读;
- 让 AI 画出整编的内部链路图(谁生成 target_files、谁签名、谁加密、命名规则在哪);
- 在这个基础上再提问:“如果只换一个文件,最小重做集合是什么?”
AI 很快给出了关键判断——这正是方案成立的基石:
- AOSP 的
make dist产物里有一对被大家忽视的"宝物":- target_files(~2GB):解压后是完整的
SYSTEM/目录树 + 元数据,是制作升级包的原料而非中间垃圾; - otatools.zip(~370MB):包含签名密钥、
ota_from_target_files、add_img_to_target_files及全部依赖库,本身就是为"离线环境制作 OTA"设计的。
- target_files(~2GB):解压后是完整的
- 也就是说,AOSP 官方工具链天然支持"原料 + 工具"两件套离线出包,只是从没有人在这条产线上把它串起来。
💡提效心法 1:让 AI 先做"考古 + 画图",再动手。人容易困在"一直就是这么编的"里,AI 没有这个惯性,反而会去问"这个产物能不能不重编"。
三、方案设计:三个阶段,一次投入,长期收益
阶段一(一次性):完整整编 ──┬─→ 正式升级包 + 整刷镜像 └─→ 自动生成"离线重打包归档包"(新增,~10 分钟) 阶段二(一次性产出):归档包 = target_files + otatools + 绿色版 JDK11 + 加密工具 + 一键脚本(~3GB) 阶段三(日常):解压归档包 → 扔新文件 → 一键脚本 → 20 分钟出正式加密升级包,零源码依赖为什么能做到"免整编"
这是方案里最需要工程严谨性的部分。离线重打包出的升级包必须与 CI 整编包同源同规则,否则设备端校验过不去:
| 维度 | 如何保证一致 |
|---|---|
| 原料 | 直接复用本次整编make dist的 target_files |
| 签名 | 同一密钥,同一ota_from_target_files参数 |
| 加密 | 同一加密工具、同一密码 |
| 命名 | 复用原 pack 脚本的命名规则 |
设备端 A/B 升级的五层校验(payload manifest 签名、operation 哈希、分区 SHA256、整包签名、payload 签名)全部由工具链自动重算,没有人工干预点——这是安全性的核心:不是"绕过校验",而是"用同一条流水线重新生成校验"。
💡提效心法 2:让 AI 写方案时要求它先回答"为什么安全/为什么不会出错",再回答"怎么做"。AI 生成代码很快,但约束条件必须由人提出。
四、实现要点(通用骨架)
日常使用只有三步:
# 1. 任何 Linux x86_64 机器(磁盘 ≥20G)解压归档包unzipota_repack_<版本>.zip&&cdota_repack# 2. 新文件放入 input/# 3. 一键重打包(--replace 可多次)bashrebuild_offline.sh--replaceinput/new_app.apk SYSTEM/priv-app/NewApp/NewApp.apk脚本内部十步链路(任一步失败即停):
前置检查 → 解压 otatools(恢复执行位)→ 解压 target_files → 替换文件并 md5 校验 → 从 SYSTEM/ 树重建 system.img(哈希链自动重算) → 压回 target_files → ota_from_target_files 生成 payload 并签名 → 加密 → 解密逐字节校验 → 归档产物几个值得记录的踩坑:
- 执行位丢失:脚本经拷贝/解压中转后执行位丢失,统一改为
bash xxx.sh解释执行; - JDK 版本:AOSP 打包工具要求 JDK 11,把绿色版 JDK 一起打进归档包,目标机零依赖;
- "自举"归档:归档包生成脚本会在检测到子脚本缺失时内嵌生成它们,避免多文件不同步;
- 版本绑定:归档包只对应本次整编,跨版本混用会导致设备校验失败——脚本在产物命名中强制携带版本号,防止误用。
💡提效心法 3:让 AI 把踩过的每个坑都沉淀为脚本的自动检查项或文档 FAQ,而不是"下次记得"。人的记性不可靠,脚本的检查可靠。
五、收益数据
| 环节 | 改造前 | 改造后 |
|---|---|---|
| 换预置文件出升级包 | 2~4 小时(占用编译机) | 约 20 分钟(任意 Linux 机器) |
| 对源码环境依赖 | 必须完整源码 + 编译机 | 零依赖(归档包自包含) |
| 操作门槛 | 熟悉整编流程的工程师 | 3 条命令,可交给测试/发布同事 |
| 知识沉淀 | 口口相传 | 三层文档:全流程说明 / 操作手册 / 脚本内注释 |
六、方法论总结:AI 提效的三步法
这次实践让我总结出一套可复用的"AI 提效三步法",适用于任何工程场景:
- 让 AI 先理解,再动手。喂上下文(脚本、文档、报错日志),要求 AI 先输出链路图和可行性判断,人做决策。AI 的价值在"无惯性的全局视角",不在打字快。
- 约束先行。安全边界(签名、加密、命名规则)、失败即停、幂等可重跑——这些要求要显式写给 AI,它才会写进代码。
- 坑点资产化。每个报错都让 AI 归因并转化为脚本的自动检查或 FAQ 条目,而不是解决完就丢。
七、合规提醒
- 重打包产物发布前必须先在测试设备完整走一遍 A/B 升级验证;
- 归档包按版本管理,禁止跨版本混用。
八、写在最后
这次改造的真正启示是:AI 提效的最大杠杆不在"写得快",而在"问得对、链路看得全、坑点记得住"。3 小时到 20 分钟的收益,本质上是 AI 帮我们跳出了流程惯性,重新审视了工具链里"早就存在但没人用"的能力。
团队的日常里,还有大量这类"惯性成本":环境搭建、日志分析、回归验证、文档编写。每一项都值得用同样的三步法过一遍。欢迎交流你的 AI 提效实践。