欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/

欢迎在 PC 社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper

适配开源地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_msys2

一、为什么要适配 MSYS2

MSYS2 在 Windows 开发者群体中承担着一项很具体的工作:把 shell、GNU 命令、归档工具和软件包生态组织成一套可以直接使用的类 Unix 环境。很多跨平台项目的构建脚本、文本处理流程和源码整理工作,都默认开发者手边有 bashgrepsedtarsha256sum 这类工具。鸿蒙 PC 已经具备完整的桌面交互和 Native 开发能力,但在开发者工具侧,仍需要更多能够承接传统命令行习惯的原生应用。

适配 MSYS2 的意义并不是在鸿蒙 PC 上复制一个 Windows 兼容层,而是验证另一条更现实的路径:在 HarmonyOS 应用模型和安全边界内,保留终端最有价值的交互方式,补齐文件处理、文本管道、脚本控制、归档校验等高频工作流,并为后续扩展开发工具链打下基础。对平台而言,这类项目还能同时检验 ArkUI、Native C++、NativeChildProcess、应用沙箱、网络与加密 Kit、交叉编译和 HAP 交付等多个环节。

MSYS2 上游长期围绕 Windows、Cygwin/MSYS runtime 和 PE 程序组织,不能把现有目录原封不动复制到 HarmonyOS 后直接运行。本次适配因此采用分层方案:一方面用 OpenHarmony Native SDK 交叉编译 Bash 5.3 和 Coreutils 9.5,形成可审计的 aarch64 OHOS ELF;另一方面提供一个可安装的终端 HAP,通过 ArkTS 前端、NativeChildProcess 和内置 sandbox shell 跑通常用命令。当前版本的 BundleName 为 com.msys2.terminal,目标 ABI 为 arm64-v8a,兼容与目标 SDK 均为 HarmonyOS 6.0.2(22)

二、先划清平台边界:不能照搬 Windows 发行版

MSYS2 的桌面体验建立在几个紧密关联的部分之上:MSYS runtime 提供 POSIX 兼容语义,mintty 提供终端,pacman 负责软件包数据库和依赖事务,大量程序则以 Windows PE 形式交付。HarmonyOS PC 普通应用运行在独立沙箱中,安装包、可执行文件、进程创建和数据目录均有明确约束。这意味着适配工作的第一步不是修改界面,而是重新确定哪些能力可以保持原有语义,哪些能力必须换成平台原生实现。

当前工程将适配链路拆成四层:

层次需要解决的问题当前实现
交叉编译层GNU Autoconf 不识别 OHOS,目标 libc 为 musl使用 SDK clang、sysroot 和 aarch64-linux-ohos 目标编译 Bash/Coreutils
应用执行层普通 HAP 不能按桌面方式任意执行数据区程序使用官方 NativeChildProcess 启动 libmsys_child.so 中的 native child
shell 能力层命令之间需要保持工作目录、环境变量和脚本状态在 C++ 中实现 sandbox shell,并由 ArkTS 维护会话状态
交付与交互层需要可签名安装、可输入、可滚动的桌面终端窗口使用 ArkUI 构建终端式前端,以 HAP 交付到鸿蒙 PC

这里需要特别说明:仓库中的 ohos-port/out/bashohos-port/out/coreutils 是已经通过架构审计的原生产物,证明 GNU 用户态程序能够按 OHOS musl ABI 交叉编译;真机 HAP 当前采用的稳定执行路径则是内置 sandbox shell。两条路径分别解决“原生工具能否产出”和“普通应用中能否形成可靠终端工作流”两个问题,不能把后者描述成完整 MSYS2 发行版已经无差别运行。

三、鸿蒙版本的工程结构

仓库保留了 MSYS2 上游的包配方和安装器资料,鸿蒙适配集中在 ohos-port/ 中:

