Files

140 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MeowOS 固件打包脚本使用说明(scripts/build/)
> 本目录是 MeowOS 固件打包的**唯一入口**。核心思想:**只改配置文件,不改脚本**。
> 新增/更新固件内容 → 改 `fw_content.conf`;打包 → 跑 `build_fw_apps.sh`。
> 本文档防遗忘,覆盖常见场景与踩坑记录。
---
## 1. 文件一览
| 文件 | 作用 |
|---|---|
| `build_fw_apps.sh` | **通用打包脚本**(配置驱动)。读清单 → 组树 → repack → 校验 → 出固件。**不要改它的逻辑**,除非打包流程本身要变。 |
| `fw_content.conf` | **固件内容清单**(默认配置)。每行一条 `<src>|<dst>|<md5>|<desc>`,声明"哪个本地文件装到固件哪里"。**改固件内容只改这里。** |
| `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` 加/改一行:
```
<src>|<dst>|<md5>|<desc>
```
- `<src>`:仓库内相对路径(相对项目根 `ROOT`),如 `patch_v2/meow_launcherd/meow_launcherd`。
- `<dst>`:目标绝对路径(装入固件),如 `/usr/bin/meow_launcherd` 或 `/etc/init.d/S90meow_bootmenu`。
- `<md5>`:**可空 = 不校验**;填了 = 打包前对 `<src>` 做强校验,不一致即 `exit 1`(防呆:源被改/路径错)。**改了源码后要更新这里的 md5**(`md5sum <src>`)。
- `<desc>`:注释说明(可省略,出现会保留)。
规则:
- `#` 开头为注释,空行忽略。
- 目标目录自动创建;`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.md`/`build_fw_apps.sh`/`fw_content.conf` 已 `git add -f` 入库**(这三个是仓库侧应保留的脚本/配置/说明);其余(`fw_apps/` 产物等)不入库。
---
## 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`。