前言
DAY4-10 的目标是围绕"内核与系统接口"做一次完整的命令行工具适配验证闭环 。我们既要在模拟器/真机确认 HNP(Harmony Native Package)构建是否正确,也要用开源终端 Termony 搭建自验证环境,把外部 HNP 集成到 Termony,最终在设备上验证命令行工具能否正常运行。
这篇文章记录我从零搭环境、打包、部署到集成验证的全过程,并总结中间遇到的典型问题与解决方案,供同样在做 OpenHarmony PC 适配的同学参考。
一、准备工作与整体流程
我把任务拆成一个清晰的工程闭环:
-
验证 HNP 是否能独立运行
先在模拟器/真机鸿蒙 PC 上直接跑 HNP,确认包内文件齐全、基本功能可用。
-
搭建 Termony 自验证环境
Termony 是一个开源终端应用,能在设备上提供类 Linux Shell 的交互体验,便于我们集成外部 HNP 并真实运行命令行工具。
-
构建 HNP / 构建 HAP / 部署 HAP
HNP 是命令行工具本体(native/二进制/资源),HAP 是应用壳(Termony),我们需要把 HNP 放进 Termony 的运行环境内,通过 HAP 部署到设备。
-
在设备运行验证 + 记录问题
包括路径、动态库依赖、权限、架构等。
二、第一步:在模拟器/真机验证 HNP 包
2.1 验证目标
重点看三件事:
-
包结构是否完整:bin/lib/share 等是否齐全
-
命令是否可执行:权限位是否正确
-
依赖是否满足:动态库、系统接口是否缺失
2.2 方法建议
如果你的 HNP 内有主可执行文件,比如 mytool,就按以下思路:
-
推包到设备某目录(例如
/data/local/tmp/hnp_test/) -
在设备终端执行
./mytool --help或简单子命令 -
观察:
-
是否 "not found / permission denied"
-
是否 "missing shared library"
-
输出是否符合预期
-
我自己的经验是: 在 Termony 集成前先独立验证 HNP,很容易把问题定位在"工具本体 vs Termony 环境",不然一上来就集成会混淆原因。
三、第二步:Termony 环境搭建(核心)
Termony 的价值在于:
它给我们提供了一个可控的命令行运行容器,能快速试错和验证外部 HNP 的适配情况。
3.1 基本搭建步骤
大体流程:
-
拉取 Termony 源码
-
安装 OpenHarmony/鸿蒙 PC 的开发工具链
-
配置工程依赖(node、hvigor、ohpm 等)
-
编译构建 Termony 的 HNP/HAP
-
部署到模拟器/真机
四、第三步:构建 HNP(命令行工具包)
4.1 构建关注点
构建 HNP 时,我重点关注:
-
目标架构:鸿蒙 PC 一般是 x86_64 / arm64,必须与设备一致
-
动态库路径:尽量让可执行文件通过 rpath 或相对路径找到 lib
-
文件执行权限 :打包时别丢掉
+x
4.2 常见问题与解决
问题1:可执行文件提示 permission denied
-
原因:打包时权限位丢失,或 Termony 解包后权限默认不可执行
-
解决:
-
构建时确保可执行位
-
运行前在 Termony 里
chmod +x
-
问题2:提示缺少动态库
-
原因:lib 目录未被正确打包或路径不在 loader 搜索范围
-
解决:
-
把依赖库完整放入 HNP 的 lib
-
运行前设置
LD_LIBRARY_PATH指向 HNP 的 lib -
或在链接时加入 rpath
-
五、第四步:构建 HAP(Termony 应用壳)
HAP 本质是应用容器:
它负责把 Termony 作为 App 部署到设备,然后让 Termony 在运行时加载 HNP 里的工具。
5.1 构建关键点
-
HAP 需要声明访问文件系统、执行命令所需权限
-
资源目录路径要与 Termony 运行逻辑一致
-
外部 HNP 的挂载位置必须明确(后面集成会用到)
六、第五步:把外部 HNP 集成到 Termony
这是 DAY4-10 的重点之一。
6.1 集成目标
做到两件事:
-
Termony 能识别并加载外部 HNP
-
在 Termony 内输入命令可以直接运行外部 HNP 工具
6.2 集成思路(设计层)
我总结成一句话:
把 HNP 当成 Termony 的一个"外置命令集",通过统一入口挂载到 Termony 的 PATH 上。
落地就是:
-
外部 HNP 放到 Termony 可访问目录
-
Termony 启动时扫描该目录
-
将
hnp/bin加入 PATH -
如有动态库再把
hnp/lib加入 LD_LIBRARY_PATH
6.3 实操步骤(简化版)
假设外部 HNP 存放在:
/data/storage/el2/base/haps/entry/files/hnp_ext/
在 Termony 初始化脚本中加入类似逻辑:
export PATH=$PATH:/data/storage/el2/base/haps/entry/files/hnp_ext/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/storage/el2/base/haps/entry/files/hnp_ext/lib
这样 Termony 里直接输入 mytool 就能跑。
6.4 我遇到的两个坑
坑1:HNP 路径在不同设备/版本不一致
-
现象:模拟器 OK,真机找不到
-
原因:沙箱路径不同,应用 files 目录位置带随机段
-
解决:
-
不写死路径,改成程序动态获取 App files 路径
-
或把 HNP 复制到 Termony 约定的外置目录
-
坑2:工具能跑但部分命令报系统接口不支持
-
原因:OpenHarmony PC 的系统接口还不完全等价 Linux,部分 syscall/接口缺失
-
解决:
-
确认工具是否可降级功能
-
替换为更轻量的实现
-
或在源码层做接口适配
-
七、最终验证与结果
完成以上步骤后,我在 Termony 内验证:
-
mytool --help能正常打印帮助 -
常用子命令可执行
-
若含动态库依赖,库加载无报错
-
多次启动 Termony,外部 HNP 仍可被自动识别
到此,形成了一个可复用的 HNP→Termony→设备自验证链路。
总结
DAY4-10 的收获不仅是把 Termony 跑起来,更重要的是建立了适配验证的方法论:
-
先独立验证 HNP,再集成 Termony
-
用 Termony 构建"真实设备上的命令行沙箱"
-
集成关键是 PATH + LD_LIBRARY_PATH + 路径抽象
-
遇到问题优先拆分定位:
"包结构/权限/架构/依赖/系统接口 哪一层出错"
后续如果要适配更多命令行工具,只需复用这个链路即可快速验证,大幅减少试错成本。