全屏滑条统一路径+对比色(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}`)。
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+49
View File
@@ -0,0 +1,49 @@
# mips-repo/mpk/ — MeowOS `.mpk` 软件包仓库
本目录存放 MeowAPPs 的成品**`.mpk`** 软件包(应用分发单元),供 `nyai` 安装。规范见
`APPS.md 附录 §3(.mpk) / §5(nyai)`,此处为速览与示例。
目前仓库为**空**(仅说明);首个包入仓后形如:
```
mpk/
README.md # 本文件
<pkg>.mpk # 成品包(tar.gz)
Packages # 可选:nyai index mpk/ 生成的索引
```
## `.mpk` 规范
- **包名 `<pkg>` = 文件名茎 = `app.json` 的 `package`**(如 `os.meow.hello` → `os.meow.hello.mpk`)。
- **格式**:`.mpk` = **tar.gz**,含 `app.json` + `meow` 二进制 + 资源,**不含 `data`/`cache`**
(运行时按设备生成)。打包目录为 `MeowAPPs/<包名>/`(剔除 data/cache 后打包)。
- **关键字段**(在 `app.json` 内,`package` 必填):`package`/`name`/`version`/`exec`/
`routes`/`services`/`depends`/`description` 等;`size`/`sha256` 由索引生成。
- **安装**:`nyai install <包或文件.mpk>`(读 `.mpk` 内 `app.json`,校验包名/哈希,解压到
`MeowAPPs/<包名>/`,同名先备份 `.bak_<pid>`,触发数据 init 建 `MeowData/<包名>/{data,cache}`)。
- **导出**:`nyai export <pkg> [out.mpk]`(打包 `MeowAPPs/<pkg>/`,不含 data/cache)。
- **索引**:`nyai index <dir>` 为目录生成 `Packages`(每行 `Package/Version/Filename/Size/SHA256/
Depends/Description`,空行分隔记录),供经源(`sources.list`)安装解析依赖。
## 示例(结构示意)
以 `os.meow.hello` 为例,打包自 `MeowAPPs/os.meow.hello/`:
```bash
# 打包导出
nyai export os.meow.hello # → os.meow.hello.mpk
# 或手动:剔除 data/cache 后 tar.gz(与 launcher 同 gzip -dc | tar -x 管道语义)
cd MeowAPPs/os.meow.hello && tar czf os.meow.hello.mpk app.json meow assets/
# 本地源目录 + 索引生成
mkdir -p /usr/data/mnt/sd_0/MeowOS/opt/repo
cp os.meow.hello.mpk /usr/data/mnt/sd_0/MeowOS/opt/repo/
nyai index /usr/data/mnt/sd_0/MeowOS/opt/repo # 生成 Packages
# 在设备上安装(M2.12+ 可直呼 nyai;更早固件用绝对路径)
nyai install os.meow.hello # 或 nyai install os.meow.hello.mpk
```
> 注:`nyai` 部署于卡 `MeowOS/opt/bin/nyai`(M2.12+ 由 `meow_card_path.sh` 前插 PATH 可直呼)。
> 卡上源配置 `MeowOS/opt/nyai/sources.list`(无此文件默认本地源 `MeowOS/opt/repo`)。