# MeowOS 固件打包脚本使用说明(scripts/build/) > 本目录是 MeowOS 固件打包的**唯一入口**。核心思想:**只改配置文件,不改脚本**。 > 新增/更新固件内容 → 改 `fw_content.conf`;打包 → 跑 `build_fw_apps.sh`。 > 本文档防遗忘,覆盖常见场景与踩坑记录。 --- ## 1. 文件一览 | 文件 | 作用 | |---|---| | `build_fw_apps.sh` | **通用打包脚本**(配置驱动)。读清单 → 组树 → repack → 校验 → 出固件。**不要改它的逻辑**,除非打包流程本身要变。 | | `fw_content.conf` | **固件内容清单**(默认配置)。每行一条 `|||`,声明"哪个本地文件装到固件哪里"。**改固件内容只改这里。** | | `README.md` | 本说明。 | > 曾有一批独立脚本 `build_fw_apps_m2xx.sh`(每版复制一个、内部硬编码 md5),**已清理删除**,不再使用。它们的问题:需每版改脚本、且共享 `fw_apps/` 目录互相清空。现统一走"一个通用脚本 + 一个配置文件"。 --- ## 2. 用法 ```bash cd /home/Aska/Project/R3ProII # 用默认配置打包,版本号 0.7.68,输出 r3proii_m2_73.upt bash scripts/build/build_fw_apps.sh -v 0.7.68 -o r3proii_m2_73.upt # 用指定配置(并存多套调试/场景配置时) bash scripts/build/build_fw_apps.sh -c scripts/build/fw_content.conf -v 0.7.68 -o r3proii_m2_73.upt # 指定基线目录(默认 fw_ssh/squashfs-root) bash scripts/build/build_fw_apps.sh -v 0.7.68 -o r3proii_m2_73.upt -b fw_ssh/squashfs-root ``` ### 参数 | 参数 | 必填 | 说明 | |---|---|---| | `-c, --config` | 否 | 清单路径,默认 `scripts/build/fw_content.conf`。传别的路径即用另一套配置(互不覆盖)。 | | `-v, --version` | **是** | 版本号(如 `0.7.68`),写入固件 `/etc/meowos_version`。 | | `-o, --out` | **是** | 输出 `.upt` 路径(如 `r3proii_m2_73.upt`)。若指向仓库内 `fw_apps/` 下(非 `out/`),自动并入 `fw_apps/out/` 归档。 | | `-b, --base` | 否 | 基线根文件系统目录,默认 `fw_ssh/squashfs-root`。 | ### 产物去哪 - **工作区(每次清理重建)**:`fw_apps/build/` —— 组装 squashfs-root 树,用后即弃。 - **产物归档(不受清理影响)**:`fw_apps/out/` —— 打包好的 `.upt` 固定放这,多次打包互不覆盖、不会误删。 > **重要**:`-o` 给相对路径时按"文件命名"即可(如 `-o r3proii_m2_73.upt`),脚本会自动归档到 `fw_apps/out/r3proii_m2_73.upt`。 --- ## 3. 修改固件内容(只改配置) 固件里加/换一个组件,只需在 `fw_content.conf` 加/改一行: ``` ||| ``` - ``:仓库内相对路径(相对项目根 `ROOT`),如 `patch_v2/meow_launcherd/meow_launcherd`。 - ``:目标绝对路径(装入固件),如 `/usr/bin/meow_launcherd` 或 `/etc/init.d/S90meow_bootmenu`。 - ``:**可空 = 不校验**;填了 = 打包前对 `` 做强校验,不一致即 `exit 1`(防呆:源被改/路径错)。**改了源码后要更新这里的 md5**(`md5sum `)。 - ``:注释说明(可省略,出现会保留)。 规则: - `#` 开头为注释,空行忽略。 - 目标目录自动创建;`usr/bin` / `etc/init.d` / `etc/profile.d` 一律 `chmod 755`。 - 多重配置并存:复制 `fw_content.conf` 改名,用 `-c` 指定,互不干扰。 ### 常见:更新某个二进制后改 md5 ```bash md5sum patch_v2/meow_launcherd/meow_launcherd # → 9ca4c5e8a919f59cb2cdd6326da23065 ``` 把 `fw_content.conf` 里对应行 md5 替换成新值即可。 --- ## 4. 打包流程做了哪些事(通用步骤) 脚本读清单之外,还会自动做这些固定动作(**无需在清单里声明**): 1. 建树:复制基线 `$BASE` → `fw_apps/build/squashfs-root`。 2. 校验基线:`usr/bin/hiby_player` 必须是 stock(md5 `a73f2c49…`),否则中止(防 stock 被改坏)。 3. 解析清单:逐条(md5 若有则强校验)→ `cp -f` → `chmod 755`,目录自动建。 4. 写版本:`echo $VERSION > $DST/etc/meowos_version`(单点版本号来源)。 5. 外围 CLI 瘦身:从 `/usr/bin` 移除白名单工具(`curl socat tmux jq rsync nano htop ncdu file xxd`——已迁 TF 卡 `MeowOS/opt/bin/`)。 6. 启动图/背包/关机 logo:从 `bootlogos/` 拷 `logo_new→logo.jpeg`、`logo1_new→logo1`、`logo2_new→logo2`、`boot_anim_0.png→etc/boot_animation/0.png`、`shutdown_logo.jpeg→etc/`。 7. `S99ssh` → `S84ssh`:改名(内容不变),校验一致后删 `S99ssh`(清单不含 S84)。 8. repack:`hiby_os_crack/scripts/repack.sh -i $DST -k unpacked_v14/xImage -o $OUT`。 9. 体积核对:rootfs 分区 ≤ **45,088,768** 字节,超限中止。 10. unpack 回验:把打包产物解回到官方 squashfs,与 `$DST` 比对 **0 diff**,发现差异即中止并打印 diff。 ### 清单里**不要**加的东西(通用步骤已处理) - `/etc/meowos_version`(由 `-v` 写入) - `/etc/logo*`、`/etc/boot_animation/0.png`、`/etc/shutdown_logo.jpeg`(由 bootlogos/ 拷贝) - `/etc/init.d/S84ssh`(由基线 `S99ssh` 改名而来) - `usr/bin` 外围 CLI 瘦身(按白名单移除) > **易混淆**:`/etc/shutdown_logo.jpeg` 是**图片**(通用步骤从 `bootlogos/shutdown_logo.jpeg` 拷);`/etc/init.d/S95shutdown_logo` 是**启动/停止脚本**(清单里单独一条 `S95shutdown_logo`,负责关机时显示该图)。二者不同,别混。 --- ## 5. 踩坑记录(重要) - **脚本共享目录互相清空**:早期每个版本一个脚本、都 `rm -rf fw_apps`,并行跑会删掉彼此的 `.upt` 产物。→ 已改为 `fw_apps/build/`(工作区)+ `fw_apps/out/`(归档)分离,且删光独立脚本。 - **改源码忘更新 md5**:清单里 md5 是强校验,源变了但 md5 没改 → 打包直接失败。**凡是动了清单里列的源文件,先 `md5sum` 更新对应行。** - **SDK 库(`meow_ui.a`)不入固件**:它由 APP(如 hello)链接,走 TF 卡 `MeowAPPs/` 热更新,**不要**加进清单。 - **`fw_apps/` 被 gitignore**:固件产物与组装树都是构建产物,勿提交。 - **`scripts/build/` 被 gitignore**:整个目录不入库(含本 README)。但 `build_fw_apps.sh`/`fw_content.conf` 已用 `git add -f` 入库(它们是唯一应入库的脚本/配置)。本 README 是本地备忘,提交需 `git add -f`。 --- ## 6. 每次打固件的最小步骤 ```bash # 1. 确认要进的组件 md5 无变化(若改了源码先更新 fw_content.conf) md5sum patch_v2/meow_launcherd/meow_launcherd patch_v2/meow_svc_power/meow_svc_power # 2. 打包(版本号 + 输出名) bash scripts/build/build_fw_apps.sh -v 0.7.68 -o r3proii_m2_73.upt # 3. 看结果:0 diff、体积 ≤ 上限、最终固件 md5 # 产物在 fw_apps/out/r3proii_m2_73.upt # 4. 推卡升级:scp 到设备卡根 /usr/data/mnt/sd_0/r3proii.upt(先备份当前为 prevNx) ``` --- ## 7. 相关权威文档 - 固件/升级细节:`docs/MEOWOS_SPEC_REF.md`(版本单点 `/etc/meowos_version`、rootfs 上限 45088768、mtd 分区、升级=写 mtd5)。 - 组件来源:`patch_v2/`(launcher/bootmenu/svcd/sysui/mdns/nyai/svc_power/svc_perf 等)。 - 专项服务/电源 CLI:`devdocs/plan/SYSTEM_FRAMEWORK_SERVICES.md`。