1. 背景

近日,我在访问rust-lang.org时注意到,现已推出了适用于OpenHarmony(OHOS)平台的Rust版本。出于兴趣与探索目的,我决定下载并尝试使用这一版本。

在成功获取到rust-beta-aarch64-unknown-linux-ohos.tar.xz文件后,却发现无法直接通过鸿蒙操作系统上的tar xJf命令来解压缩该文件,提示系统中缺失xz工具。为了解决问题并增强鸿蒙PC环境下对.tar.xz格式文件的支持能力,我着手进行了xz命令及相关组件向该平台的移植工作。本文旨在分享此次通过交叉编译方式移植xz命令过程中的具体步骤与经验总结,希望能够为其他开发者提供参考和帮助。

2. 编译环境准备

2.1 交叉编译说明

本次移植使用的是交叉编译的方式。交叉编译是指“在A架构(宿主主机,如x86_64 Linux)编译出能在B架构(目标设备,如鸿蒙PC)运行的程序”。

比如:本次移植xz命令,就是在x86_64的Linux主机(Ubuntu 24.04)上编译出能在aarch64架构HarmonyOS系统的鸿蒙PC上运行的程序,这就是典型的交叉编译。Windows系统通过WSL安装Ubuntu 24.04环境可以参考这篇文章:《在 Windows 10 上安装和使用 WSL 2 安装 Ubuntu24详细指南》。

2.2 安装常见依赖工具

为了减少移植适配过程中可能遇到的命令缺失问题,我们先通过下面2条命令完成常见依赖工具的安装,会省去很多潜在的麻烦。

# 更新软件源
sudo apt update

# 安装必备开发工具
sudo apt install -y curl git vim gcc g++ make pkg-config autoconf automake patch libtool autopoint gperf tcl8.6-dev wget unzip gccgo-go flex bison premake4 python3 python3-pip ninja-build meson sox gfortran subversion build-essential module-assistant gcc-multilib g++-multilib libltdl7-dev cabextract libboost-all-dev libxml2-utils gettext libxml-libxml-perl libxml2 libxml2-dev libxml-parser-perl texinfo xmlto po4a libtool-bin yasm nasm xutils-dev libx11-dev xtrans-dev

2.3 下载配置OHOS SDK

为了保持目录整洁,我们所有的工具、脚本等都放在工作目录:~/harmonypc下:

# 创建鸿蒙pc命令行移植的工作目录
mkdir ~/harmonypc

2.3.1 下载OHOS SDK

通过交叉编译的方法编译鸿蒙pc版的命令,需要下载OHOS SDK(就是我们所说的工具链)。可以到openharmony ci的每日构建页,找到ohos-sdk下载最新版本即可。

这里提供一个20250819构建的ohos-sdk-full_ohos下载地址,可以直接使用wget命令下载。

# 进入工作目录
cd ~/harmonypc

# 下载ohos sdk
wget https://cidownload.openharmony.cn/version/Master_Version/ohos-sdk-full_ohos/20250819_020817/version-Master_Version-ohos-sdk-full_ohos-20250819_020817-ohos-sdk-full_ohos.tar.gz

下载完成后,使用tar命令解压sdk:

# 解压ohos sdk
tar xf version-Master_Version-ohos-sdk-full_ohos-20250819_020817-ohos-sdk-full_ohos.tar.gz

解压完成后,会得到ohos-sdk目录。

进入ohos-sdk/linux下,使用unzip命令解压native和toolchains两个zip包。

cd ~/harmonypc/ohos-sdk/linux/

# 解压native
unzip -q native-linux-x64-6.0.0.46-Beta1.zip

# 解压toolchains
unzip -q toolchains-linux-x64-6.0.0.46-Beta1.zip

如下图所示,解压完成后,得到native和toolchains两个目录。

2.3.2 配置环境变量

SDK解压完成之后,配置交叉编译必备的环境变量。