ohos_msys2/
├── MINGW-packages/                         # 上游 MinGW 包配方资料
├── MSYS2-packages/                         # 上游 MSYS 包配方资料
├── msys2-installer/                        # 上游安装器与图标资源
└── ohos-port/
    ├── build-ohos.sh                       # 交叉编译 Bash 5.3 和 Coreutils 9.5
    ├── audit-bin.sh                        # 审计 ELF、架构、解释器与动态库依赖
    ├── out/
    │   ├── bash                            # aarch64 OHOS PIE 可执行文件
    │   └── coreutils                       # Coreutils single-binary 产物
    └── terminal-app/
        ├── AppScope/                       # 应用级配置和图标
        ├── entry/src/main/ets/pages/
        │   └── Index.ets                   # 终端 UI、历史记录与会话状态
        ├── entry/src/main/cpp/
        │   ├── napi_init.cpp               # ArkTS 与 NativeChildProcess 桥接
        │   └── msys_child.cpp              # sandbox shell、命令及平台 Kit 接入
        ├── evidence/                       # 真机布局与功能验证材料
        └── reports/                        # 验收、签名与完成度报告

一次命令从输入到返回的路径如下:

ArkUI TextInput
    └── taskpool 工作线程
          └── NAPI runNativeChildSync
                └── OH_Ability_StartNativeChildProcess
                      └── libmsys_child.so:MSYS2ChildMain
                            └── sandbox shell 解析与命令执行
                                  └── stdout/stderr 经管道返回页面

ArkTS 层保存 HOMEPWDPATH 等会话数据,命令在后台 taskpool 中执行,避免长任务阻塞 UI。Native child 侧为单次执行设置 120 秒超时,并把输出上限控制在 1 MiB;工作目录与环境变量变化会通过内部标记返回页面,供下一条命令继续使用。这个设计让应用保持了终端会话的连续感,同时没有把长期阻塞工作放在界面线程中。

四、真机上的五个核心功能验证

以下五张截图均采集自已连接的 HarmonyOS PC 真机,屏幕分辨率为 3120×2080。测试 HAP 在写作过程中重新安装并启动,命令与结果均来自设备端应用实际执行,而不是预先排版的示意图。

1. 终端窗口能够正常安装和启动

应用启动后直接进入黑底终端界面,窗口标题为“MSYS2 终端”,首行显示 MSYS2 UCRT64 on HarmonyOS PC,底部提供 user@harmony MSYS ~ 风格的提示符和命令输入区。

在这里插入图片描述

这一屏验证了签名 HAP 的安装、Stage 模型 Ability 启动、桌面窗口渲染和输入区域初始化。界面没有把功能拆成一组演示按钮,用户进入应用后面对的就是持续可用的终端工作区。标题中的 UCRT64 用于延续 MSYS2 的终端识别习惯,当前目标二进制实际遵循 OHOS aarch64/musl ABI。

2. 检查目标平台、工作目录和命令版本

在真机中依次执行 uname -apwdwhoamigit --versiondate。返回结果显示当前平台为 HarmonyOS harmony-pc aarch64,工作目录位于应用的 files/home 沙箱中,Git 源码快照兼容层报告 2.45.0.harmony-shim

在这里插入图片描述

这一步把平台、身份和运行边界放在同一组结果中。pwd 返回的不是开发机路径,也不是写在页面里的固定字符串,而是当前 HAP 在设备侧实际获得的可写 home 目录。

3. 文件写入、管道和文本统计形成闭环

测试先创建 article_demo 目录,再使用 printf 写入五行文本。随后通过 cat | sort | uniq -c 完成管道传递、排序与计数,并用 wc -lls -l 检查文件行数及目录内容。

在这里插入图片描述

输出中 alphabeta 各出现两次,gamma 出现一次,文件总行数为五。这里同时覆盖了目录创建、重定向、转义换行、管道、文本过滤和文件状态查询,是日常命令行处理中最常见的一条工作链路。

4. 验证环境变量、控制流和 source 会话状态

终端先导出 PORT_NAME=HarmonyOS_PC,随后在 for 循环中读取变量并生成三条任务记录;接着用 if [ -f ... ] 判断上一步创建的文件是否存在。最后把 CHANNEL=atomgit 写入脚本,通过 source 加载,再用 env | grep 读取会话变量。

在这里插入图片描述

三次循环都正确展开了序号和平台名称,文件判断返回 file-readysource 后的变量也延续到后续命令。这说明当前实现不只是逐条调用若干独立工具,shell 会话所依赖的工作目录和环境状态同样能够连续传递。

5. 归档、摘要与解包后内容一致性校验

最后将测试目录打包为 article_demo.tar.gz,真机能够识别 gzip 格式并计算 SHA-256 摘要。归档解开后,使用 cmp 比较原文件与恢复文件,终端返回 archive-restore-verified

