6c8a1d3925577cc5bcac9cd08c50d81fe2bee793
P1-A(像素错误):mj_boundary() 在「over 且 marker 非 RSTn」时 return 0 提前退出
扫描。熵码位缓冲最多 9 位前瞻,会在最后一个 MCU/块**之前**把扫描结束后的 marker
(DHT/EOI)吃掉;此时最后 1~2 个 MCU 的有效比特还在 bitbuf 里,return 0 把它们丢掉,
分量平面 memset(128) 的灰底直接露出来(低熵/纯白渐进式右下角 #808080)。
修:扫描循环本来就知道确定的 MCU/块数 —— 一律继续解完(位耗尽后 mj_eb 返回 0 做
零填充),marker 交给外层主循环。实测(纯白 2000x3000 progressive 无 restart):
修复前全图最小通道 128 / 与 stb 最大差 127 / >40 差值的通道 9 个;修复后
最小通道 253~255、最大差 ≤2、>40 通道 0。
测试加固(评审指出旧断言是抽样蒙混):
- S12「与无 restart 逐字节一致」改为**全图 memcmp**(去掉 64×64 网格 MAD<0.1 的兜底);
修复后 9 档 restart 全部逐字节一致。
- 新增 S15:纯白 2000x3000 progressive(q50/60/70/80,无 restart)+ mostly-white q95,
断言全图最小通道/右下角 24×24 最小通道 ≥250(丢 MCU 必露 128)、与 stb 全图逐像素比较。
用 HEAD(11a4fcd) 的 meow_jpeg.c 重编同一测试:4 档纯白全部 FAIL(min=128,
>40 通道 9),修复后全 PASS。
P1-B(内存放大/安全):mj_sof() 按 SOF 声明尺寸分配平面,降档循环在 base_n 已为 1
时不再生效,17~23 字节的 `SOI+SOF0(65535×65535)+EOI` 会让公开入口 _dim(720)
分配并 memset 64MiB(1 分量)/96MiB(3 分量)后才返回 NULL。
修:降档循环之后补硬闸 `if (plane_bytes + target_bytes > MJ_PEAK_CAP) return 0;`
→ 回退 stb(同文件 stb 是 0.02MiB 安全失败)。
回归 S16:构造 SOF 65535²(1/3 分量)→ 后端返回 0、公开入口 NULL、峰值 0.02MiB
(修复前 64.00 / 96.00MiB)。
meow_jpeg.h 注明「峰值只与输出尺寸相关」的适用范围:畸形/超大声明尺寸直接拒绝(安全失败)。
验证:test_meow_img_stream ALL PASS(含 ASan 整轮 rc=0 无报告);test_meow_img_budget /
test_meow_img_color ALL PASS;run_tests.sh rc=0(zip 106 / cbz 296 / membudget PASS);
run_webtoon_tests.sh rc=0;build_sdk.sh 零警告,MIPS32 rel2;体积 meow_jpeg.o 17,212B
+ meow_png_stream.o 8,456B。峰值不变(修复不增加分配)。
MeowOS SDK for HiBy R3 Pro II
MeowOS 应用框架 SDK 的公开仓库——面向第三方开发者,让你为运行 MeowOS 的 HiBy R3 Pro II 写自己的 App。
本仓库把 MeowOS 的 App 框架(meow_ui)与相关开发文档独立发布出来,自带示例与构建脚本,自包含、开箱即构建,不依赖 MeowOS 主仓。
快速上手见 docs/APP_DEV_GUIDE.md;SDK 设计全量见 docs/MEOW_APP_SDK.md。
设备与平台
| 项 | 值 |
|---|---|
| 设备 | HiBy(海贝)R3 Pro II |
| 架构 | MIPS32r2(mipsel,little-endian,soft-float) |
| 屏幕 | 480×720,RGB565(代码里颜色统一 24-bit 0xRRGGBB,SDK 内部转 RGB565) |
| 可执行格式 | 静态 MIPS32r2 ELF(编译 -Os -static) |
| 底层系统 | MeowOS(Linux 系,非 Android) |
目录结构
MeowOS-SDK/
├── sdk/ # meow_ui 应用框架静态库源码(自包含,可交叉 → sdk/meow_ui.a)
│ ├── meow_ui.h # 伞头(#include 聚合 include/ 子头;App 只 include 这个)
│ ├── include/ # 24 个模块子头(含 box/anim/scroll/str/lazygrid/select/cachegov/net 通道等)+ meow_ipc.h / meow_font.h / meow_notif.h(vendored)
│ ├── meow_font.c # 预渲染位图字体运行时(meow_font.a 源码,自包含)
│ ├── build_sdk.sh # 交叉编译 meow_ui.a(mipsel 静态库,内含 meow_font.o)
│ └── test_*.c # SDK 宿主逻辑测试(test_host_stub.c 打桩,无硬件可跑)
├── examples/hello/ # 最小示例 App(meow_view 框架,多文件分层)
│ ├── app.c # main + 装配 + 事件分发(把 meow_ui_run 回调路由到各页)
│ ├── ui/ # 每页一个 view 文件(home/demo/list/full/chrome)
│ ├── logic/ # 纯 C 业务逻辑(不依赖 meow_ui.h,宿主可裸测)
│ └── build_hello.sh # 构建 hello(链 meow_ui.a + libz.a + -lpthread)
├── tuku/ # 图库:漫画书库 App(M3 骨架:主题同步/目录浏览/阅读器桩)
│ ├── app.c # main + 装配 + meow_ui_run 回调路由 + 主题监听
│ ├── logic/ # 纯 C:目录扫描/自然排序、阅读方向状态(宿主可裸测)
│ ├── ui/ # library / reader / settings / lock 每页一个 view
│ ├── build_tuku.sh # 交叉构建(SDK 用 ${MEOW_SDK_DIR:-$HOME/Proj/MeowOS-SDK/sdk})
│ └── pack_tuku.sh # 出包 os.meow.picbrowser.mpk
└── docs/
├── APP_DEV_GUIDE.md # 第三方开发上手指南(环境 → 最小 App → 构建打包 → 签名安装 → 调试)
└── MEOW_APP_SDK.md # SDK 设计全量规范
快速上手
# 1) 构建 meow_ui.a(交叉)
cd sdk
./build_sdk.sh # 产出 sdk/meow_ui.a
# 2) 构建示例 App hello
cd ../examples/hello
./build_hello.sh # 产出 examples/hello/hello(静态 MIPS32r2 ELF)
# 3) 构建图库(SDK 用绝对路径,可用 MEOW_SDK_DIR 覆盖)
cd ../../tuku
./build_tuku.sh # 产出 tuku/tuku(静态 MIPS32r2 ELF)
./pack_tuku.sh # 产出 tuku/os.meow.picbrowser.mpk
SDK 能力速览
统一控件 / 输入 / 主题 / 字体 / 通知 / 导航之外,本版 SDK 还提供(详见 docs/MEOW_APP_SDK.md):
- 布局引擎
meow_box(§12.1):线性布局纯计算器——固定/权重/wrap 尺寸、间隙/边距、主轴与交叉轴对齐、嵌套子 box;meow_view_set_layout与视图框架 opt-in 集成。 - 动画基座
meow_anim/meow_anim_tick(§12.2):声明式 tween(linear/ease-out/ease-in-out/overshoot),静态池 ≤16,无动画零开销;只 flush 动画影响区。 - 滚动物理
meow_scroll(§12.3):速度采样 + 松手 fling + 边界 clamp/简单回弹 + snap 吸附;给meow_list/W_LIST/W_LISTVIEW加惯性滚动。 - 事件分发形式化(§6.4):单一仲裁者——z 序自顶向下命中、命中即消费、down 捕获整个手势、模态层隔离、唯一焦点(点外释放/滚动容器转移)。
- 视图事件路由(§A.7,M7.0a):
meow_view_dispatch_event接入meow_ui_run——TAP/KEY/SWIPE/LONG_PRESS 先走视图树on_event路由,命中即消费(不再落 Appon_*);无视图树/未命中回落 App 原生on_*回调(完全向后兼容)。页内子导航按设计定案 b 标注废弃(不实现),页内「子页」用meow_view_add_child挂 CONTAINER 子视图(组合嵌套)。 - ListView 虚拟化(§5.5):固定 item 池(视口+2)、多行富 item、段头、空态、完全自绘钩子;App 只提供「总数 + bind」回调,几千/上万行不卡。
- ListView 左滑删除(§5.5):列表行横向手势
meow_listview_swipe_begin/move/end三级喂入 + 删除/回弹动画;meow_listview_set_swipe_delete绑删除回调,行自绘set_item_draw配合画右露删除区(主题error/onError)。 - 圆形图标按钮
meow_iconbtn_create(M7.0a):圆形命中 + 位图图标(sb_icons[]/MEOW_ICON_*)+ 实时按压/按住态;供电源菜单/播放控制/锁屏件用。 - 主题色板导出/注入(§8.1.5,M7.0a):
meow_theme_export/meow_theme_inject——「单一权威桥」,导出当前style×mode解析生效的权威主题(9 角色字段),或注入一份自定义板覆写当前生效主题(NULL恢复内建,覆写随meow_theme_reload()保留);供 stateless 绘制原语读单一权威、或 launcher/App 自定义背景/强调/风格。 - 字符串资源 / i18n(§13):
meow_str/meow_strf/meow_str_set_locale——内嵌zh_cn/en_us双语表 + TF 卡覆盖表;UI 文案零硬编码,按 locale 取整串。 - 图标库
sb_icons(§5.8):30 个 MD3 Material Symbols 位图动作图标(MEOW_ICON_*),meow_topappbar_set_item_icon把 TopAppBar 动作项换成位图图标(修复 ⚙↻⌕ 豆腐)。 - 图片降采样
meow_img_downscale(include/meow_ui_image.h):把解码图降到 ≤maxdim 边长省内存(封面/大图用,如 8.28MB→0.78MB)。 - 2 维虚拟化宫格
meow_lazygrid(§12.4):卡片/图标宫格二维虚拟化——只实例化可见行(固定 item 池 ≤96、视口行数+2×cols),count+bind数据源、长列表不卡;命中meow_lazygrid_hit/tap_at把滚动+网格坐标映射回 item idx;滚动复用meow_scroll(fling/snap)。 - SDK 默认列表/容器控件默认 MD3(M6.37–M6.39):
meow_list_create/meow_lazycolumn_create/meow_lazyrow_create与meow_listview默认即容器模式——每项surfaceContainer圆角卡 + 项间空隙 + 去分隔线 + 卡内 tonal 选中/按压,用默认 renderer 的 App 开箱即 MD3;需扁平/满幅分隔线可用meow_list_set_container(w,0)回退。 - 全局 App 内底部上滑回桌面(
meow_ui_input_is_home_swipe,系统保留手势):任意 App 内屏底边缘上滑即回桌面(后台保活、进程保留转后台、present 自抑),命中优先于 Appon_swipe/视图树——App 勿在on_swipe拦截上滑,否则不生效;中部上滑/滚动(LazyColumn/LazyGrid/页面滚动)不受影响,仍交 App。 - 枚举/预设选择器
meow_select(§5.8.6):开箱即用下拉模态——BottomSheet(标题 +meow_listviewSINGLE 单选列表)+meow_ui_modal_capture/restore背景快照(关闭无残影);点选项=选中+on_change回调,点面板外/左缘=取消。 - 磁盘页缓存治理
meow_cachegov(OOM_PAGECACHE_GOVERNANCE):App 登记缓存文件 + read_pos 回调,SDK 做 DONTNEED 治理(L0 曲终整文件丢 / L1 播放中丢已读前缀保 keep_hot 窗口);refault 滚窗逐级回退(放大 keep_hot→降 L0→关 A);meow_cachegov_download/prefetch_paused提供给下载/预取方降载查询。 - 网络自愿通道
meow_ui_net(netmgrd 期 4):联网前meow_net_policy_check(host)自查是否被策略放行(netmgrd 不在/超时→乐观放行);meow_net_report(rx,tx)自愿上报本进程收发字节(best-effort,失败静默)。
构建要求
- 交叉工具链(mipsel musl 静态):MeowOS 开发机默认路径
$HOME/Project/R3ProII/.tools/zig-mipsel-cc(zig 包装,--target=mipsel-linux-musleabisoft-float) 与对应 sysroot(含libz.a)。可用环境变量覆盖:MEOW_CC/MEOW_SYSROOT。 - GNU
ar(归档 mipsel 对象,架构无关)。 - 宿主逻辑测试(无硬件,
gcc+test_host_stub.c打桩):参考 docs/APP_DEV_GUIDE.md §1.2。cd sdk gcc -I. -Iinclude test_umbrella.c <各 sdk 源 .c> test_host_stub.c -lpthread -o test_umbrella ./test_umbrella - 注意:改 SDK 源码(尤其
meow_ui_theme/meow_widget结构)即 ABI 变化,必须同步重编meow_ui.a与你的 App。
与 MeowOS 主仓的关系
本仓库由 MeowOS 主仓(MeowOS-For-R3P2)经 git subtree split 拆出,只含公开的 SDK / 示例 / 文档:
sdk/对应主仓patch_v2/sdk/,examples/hello/对应主仓patch_v2/hello_app/,docs/对应主仓docs/APP_DEV_GUIDE.md+MEOW_APP_SDK.md。- 不含主仓的系统组件(launcher / amsd / audiod / svc_* / netmgrd 等)、固件、签名工具、密钥。
- 本仓库中的
build_sdk.sh/build_hello.sh已改造为自包含(meow_ipc.h/meow_font.h/meow_notif.h/meow_font.c一律在sdk/内 vendored,不再依赖主仓meow_launcherd/),与主仓内的同名脚本存在差异。 - SDK 增量同步(主仓
patch_v2/sdk更新后再推本仓)的方法见主仓devdocs/与scripts/中的拆分记录。
许可证
MIT License——版权 "MeowOS contributors",见 LICENSE。
Languages
C
96.7%
Python
2.4%
Shell
0.9%