面向 HarmonyOS 2in1 设备的原生数值计算与科学绘图环境
GitHub · GNU Octave · Qt for HarmonyOS
MKLab 是一个运行在 HarmonyOS 6.1 及以上 2in1 设备上的数值计算与科学绘图应用。项目以 GNU Octave 为数值计算核心,结合 Qt 6 Widgets、Desktop OpenGL 和 QScintilla,提供接近 MATLAB 工作流的桌面式开发体验。
MKLab 面向需要在 HarmonyOS 设备上进行数值分析、脚本编程和科学绘图的用户。应用保留 Octave 的矩阵计算、脚本和函数生态,同时针对 HarmonyOS 的应用沙箱、文件权限、窗口系统和代码签名模型进行了适配。
| 能力 | 说明 |
|---|---|
| 数值计算 | 基于 GNU Octave,支持矩阵运算、线性代数、统计计算和数值分析 |
| 脚本编辑 | QScintilla 编辑器,支持 .m 脚本、语法高亮和编辑操作 |
| 交互命令 | 内嵌命令窗口,支持历史命令、补全、错误恢复和 clc |
| 工作区管理 | 文件系统、工作区变量、编辑器文件和命令历史集中管理 |
| 科学绘图 | Qt/OpenGL figure,支持二维、三维绘图、中文文本和交互旋转 |
| 文件访问 | 支持 Documents 目录授权和文件夹 URI 持久化 |
| 外观体验 | Fusion、Fusion Dark 和跟随系统主题,支持中英文界面 |
| HarmonyOS 集成 | 原生 HAP、分层图标、权限申请、剪贴板和 2in1 窗口适配 |
- HarmonyOS 2in1 原生 Qt GUI 已完成构建、签名和安装验证;
- 命令窗口可执行交互命令,错误命令不会导致应用退出;
- Documents 文件访问、文件夹授权持久化和剪贴板读取已验证;
- Qt/OpenGL figure、中文绘图文本、点击交互和 Rotate 已验证;
- 构建目标为
arm64-v8a,应用面向2in1设备。
| 项目 | 版本或要求 |
|---|---|
| 宿主系统 | Ubuntu 24.04 |
| HarmonyOS Command Line Tools | 26.0.0.621 |
| HarmonyOS SDK | API 26 |
| 应用兼容版本 | API 23,对应 HarmonyOS 6.1 |
| LLVM / flang | 22.1.8 |
| Qt | Qt 6.12.0-beta2,Desktop OpenGL target |
| Octave | GNU Octave 11.3.0 |
| 目标三元组 | aarch64-unknown-linux-ohos |
| 应用 ABI | arm64-v8a |
| 设备类型 | 2in1 |
默认 HarmonyOS 工具链目录为 ~/Environments/HWCmd,SDK 路径由 scripts/env.sh 设置为 $HWCMD/sdk/default/openharmony。
sudo apt update
sudo apt install -y \
build-essential autoconf automake autoconf-archive libtool libtool-bin \
bison flex gperf texinfo gawk cmake ninja-build pkg-config \
xz-utils unzip zip rsync patchelf libquadmath0 default-jdk \
curl git python3 python3-venv环境准备完成后运行:
bash build-tools/check-environment.sh打包时需要 CJK 字体。可以使用系统中的 Droid Sans Fallback,也可以显式指定:
export MKLAB_CJK_FONT=/absolute/path/to/DroidSansFallbackFull.ttfMKLab/
├── app/ HarmonyOS 入口、权限、图标和 CMake 工程
├── assets/ Logo、UI 图标、Qt 翻译和第三方许可证
├── build-tools/ 公共构建入口、环境检查和发布脚本
├── patches/ Qt、Octave、GLU 的 HarmonyOS 兼容补丁
├── scripts/ 具体构建脚本、编译器包装器和配置模板
├── tests/ Fortran、OpenBLAS/LAPACK 阶段测试
├── vcpkg-triplets/ HarmonyOS arm64 自定义 vcpkg triplet
└── build/ 本地生成目录,不提交 Git
build/ 是本地构建工作区,包含下载的上游源码、编译目录、安装前缀、日志、生成的 DevEco 工程和 HAP,不进入公开仓库。
MKLab 不分发体积较大的上游源码、SDK 或 LLVM 发布包。首次构建前,需要准备:
build/src/octave-11.3.0
build/src/qt5
build/src/llvm-project-22.1.8.src
build/toolchain/LLVM-22.1.8-Linux-X64
build/vcpkg/vcpkg
| 内容 | 来源或版本 |
|---|---|
| GNU Octave | 11.3.0 |
| Qt super-repo | Qt 6.12.0-beta2 |
| LLVM/flang | LLVM 22.1.8 |
| vcpkg | microsoft/vcpkg |
| OpenBLAS | 0.3.34 |
Qt 和 Octave 的 HarmonyOS 改动由 patches/ 中的补丁提供。不要把打过补丁的上游源码目录提交到项目中。
在项目根目录执行:
bash build-tools/check-environment.sh
bash build-tools/build-all.sh完整构建会依次构建数值库、Octave、Qt、绘图库、GUI 和 HarmonyOS HAP。
| 阶段 | 内容 | 主要入口 |
|---|---|---|
| 0 | 检查宿主工具、SDK、flang 和构建准备状态 | build-tools/check-environment.sh |
| 1 | 构建 flang runtime | scripts/build-flang-rt.sh |
| 2 | 构建 OpenBLAS、vcpkg C/C++ 依赖、ARPACK-NG 和 qrupdate-ng | build-openblas.sh、build-deps-vcpkg.sh、build-fortran-deps.sh |
| 3 | 构建 octave-cli 和 Octave 数值核心 | scripts/build-octave-cli.sh all |
| 4 | 构建 Qt host/target 并修复 Qt SONAME | scripts/build-qt.sh all、fix-qt-soname.sh |
| 5 | 构建 GLU、QScintilla 和 Octave Qt GUI | scripts/build-glu.sh、build-qscintilla.sh、build-octave-gui.sh all |
| 6 | 生成入口 .so、DevEco 工程、HAP 并静态验收 | scripts/build-hap.sh all |
需要单独重跑阶段时:
bash build-tools/build-all.sh stage 2
bash build-tools/build-all.sh stage 5
bash build-tools/build-all.sh package
bash build-tools/build-all.sh verify手动使用交叉编译环境时:
source scripts/env.sh
mklab_status
ohos_arm64- flang runtime 与 flang 编译器必须保持 LLVM 22.1.8 版本一致;
- OpenBLAS 必须使用带真实 Fortran LAPACK 的版本,不能被 vcpkg 的
NOFORTRAN同名库覆盖; - Qt target 必须使用 Desktop OpenGL,Octave 的固定功能绘图器依赖 OpenGL 1.x 接口;
- Qt SONAME 应在链接阶段生成,打包阶段不要用
patchelf改写 Qt/Octave 的大型动态表; .oct模块必须位于受 HarmonyOS 签名覆盖的 native 库目录;- 构建脚本默认只生成
arm64-v8a,不包含 x86 或 x86_64 产物。
生成 HAP:
bash build-tools/build-all.sh package产物通常位于:
build/octave-harmonyos-app/entry/build/default/outputs/default/
├── entry-default-unsigned.hap
└── entry-default-signed.hap
没有 DevEco signingConfigs 时只会生成 unsigned HAP;配置调试或发布签名后才会生成 signed HAP。签名材料只保留在本机,不提交 Git。
使用 Windows DevEco Studio 时,将 build/octave-harmonyos-app/ 复制到 Windows,打开工程根目录而不是只打开 entry/,确认 bundleName、API、ABI 和签名配置后执行 Build/Sign。
静态验收:
bash build-tools/build-all.sh verify \
build/octave-harmonyos-app/entry/build/default/outputs/default/entry-default-signed.hapbash tests/phase1/run.sh # Fortran 工具链和数值验证
bash tests/phase2/run.sh # OpenBLAS/LAPACK 数值验证真机回归至少覆盖:
- 应用启动、退出和再次启动;
- 命令窗口交互、历史命令、补全、错误命令恢复和
clc; .m文件打开、编辑、保存和运行;- Documents 权限申请、文件夹 URI 持久化和文件浏览;
- 浅色、深色和跟随系统主题切换;
- 二维 plot、三维 plot、中文文本、figure 点击和 Rotate;
- 剪贴板复制与粘贴。
- 当前使用 API 26 SDK 构建,应用兼容版本为 API 23;正式发布前需要在目标 HarmonyOS 6.1 设备上逐机型验证;
- 普通应用沙箱不提供 Octave 所需的通用 PTY 和任意外部进程环境,
system()等功能受 HarmonyOS 平台限制; mkoctfile和运行期编译型pkg install会生成 native 代码,不属于当前代码签名模型支持的路径;- 当前未集成 gl2ps,OpenGL figure 的打印和矢量导出能力受限;
- SPQR、curl 和完整 terminfo 尚未集成。
MKLab 使用 GNU Octave 作为数值计算核心。Octave、Qt、OpenBLAS、GLU、QScintilla、Oxygen 图标、JetBrains 图标以及 Qt 翻译资源分别遵循其各自的许可证和归属要求。
项目内的第三方许可证文件位于 assets/ 及生成 HAP 的许可证资源目录中。公开发布前,请根据实际分发内容补充项目许可证,并保留所有上游版权声明、许可证文本和源码获取方式。
贡献构建或移植改动前,请阅读 CONTRIBUTING.md。提交前运行:
bash -n build-tools/*.sh
git diff --check
bash build-tools/check-environment.sh