在这里插入图片描述

这组结果覆盖了 tar 归档、gzip 压缩、CryptoArchitectureKit 摘要计算和字节级比较。摘要值来自本次真机生成的归档,恢复后的 items.txt 与打包前内容一致,因此验证的不是“命令名称存在”,而是一条完整的数据处理闭环。

五、适配过程中最棘手的几个问题

难点一:MSYS2 的上游运行模型与 HarmonyOS 应用模型不同

MSYS2 并不是一批孤立的 GNU 工具,它依赖 Windows 进程模型、MSYS runtime、mintty、软件包数据库和大量 PE 程序。HarmonyOS PC 的普通 HAP 则运行在应用沙箱中,不能继承桌面 MSYS2 对文件系统和任意程序执行的假设。直接搬运目录,即使文件都在,也不会自然得到可用终端。

项目因此没有伪装成完整发行版,而是优先抽取用户真正需要的命令流:文件操作、文本处理、重定向与管道、脚本控制、归档校验和基础网络下载。上游包配方仍保留在仓库中作为后续适配资料,但没有把 pacman、完整编译工具链或 Windows 程序执行描述为当前已完成能力。

难点二:GNU Autoconf 不认识 OHOS 目标三元组

Bash 和 Coreutils 的构建配置主要面向传统 Unix 平台,部分 config.sub 不能直接识别 OHOS。构建脚本使用 aarch64-linux-ohos 作为 clang 的真实目标,同时在 Autoconf 层以等价的 aarch64-linux-musl 完成 host 探测,并显式指定交叉编译时无法运行测试程序的缓存结果。

Coreutils 还涉及 gnulib 对 libc 内部结构的假设。OHOS 使用 musl,工程通过 SLOW_BUT_NO_HACKS 选择 gnulib 预留的可移植路径,并关闭当前不需要的 SELinux、ACL、xattr、libcap 等构建项。最终 Bash 与 Coreutils 均为 ELF64 AArch64 PIE,解释器是 /lib/ld-musl-aarch64.so.1,动态依赖收敛到 libc.so,已经通过 audit-bin.sh 审计。

难点三:数据区程序不能沿用桌面环境的任意 exec 方式

普通应用沙箱对可执行文件来源和进程创建有严格限制。早期如果按桌面应用的思路把工具复制到数据区后直接 posix_spawn,会在真机上遇到权限阻断。当前稳定路径改用 HarmonyOS 官方 OH_Ability_StartNativeChildProcess,从已经随 HAP 签名打包的 libmsys_child.so 进入 MSYS2ChildMain

ArkTS 只负责收集命令、展示输出和维护会话,真正的解析与执行发生在 native child 中。stdout 和 stderr 通过具名文件描述符管道回传,异常退出、超时和输出过大也有明确保护。这样既遵守了平台的进程边界,又避免同步 Native 任务冻结终端界面。

难点四:一次一进程,仍要让终端表现为连续会话

每条命令由独立 native child 处理时,进程内的 chdir()export 会随着子进程退出而消失;如果不额外处理,用户执行 cd 后下一条 pwd 仍会回到旧目录,source 加载的变量也无法保留。

项目把 cwd 和环境变量作为显式会话状态保存在 ArkTS 页面中,执行前传入 child,执行后再解析 native 层返回的目录与环境标记。前端更新状态后,下一条命令继续使用新的 PWD 和变量集合。截图中的 export、循环变量展开与 source 结果,正是这一机制在真机上的直接表现。

难点五:高频命令背后对应不同的平台能力

终端里看似简单的 sha256sumcurlwgettarunzip,在普通 HAP 中并不能都依赖外部程序。当前摘要计算接入 CryptoArchitectureKit,HTTPS GET 接入 libnet_http,gzip 使用系统 zlib,tar/zip 的常用路径则在 native 层实现。这样可以让基础工作流在签名应用边界内运行,但也意味着参数兼容范围必须被清楚限定,不能把这些 shim 描述成上游工具的完整替代。

六、构建、安装与运行

本项目为 ArkTS + Native C++ 原生 HarmonyOS 工程。开发机需要安装 DevEco Studio、HarmonyOS/OpenHarmony SDK 以及构建脚本使用的基础 GNU 工具。

首先交叉编译 Bash 和 Coreutils:

