全屏滑条统一路径+对比色(112/115) + 字体索引+查列表+丢失降级(113) + 文档刷新(114) + svcd CLI文档+mips-repo拆bins/mpk(116)

This commit is contained in:
MeowOS Dev committed 2026-08-30 14:14:30 +08:00
1 parent b75ecce5de
commit 19a001f007
22 files changed
+666 -129

No files matched your search

+76 -17
View File
@@ -2,24 +2,42 @@
目标设备:R3 Pro II / MeowOS 固件(**mipsel-linux-muslsf**,静态,无 glibc 依赖)。
用途:存放针对该设备的交叉编译二进制与构建信息,便于**复用**到后续固件 / TF 卡
(MeowOpt 目录;`MeowLib` 未定义/未用——`MeowOpt` 与 `MeowOS/opt` 命名需归一:代码用 `MeowOS/opt`,文档 `MeowOpt` 指卡上外部工具目录。[源:审计 2026-08-30])。
(`MeowOS/opt` 目录;`MeowLib` 未定义/未用——`MeowOpt` 与 `MeowOS/opt` 命名需归一:代码用 `MeowOS/opt`,文档 `MeowOpt` 指卡上外部工具目录。[源:审计 2026-08-30])。
## 仓库结构(**两半**:`bins/` 普通二进制工具 + `mpk/` `.mpk` 软件包)
## 仓库结构(每工具一个目录)
```
mips-repo/
README.md # 本文件
<tool>/
build.sh # 交叉编译脚本(可重复执行)
manifest.md # 元信息:来源/版本/arch/校验/产物路径/安装目标
bin/<tool> # 交叉编译产物(静态 mipsel,如存在)
bins/ # 「普通二进制/工具」仓库:交叉编译产物 + 构建/元信息
<tool>/
build.sh # 交叉编译脚本(可重复执行;可搬,路径相对本目录)
manifest.md # 元信息:来源/版本/arch/校验/产物路径/安装目标
bin/<tool> # 交叉编译产物(静态 mipsel,如存在)
(<tool>.c 源码如自研也放此)
mpk/ # 「.mpk 文件」仓库:MeowAPPs 软件包(.mpk = tar.gz)
README.md # .mpk 规范说明(格式/字段/安装)
<pkg>.mpk # 成品包(app.json + meow 二进制 + 资源;不含 data/cache)
```
> 两者定位不同:`bins/` 是**宿主侧工具**(服务/二进制,如 mDNS 应答器、netd),由
> **meow_svcd** 托管、打进固件或按需从卡 `MeowOS/opt/<tool>/` 部署;`mpk/` 是**应用层
> 软件包**(MeowAPP 分发单元),用 **`nyai`** 安装到 `MeowAPPs/<包名>/`。
## 当前已入库工具
- **mdnsd/**:Apple mDNSResponder-2881.0.25 交叉编译产物(`mipsel-linux-muslsf` 静态)。两种变体同在 `bin/`:
### bins/(普通二进制 / 工具仓库)
- **bins/mdnsd/**:Apple mDNSResponder-2881.0.25 交叉编译产物(`mipsel-linux-muslsf` 静态)。两种变体同在 `bin/`:
- `bin/mdnsd` = **SAResponder**(mDNSResponderPosix,单服务注册型,`-n/-f` 只发布/回指定服务)strip 后 **885.6 KB**;
- `bin/mdnsd.bin` = **完整 mdnsd** 守护进程(通用宿主响应器,回任意 `.local` 查询)strip 后 **994 KB**。
⚠️ 实测(内核无 IPv6)**两者均失败**:`socket AF_INET6: Address family not supported by protocol`;且即便 `make HAVE_IPV6=0` 编译通过、daemon 能跑,**也不发布主机名 A 记录**(IPC 服务型守护进程,等客户端注册)。故 mDNS 方案A 判为**不达标**,由 `meow_mdns/` 替代(见下)。
- **meow_mdns/**:自研极简 IPv4-only mDNS 应答器(~77.6 KB,`mipsel-linux-muslsf` 静态)。join `224.0.0.251:5353`,应答 `<host>.local` A + `_ssh._tcp.local` PTR/SRV/TXT;零 IPv6 依赖。部署到 TF `MeowOS/opt/mdnsd/mdnsd`(95 KB < 阈值,可考虑进固件)。详见 `meow_mdns/manifest.md`。⚠️ 手机热点**丢弃客户端间组播**→ 设备能应答、主机收不到(avahi 只认组播应答),`avahi-resolve *.local` 仍超时(网络层热点隔离,非应答器缺陷),需主机 DNS 兜底。
⚠️ 实测(内核无 IPv6)**两者均失败**:`socket AF_INET6: Address family not supported by protocol`;且即便 `make HAVE_IPV6=0` 编译通过、daemon 能跑,**也不发布主机名 A 记录**(IPC 服务型守护进程,等客户端注册)。故 mDNS 方案A 判为**不达标**,由 `bins/meow_mdns/` 替代(见下)。
- **bins/meow_mdns/**:自研极简 IPv4-only mDNS 应答器(~77.6 KB,`mipsel-linux-muslsf` 静态)。join `224.0.0.251:5353`,应答 `<host>.local` A + `_ssh._tcp.local` PTR/SRV/TXT;零 IPv6 依赖。部署到 TF `MeowOS/opt/mdnsd/mdnsd`(95 KB < 阈值,可考虑进固件,实际已改板载 `/usr/bin/meow_mdns`,见下)。详见 `bins/meow_mdns/manifest.md`。⚠️ 手机热点**丢弃客户端间组播**→ 设备能应答、主机收不到(avahi 只认组播应答),`avahi-resolve *.local` 仍超时(网络层热点隔离,非应答器缺陷),需主机 DNS 兜底。
### mpk/(`.mpk` 软件包仓库)
- 目前**为空**(仅 `README.md` 说明规范)。MeowAPPs 成品包 `.mpk` 集中放此,供 `nyai` 经
`sources.list`(本地源 = `MeowOS/opt/repo`)或 `nyai install <x.mpk>` 直接安装。
## 目标架构与工具链
- 架构:`mipsel`(MIPS32r2, little-endian)
@@ -27,13 +45,54 @@ mips-repo/
- 交叉编译器:`~/.tools/zig-mipsel-cc`(zig 目标 mips-linux-musl)
- 目标静态库 sysroot:`~/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf`
## 新增一个工具的流程
1. `mkdir -p <tool>/bin`,写 `<tool>/build.sh`(用 zig-mipsel-cc,`-Os -static`)。
2. 跑 `build.sh`,产出放 `<tool>/bin/<tool>`。
3. 写 `<tool>/manifest.md`:来源(如 Apple-OSS/mDNSResponder 版本)、ARCH、`file`
输出摘要、`ls -l` 大小、构建命令、安装路径(固件 or TF MeowOpt)。
## 服务管理:meow_svcd CLI(托管 `bins/` 下的服务)
`bins/` 里的常驻服务(如 `meow_mdns`)由 **meow_svcd**(类 systemd/systemctl,固件
`/usr/bin/meow_svcd`,板载 `etc/init.d/S89meow_svcd` 开机自启)托管,SSH 到设备后可直接用:
```
meow_svcd status # 列出所有服务与状态(card_present/wifi_up/services=N)
meow_svcd restart meow_mdns # 重启单服务(如板载 mDNS 应答器)
meow_svcd stop all # 停止全部服务
meow_svcd reload # 重读板载+TF 双源 services.d
meow_svcd start meow_mdns # 启动单服务
meow_svcd pid # 打印守护进程 pid
```
- 控制走 AF_UNIX 单行文本,默认 socket `/tmp/meow_svcd.sock`;应答 `OK` / `ERR no-such-service` /
多行 `svc=<name> state=… pid=… restart=… exit=…`。守护默认**后台**;`-f/--foreground` 前台(供
supervisor `fork/exec`+`waitpid` 托管)。
- **服务目录规则(双源板载优先)**:固件工具 → 板载 `/usr/data/meow/services.d/<name>.conf`(Data 区,
拔卡保留);TF 工具/第三方 → TF `MeowOS/services.d/<name>.conf`(随卡存在/消失);同名板载优先(TF 被屏蔽 + WARN)。
- 详见 `patch_v2/meow_svcd/meow_svcd.md` / `docs/MEOWOS_SPEC_REF.md §4`。
## 应用包:`.mpk` 规范 & `nyai`
`.mpk` 是 MeowOS 的应用分发单元(`MeowAPPs`),规范与 `nyai` 用法见 `APPS.md 附录 §3(.mpk) / §5(nyai)`。
要点:
- **包名 = 文件名茎 = `app.json` 的 `package`**(如 `os.meow.hello` → `os.meow.hello.mpk`)。
- **格式**:`.mpk` = tar.gz,含 `app.json` + `meow` 二进制 + 资源,**不含 data/cache**(运行时按设备生成)。
- **安装**:`nyai install <pkg或文件.mpk>`;`nyai index <dir>` 为目录生成 `Packages` 索引
(Package/Version/Filename/Size/SHA256/Depends/Description);`nyai export <pkg>` 打包导出。
- **部署 `nyai`**:`MeowOS/opt/bin/nyai`(卡,随 TF_CARD_LAYOUT 外围工具目录)。M2.12+ 固件
`meow_card_path.sh` 已前插 `MeowOS/opt/bin` 可直呼;更早固件上 SSH 需绝对路径
`/usr/data/mnt/sd_0/MeowOS/opt/bin/nyai` 或 `export PATH=/usr/data/mnt/sd_0/MeowOS/opt/bin:$PATH`。
## 新增一个工具/包的流程
- **工具(进 `bins/`)**:
1. `mkdir -p bins/<tool>/bin`,写 `bins/<tool>/build.sh`(用 zig-mipsel-cc,`-Os -static`)。
2. 跑 `build.sh`,产出放 `bins/<tool>/bin/<tool>`。
3. 写 `bins/<tool>/manifest.md`:来源(如 Apple-OSS/mDNSResponder 版本)、ARCH、`file`
输出摘要、`ls -l` 大小、构建命令、安装路径(固件 or TF MeowOpt)。
- **应用包(进 `mpk/`)**:
1. 打包不含 data/cache 的 `MeowAPPs/<包名>/` → `mpk/<包名>.mpk`(或 `nyai export`)。
2. `nyai index mpk/` 生成/刷新 `Packages` 索引(供经源安装)。
3. `.mpk` 字段与安装语义见 `mpk/README.md` / `APPS.md 附录 §3`。
## 部署到哪里
- 体积小(约 <200KB)→ 可直接打进固件(/usr/bin 或由 supervisor 启动)。
- 体积大 → 放 TF 卡 `MeowOpt/<tool>/`,由 MeowOS 启动时从卡加载(拔卡降级不崩)。
- **按需取用**:从 `MeowOpt/<tool>/` 按需部署,不一定要全部入库;若某工具体积仍偏重(如 mdnsd 的 885~994KB),可评估更小方案(OpenWrt linkd / libmdns,或自研极简响应器——仅回 A 记录 + `_ssh` 服务)以塞进固件 <200KB。
- 体积小(约 <200KB)→ 可直接打进固件(/usr/bin 或由 supervisor/meow_svcd 启动)。
- 体积大 → 放 TF 卡 `MeowOS/opt/<tool>/`,由 MeowOS 启动时从卡加载(拔卡降级不崩)。
- **按需取用**:从 `MeowOS/opt/<tool>/` 按需部署,不一定要全部入库;若某工具体积仍偏重(如 mdnsd 的 885~994KB),可评估更小方案(OpenWrt linkd / libmdns,或自研极简响应器——仅回 A 记录 + `_ssh` 服务)以塞进固件 <200KB。
- `.mpk` → 经 `nyai` 装到 `MeowAPPs/<包名>/`(数据建 `MeowData/<包名>/{data,cache}`)。