export OHOS_SDK=~/harmonypc/ohos-sdk/linux
export PATH=${OHOS_SDK}/native/llvm/bin:${OHOS_SDK}/native/build-tools/cmake/bin:$PATH
export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos"
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export CFLAGS="-fPIC -D__MUSL__=1"
export CXXFLAGS="-fPIC -D__MUSL__=1"

如下图所示,环境变量设置完成之后,执行$CC -v命令可以查询到clang的版本号,就说明设置成功了。

到此为止,编译环境就全部准备就绪,接下来就可以进行编译移植了。

3. 编译xz命令集

3.1 下载xz源码

xz源码的原始仓库维护在github上,我已经mirror到AtomGit平台,地址是https://atomgit.com/oh-tpc/xz

通过git命令将其下载到本地:

git clone https://atomgit.com/oh-tpc/xz.git -b v5.8

3.2 生成Makefile

xz支持2种编译框架:automake+configure+makecmake+make。这里,我们以cmake为例,进行编译。

先生成Makefile,命令如下:

mkdir build
cd build
cmake ..

3.3 make编译

cmake成功之后,会生成Makefile,执行make命令即可触发编译。

如下图所示,编译成功后得鸿蒙PC(aarch64)架构的xz命令。

4. 测试运行

在Linux系统下交叉编译得到了可运行的xz命令,我们需要将其拷贝到鸿蒙PC上运行。可以通过U盘等传统方式(鸿蒙PC只有type-c口,如果USB-A口的U盘需要通过hub或者转接口等方式连接到鸿蒙PC)进行拷贝。

如果linux电脑和鸿蒙PC在同一个局域网下,也可以在linux系统开启一个httpserver,然后在鸿蒙PC上使用wget或者curl等命令进行下载。推荐大家使用这种方法,比较简单、高效、方便。下面演示一下方法。

4.1 Linux电脑上开启httpserver

如下图所示,我们在xz的产物目录下,执行python3 -m http.server命令即可以该目录作为根目录,在8000端口启动一个http server。

4.2 鸿蒙pc上下载文件

我的Linux电脑和鸿蒙PC已经连到同一个路由器,在同一局域网内。

  • Linux电脑IP:192.168.1.25
  • 鸿蒙PC IP:192.168.1.37

使用curl http://192.168.1.25:8000/xz -o xz命令即可将Linux电脑上的xz下载到鸿蒙PC上了。

4.3 binary-sign-tool自签名

使用chmod +x xz命令为xz命令增加可执行权限之后,尝试运行,依然提示无权限。是因为需要先对其进行自签名。命令如下:

binary-sign-tool sign -inFile xz -outFile xz -selfSign "1"

如上图所示,自签名之后,xz命令就可以正常执行了。

4.4 测试解压tar.xz文件

接下来,需要将xz命令所在目录添加到PATH环境,以便于让tar命令能找到并调用它来进行xz格式的解压缩。命令如下所示:

export PATH=~/bin:$PATH

如上图所示,tar xJf命令成功解压了tar.xz格式的压缩包,测试运行成功。

5. 总结

本次向OpenHarmony PC平台移植xz命令的实践,核心解决了该平台缺失.tar.xz格式解压能力的痛点。整个过程的核心难点在于适配鸿蒙专属的编译环境与权限管理机制——通过精准配置OHOS SDK环境变量、选用适配性更强的cmake编译框架,有效规避了跨平台编译中的工具链兼容问题;而binary-sign-tool自签名步骤的实施,则精准破解了鸿蒙系统对第三方二进制文件的权限限制,这也是鸿蒙平台移植工具类软件需重点关注的核心要点。

此次实践也让我们看到,鸿蒙生态的完善需要开发者通过实际需求驱动的技术探索不断补全短板,而这类常用命令行工具的移植实践,正是构建更具包容性的鸿蒙生态的重要基石。

最后,欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/ 一起参与鸿蒙PC的生态建设。

Logo

赋能鸿蒙PC开发者,共建全场景原生生态,共享一次开发多端部署创新价值。

更多推荐