cd ohos_msys2
bash ohos-port/build-ohos.sh all

脚本默认使用 DevEco Studio 中的 OpenHarmony Native SDK,输出位于:

ohos-port/out/bash
ohos-port/out/coreutils

随后执行目标架构和依赖审计:

bash ohos-port/audit-bin.sh

审计会检查文件体积、ELF64、AArch64、musl loader 以及 NEEDED 动态库白名单。只有审计通过的目标产物才可进入后续交付流程。

构建终端 HAP:

cd ohos-port/terminal-app

DEVECO_SDK_HOME=/Applications/DevEco-Studio.app/Contents/sdk \
/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw \
assembleHap --no-daemon

签名产物位于:

entry/build/default/outputs/default/entry-default-signed.hap

连接鸿蒙 PC 真机后安装并启动:

hdc list targets
hdc install -r entry/build/default/outputs/default/entry-default-signed.hap
hdc shell aa start -b com.msys2.terminal -m entry -a EntryAbility

应用打开后即可直接在底部输入命令。当前 home 目录由应用运行时创建在自身 files/home 中,归档、下载文件和脚本均应保存在该沙箱范围内。

七、当前功能边界

当前版本已经在 HarmonyOS PC 真机上跑通:

  • HAP 签名安装、Ability 启动和桌面终端窗口;
  • 命令输入、历史记录、长输出滚动和文本复制;
  • cdpwd、环境变量与会话状态延续;
  • ;&&||、管道、输入输出重定向和基础 glob;
  • 基础 ifforwhilecase、函数、here-doc 与 source
  • 常用文件与文本命令,包括 lscatcpmvgrepsortuniqsedawkwc 等;
  • tar、gzip、zip、unzip、SHA-256/SHA-1/MD5 和常用二进制查看命令;
  • 基础 HTTPS 下载,以及公开 GitHub 仓库的源码快照获取 shim;
  • Bash 5.3 与 Coreutils 9.5 的 OHOS aarch64 交叉编译和 ELF 审计。

同时,当前版本没有把以下能力作为已完成范围:

  • 真实 pacman 包数据库、镜像同步、依赖解析和安装事务;
  • 完整 Bash 语义、完整 PTY、job control、fg/bg 和交互式 Ctrl+C;
  • vimtop 等全屏 TUI 程序;
  • 完整 Git 对象库、提交、推送、拉取、私有仓库和 SSH 凭据链路;
  • 在 HAP 内运行完整 GCC/Clang、Make、Python、Perl 等外部工具链;
  • 任意 Windows PE 程序或任意下载 ELF 的直接执行;
  • curl/wget/tar/zip 全参数兼容以及所有压缩格式和边界情况。

因此,当前成果更准确的定位是“面向 HarmonyOS PC 普通应用沙箱的 MSYS2 风格终端基础版”。它已经覆盖日常文件、文本和脚本工作流,也验证了 GNU 工具的 OHOS 交叉编译路径,但不等同于 Windows 上完整 MSYS2 发行版的逐项等价迁移。

八、总结

MSYS2 的鸿蒙 PC 适配说明,迁移开发者工具时最重要的不是保留所有原有目录,而是先辨认真正的平台契约。Windows PE、MSYS runtime、mintty 和 pacman 共同构成了上游发行版;HarmonyOS 侧则有 HAP 签名、应用沙箱、NativeChildProcess 和平台 Kit。只有承认两套运行模型的差异,才能做出能够长期演进的工程,而不是一个只能展示界面的空壳。

当前项目已经建立了两条可验证的技术链路:Bash/Coreutils 能够使用 OHOS Native SDK 生成通过审计的 aarch64 musl ELF;终端 HAP 则能在真机上通过 NativeChildProcess 执行连续的 sandbox shell 会话。安装启动、平台查询、文件管道、脚本控制、归档摘要和恢复比对五组实测结果表明,应用已具备可用的核心命令行工作流。

后续如果继续推进,重点不应只是增加更多命令名称,而应围绕 PTY、可中断长任务、真实软件包体系、外部工具可信交付和完整源码管理逐层扩展。当前版本把边界和基础设施都留在了清晰位置,也为其他需要迁移到鸿蒙 PC 的原生开发工具提供了一种可复用的方法:先完成目标 ABI 和进程模型适配,再用真机上的真实数据流验证每一层是否闭环。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