OpenHarmony 跨端生态适配全指南
前言
OpenHarmony(鸿蒙)的生态建设日趋完善,主流跨端开发框架、海量三方库均已完成标准化鸿蒙化适配。官方提供了通用 C/C++ 库的标准化适配模板,从移动端跨端开发到 PC 端工具适配,从纯业务层开发到底层 C/C++ 库移植,形成了完整的鸿蒙化适配体系。本文将梳理 Flutter、RN、Cordova、Electron 等跨端框架的鸿蒙适配现状,以及通用 C/C++ 三方库鸿蒙化的标准化实施方案,同时补充仓颉语言的三方库生态。
本文介绍 OpenHarmony 跨端生态适配方案,涵盖 Flutter、RN、Cordova、Electron 等框架及通用 C/C++ 库、仓颉语言。重点阐述 C/C++ 库仅需 6 个文件即可标准化适配的流程,包括 HPKBUILD 构建脚本与测试校验。提供各框架官方仓库地址及适配优先级建议,帮助开发者低成本迁移至鸿蒙生态。
OpenHarmony(鸿蒙)的生态建设日趋完善,主流跨端开发框架、海量三方库均已完成标准化鸿蒙化适配。官方提供了通用 C/C++ 库的标准化适配模板,从移动端跨端开发到 PC 端工具适配,从纯业务层开发到底层 C/C++ 库移植,形成了完整的鸿蒙化适配体系。本文将梳理 Flutter、RN、Cordova、Electron 等跨端框架的鸿蒙适配现状,以及通用 C/C++ 三方库鸿蒙化的标准化实施方案,同时补充仓颉语言的三方库生态。
鸿蒙的移动端生态中,目前市面主流的跨端开发框架均已推出专属鸿蒙适配版本(XX-OH),所有适配版本均完成了鸿蒙系统的底层兼容、API 映射,开发者可以低成本将原有跨端项目迁移至鸿蒙。
鸿蒙不仅覆盖移动端,也完成了 PC 端(桌面版)的生态布局,核心分为「Electron 桌面应用适配」和「PC 命令行工具鸿蒙化」两大方向。
核心结论:任何一款 C/C++ 三方库,仅需 6 个文件即可完成完整的鸿蒙化适配,无多余文件,标准化程度拉满。 适配核心:鸿蒙官方提供了标准化的 C/C++ 库适配模板 + 编译规范,统一采用「交叉编译」+「GN 编译」的方式完成移植。 参考规范:https://gitcode.com/openharmony-tpc/tpc_resource#cc%E8%AF%AD%E8%A8%80
这是本次指南的核心内容,鸿蒙的底层能力、三方库生态均依赖 C/C++ 库的支撑,官方对 C/C++ 库的鸿蒙化适配做了极致标准化的定义,所有适配工作均围绕「固定 6 个文件」展开。
所有 C/C++ 三方库的鸿蒙化适配,最终产出物固定为 6 个文件,缺一不可,文件清单及作用如下:
├── HPKBUILD # 核心文件:编译构建脚本(configure/cmake/make 编译逻辑、交叉编译配置、打包安装)
├── HPKCHECK # 测试校验脚本:定义鸿蒙设备端的测试逻辑、日志输出、用例执行
├── README.OpenSource # 开源声明文件:必填,标注库的开源协议、版权信息、源码来源
├── README_zh.md # 中文说明文档:适配说明、编译步骤、使用方式、注意事项
├── SHA512SUM # 可选:源码包哈希校验文件,校验下载的源码完整性,无需校验可忽略
└── xxx_oh_pkg.patch # 补丁文件:源码兼容补丁,解决鸿蒙系统的编译报错、路径兼容、接口兼容等问题,按需添加
所有文件的标准模板均由鸿蒙官方维护,直接 fork 修改即可,无需从零编写:
HPKBUILD 是 Shell 编写的标准化编译构建脚本,也是 C/C++ 库鸿蒙化的核心,该文件定义了:库的基础元信息、源码下载地址、交叉编译环境配置、编译构建逻辑、打包安装路径、测试准备、环境清理等所有核心流程。
# This is an example HPKBUILD file. Use this as a start to creating your own,
# and remove these comments.
# NOTE: Please fill out the license field for your package! If it is unknown,
# then please put 'unknown'.
pkgname=NAME # 库名,必填
pkgver=VERSION # 库版本,必填
pkgrel=0 # 发布号,固定为 0 即可
pkgdesc="" # 库功能描述,必填
url="" # 库官网地址,必填
archs=("armeabi-v7a" "arm64-v8a") # 鸿蒙主流 CPU 架构,固定这两个即可
license=() # 开源协议,必填
depends=() # 运行依赖库,无则留空,依赖库需适配同架构
makedepends=() # 编译依赖工具,无则留空
source="https://downloads.sourceforge.net/$pkgname/$pkgname-$pkgver.tar.gz" # 源码下载链接
downloadpackage=true # 是否自动下载源码包,默认 true
autounpack=true # 是否自动解压源码包,默认 true
buildtools=# 编译方式,支持 cmake/configure/make,必填
builddir=# 源码解压后的目录名
packagename=$builddir.tar.gz # 源码包文件名
# 编译前环境准备:创建目录、设置环境变量、源码预处理
prepare(){
cd $builddir
cd ${OLDPWD}
}
# 核心编译逻辑:交叉编译核心步骤,架构判断、编译命令执行
build(){
cd $builddir
${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L
make -j4 -C $ARCH-build
ret=$?
cd $OLDPWD
return $ret
}
# 打包安装:将编译产物安装到鸿蒙指定目录
package(){
cd $builddir
make -C $ARCH-build install
cd $OLDPWD
}
# 测试说明:鸿蒙设备端测试的前置说明
check(){
echo "The test must be on an OpenHarmony device!"
}
# 环境清理:编译完成后清理构建产物
cleanbuild(){
rm -rf ${PWD}/$builddir
}
pkgname=fftw3
pkgver=3.3.10
pkgrel=0
pkgdesc="FFTW is a C subroutine library for computing the discrete Fourier transform..."
url="http://fftw.org/"
archs=("armeabi-v7a" "arm64-v8a")
license=("GPL-2.0-or-later")
depends=()
makedepends=()
source="http://fftw.org/fftw-${pkgver}.tar.gz"
autounpack=true
downloadpackage=true
buildtools="configure"
builddir=fftw-$pkgver
packagename=$builddir.tar.gz
prepare(){
mkdir -p $builddir/$ARCH-build
if [ $ARCH == "armeabi-v7a" ]; then
setarm32ENV host=arm-linux
fi
if [ $ARCH == "arm64-v8a" ]; then
setarm64ENV host=aarch64-linux
fi
optargs="--enable-single --with-slow-timer"
}
build(){
cd $builddir/$ARCH-build
PKG_CONFIG_LIBDIR="${pkgconfigpath}" ../configure "$@$optargs" \
--enable-threads --enable-shared --host=$host >$buildlog 2>&1
$MAKEVERBOSE=1 >>$buildlog 2>&1
ret=$?
cd $OLDPWD
return $ret
}
package(){
cd $builddir/$ARCH-build
$MAKEVERBOSE=1 install >>$buildlog 2>&1
cd $OLDPWD
if [ $ARCH == "armeabi-v7a" ]; then unsetarm32ENV; fi
if [ $ARCH == "arm64-v8a" ]; then unsetarm64ENV; fi
unset host optargs
}
check(){
cd $builddir/$ARCH-build
sed -i '/.*check-local: bench$(EXEEXT)/c\check-local: #bench$(EXEEXT)' tests/Makefile
sed -i "s#/usr/bin/sed#sed#g" tests/bench
sed -i "s#/bin/bash#/data/CIusr/bin/bash#g" tests/Makefile tests/bench
cd $OLDPWD
echo "The test must be on an OpenHarmony device!"
}
cleanbuild(){
rm -rf ${PWD}/$builddir
}
# Copyright (c) 2023 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
pkgname=tassl
pkgver=1.1.1
pkgrel=0
pkgdesc="TASSL is an SSL/TLS protocol implementation that supports national secret algorithms"
url="https://github.com/jntass/TASSL-1.1.1"
archs=("armeabi-v7a" "arm64-v8a")
license=("OpenSSL")
depends=(openssl_1_1_1w zlib_1_3_1)
makedepends=()
commitId="a30d107669fdf7d6909b10f1e179de4aaff38ff5"
source="https://github.com/jntass/$pkgname-$pkgver/archive/$commitId.zip"
autounpack=true
downloadpackage=true
buildtools="configure"
builddir=TASSL-${pkgver}-$commitId
packagename=$builddir.zip
prepare(){
if $patchflag; then
cd $builddir
patch -p1 <`pwd`/../tassl_oh_pkg.patch >>$publicbuildlog 2>&1
patchflag=false
cd $OLDPWD
fi
cp $builddir${builddir}-${ARCH}-build -rf
if [ $ARCH == "armeabi-v7a" ]; then setarm32ENV; fi
elif [ $ARCH == "arm64-v8a" ]; then setarm64ENV; fi
else echo "${ARCH} not support"; return -1; fi
}
build(){
cd $builddir-$ARCH-build
./config "$@" no-asm >$buildlog 2>&1
$MAKE >>$buildlog 2>&1
ret=$?
cd $OLDPWD
return $ret
}
package(){
cd $builddir-$ARCH-build
mkdir -p ${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}/
$MAKE install >>$buildlog 2>&1
cd $OLDPWD
}
check(){
if [ $ARCH == "armeabi-v7a" ]; then unsetarm32ENV; fi
elif [ $ARCH == "arm64-v8a" ]; then
cd $builddir-$ARCH-build
sed -i.bak "s|PERL=/usr/bin/perl|PERL=/data/CIusr/bin/perl|g" ./Makefile
maketest >>$buildlog 2>&1
cd $OLDPWD
unsetarm64ENV
else
echo "${ARCH} not support"; return -1; fi
echo "The test must be on an OpenHarmony device!"
}
cleanbuild(){
rm -rf $builddir-$ARCH-build $packagename$builddir
}
该文件是鸿蒙化适配的测试标准文件,定义了 C/C++ 库在鸿蒙设备端的测试逻辑,所有库的 HPKCHECK 结构一致,仅需修改测试命令即可。
# This is an example HPKCHECK file. Use this as a start to creating your own,
# and remove these comments.
source HPKBUILD > /dev/null 2>&1
logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log
checkprepare(){
return 0
}
openharmonycheck(){
res=0
cd ${builddir}/${ARCH}-build
ctest >${logfile} 2>&1
res=$?
cd $OLDPWD
return $res
}
README.OpenSource:固定格式,填写库名、版本、开源协议、源码地址即可;README_zh.md:填写编译步骤、适配说明、使用方式,无固定格式;SHA512SUM:可选,无需校验则不创建,需要则生成源码包的 sha512 哈希值即可;xxx_oh_pkg.patch:按需创建,解决鸿蒙编译的兼容性问题,比如路径适配、接口兼容、编译报错等,补丁文件通过 patch -p1 命令在 prepare 阶段执行。所有 C/C++ 库的编译均基于 鸿蒙交叉编译环境,核心要点如下:
armeabi-v7a(arm32) 和 arm64-v8a(arm64) 两大主流架构;source envset.sh 导入鸿蒙交叉编译环境变量,通过 setarm32ENV/setarm64ENV 设置对应架构的编译环境;configure/make/cmake 三种主流 C/C++ 编译方式,官方均做了兼容;${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}/ 目录,鸿蒙系统可直接调用;仓颉(CangJie):OpenHarmony 官方原生编程语言,为鸿蒙而生,主打高性能、简洁语法、原生鸿蒙适配,是鸿蒙未来的核心开发语言。 核心定位:鸿蒙原生开发的首选语言,替代部分 C/C++ 和 ArkTS 的开发场景,生态正在快速建设中。
OpenHarmony 的生态建设已经进入标准化、规模化阶段,从主流跨端框架到底层 C/C++ 库,从移动端到 PC 端,从第三方语言到原生仓颉语言,形成了完整的生态体系和适配规范。对于开发者而言,鸿蒙化适配不再是高成本的自研工作,而是基于官方标准的低成本复用与修改。
本文梳理的所有适配方案和资源,均为鸿蒙官方维护的标准化内容,也是现阶段鸿蒙开发的核心参考。希望本文能帮助开发者快速掌握鸿蒙化适配的核心要点,低成本将项目和三方库迁移至鸿蒙生态。
附:全文核心仓库地址汇总

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online