AskaEth 21bffa1aeb sdk: 图片层追加预算解码入口,JPEG 解码期缩解(峰值 43.7→14.0 MiB)
M6 finding(vuln/high):meow_img_load_file 必先整幅 RGBA 解码,1600×2400 漫画页
瞬时峰值 20.2 MiB(15.4 MiB 输出 + 5.5 MiB YCbCr 平面),超设备 ~14MB 口径,
App 侧无法规避。

调研(vendored stb v2.30):无解码期缩放能力——JPEG 走固定 hs/vs 重采样到全尺寸,
PNG 一次性 inflate 整幅 raw_image,公共 API 只有 load/load_16/loadf/info。
完整缩小 IDCT 需改编 1/2、1/4、1/8 IDCT + 进升级系数存储 + MCU 尺寸,改动面大且
易出静默像素错误,故不重写解码器。

改为受控的最小追加(sdk/stb_image.h):
- 新增 stbi_load_scaled / stbi_load_scaled_from_memory:JPEG 输出级按步长 s 抽取
  行/列(resample 状态机逐行推进,仅采样行做颜色转换),整幅原尺寸输出缓冲从不
  物化;scale<=1 与旧 API 逐字节等价,非 JPEG 忽略。
- 进升级 JPEG:各分量系数 IDCT 进像素平面后立即释放(原来拖到输出分配之后)。
- 旧公共 API 行为不变。

SDK 追加式入口(旧 API 一字未改):
- meow_img_load_file_dim / meow_img_load_mem_dim(path/buf, maxdim):stbi_info 头探测
  选 1/2、1/4、1/8 整数档(取「长边/s ≥ maxdim」最大档,不欠采样),再交既有
  meow_img_downscale 精修;小图/maxdim<=0 走旧路径。
- meow_img_probe_file:只读头取尺寸,供 App 在 OOM 前提示。

实测(宿主 test_meow_img_budget,--wrap malloc 打点,全部 PASS):
  8.32MP JPEG   43.70 → 13.96 MiB(新/旧 0.32)
  1600×2400 页  20.16 →  9.18 MiB
  progressive   43.70 → 35.83 MiB(系数阵列扫描期驻留,残余上限)
  PNG 2400×1600 25.65 → 25.65 MiB(stb 无 PNG 缩解,如实记录)
  BMP 2400×1600 14.65 → 15.23 MiB(同上,多一次降采样小缓冲)
缩解结果与「整幅解码+downscale」网格平均差 6.28;对 PIL 逐像素比对与全幅解码
同误差量级(mean ≤0.02, max ≤3)。

验证:build_sdk.sh 重编 meow_ui.a 0 warning;examples/hello 重链 0 warning;
tuku 用 MEOW_SDK_DIR 指向本分支 sdk 重链 0 warning;既有 test_meow_img_color 仍全 PASS。
2026-11-04 21:02:39 +08:00

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 路由,命中即消费(不再落 App on_*);无视图树/未命中回落 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 自抑),命中优先于 App on_swipe/视图树——App 勿在 on_swipe 拦截上滑,否则不生效;中部上滑/滚动(LazyColumn/LazyGrid/页面滚动)不受影响,仍交 App。
  • 枚举/预设选择器 meow_select(§5.8.6):开箱即用下拉模态——BottomSheet(标题 + meow_listview SINGLE 单选列表)+ 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-musleabi soft-float) 与对应 sysroot(含 libz.a)。可用环境变量覆盖:MEOW_CC / MEOW_SYSROOT。
  • GNU ar(归档 mipsel 对象,架构无关)。
  • 宿主逻辑测试(无硬件,gcc + test_host_stub.c 打桩):
    cd sdk
    gcc -I. -Iinclude test_umbrella.c <各 sdk 源 .c> test_host_stub.c -lpthread -o test_umbrella
    ./test_umbrella
    
    参考 docs/APP_DEV_GUIDE.md §1.2。
  • 注意:改 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。

S
Description
No description provided
Readme MIT
4.5 MiB
0 Stars 1 Watchers 0 Forks
Languages
C 96.7%
Python 2.4%
Shell 0.9%