如果这篇文章对你有帮助,麻烦大家点赞 + 收藏 + 转发三连支持~ 你们的每一份认可,都是我持续输出技术干货的最大动力!后续还会带来更多实操教程,技术解读。记得关注不迷路哦~
也欢迎添加我的联系方式,咱们交个朋友!未来我也会持续分享各类前沿技术干货。
SHA 库 鸿蒙PC 适配详解
核心文件介绍
SHA 库的 鸿蒙PC 适配包含以下核心文件,每个文件都有特定的作用和重要性:
1. HPKBUILD - 构建配置文件 ⭐⭐⭐⭐⭐
重要性: ⭐⭐⭐⭐⭐ (最核心的文件)
作用: 定义包的元数据、构建过程和打包逻辑
关键配置:
# 包的基本信息pkgname=sha # 包名pkgver=3ee0d88fc4f629b2e084f1b4cbf22cd3597542fb # 版本号(commit hash)archs=("armeabi-v7a""arm64-v8a") # 支持的架构# 源码配置source="https://github.com/BrianGladman/sha.git"autounpack=false# 不自动解压(使用 git clone)downloadpackage=false# 不下载压缩包# 构建函数prepare() # 准备阶段:下载源码、应用补丁build() # 构建阶段:编译代码archive() # 打包阶段:生成 HNP 包package() # 安装阶段:安装到目标目录
核心功能:
- 源码获取: 通过 git clone 获取指定版本的源码
- 补丁应用: 自动应用 OpenHarmony 适配补丁
- 多架构构建: 支持 armeabi-v7a 和 arm64-v8a 两种架构
- 产物打包: 生成 HNP 包和 tar.gz 压缩包
关键改进:
# 添加环境配置加载source envset.sh# archive 函数中添加环境变量设置if [ "$ARCH" == "armeabi-v7a" ]; then setarm32ENV # 设置 ARM32 环境elif [ "$ARCH" == "arm64-v8a" ]; then setarm64ENV # 设置 ARM64 环境fi${HNP_TOOL} pack -i ... # 打包 HNP
2. HPKCHECK - 测试配置文件 ⭐⭐⭐⭐
重要性: ⭐⭐⭐⭐ (质量保证)
作用: 定义测试逻辑和测试执行方式
关键配置:
source HPKBUILD > /dev/null 2>&1 # 加载 HPKBUILD 配置# 测试函数openharmonycheck() {cd$builddir/$ARCH-build ctest > ${logfile} 2>&1 # 执行 CMake 测试 res=$?cd$OLDPWDreturn$res}
测试内容:
3. hnp.json - HNP 包配置文件 ⭐⭐⭐⭐⭐
重要性: ⭐⭐⭐⭐⭐ (部署关键)
作用: 定义 HNP 包的元数据和安装配置
配置内容:
{"type": "hnp-config", // 配置类型"name": "sha", // 包名"version": "1.1.0", // HNP 版本号"install": {} // 安装配置(可选)}
重要性说明:
- HNP (Harmony Native Package) 是 OpenHarmony 的原生包格式
4. README_zh.md - 中文文档 ⭐⭐⭐⭐
重要性: ⭐⭐⭐⭐ (用户指南)
作用: 提供完整的使用文档和 API 说明
文档结构:
# SHA 加密库说明文档## 功能简介## 支持的算法## API 接口## 使用示例## 构建说明## 测试验证## 常见问题## 安全建议
文档亮点:
5. README.OpenSource - 开源声明 ⭐⭐⭐
重要性: ⭐⭐⭐ (合规性)
作用: 声明开源软件的许可证和版权信息
格式: JSON 数组
[ {"Name": "sha","License": "","License File": "","Version Number": "3ee0d88fc4f629b2e084f1b4cbf22cd3597542fb","Owner": "jianguo@nutpi.net","Upstream URL": "https://github.com/BrianGladman/sha","Description": "sha is an algorithm that calculates a fixed length string..." }]
用途:
SHA 适配架构
整体架构图
┌─────────────────────────────────────────────────────────────┐│ OpenHarmony 适配层 │├─────────────────────────────────────────────────────────────┤│ ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ││ │ HPKBUILD │ │ HPKCHECK │ │ hnp.json │ ││ │ 构建配置 │ │ 测试配置 │ │ 包配置 │ ││ └──────────────┘ └──────────────┘ └──────────────┘ ││ │ │ │ ││ └──────────────────┼──────────────────┘ ││ ▼ ││ ┌──────────────────────────────────────────────────────┐ ││ │ Lycium 构建系统 │ ││ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ ││ │ │build.sh │ │envset.sh │ │build_hpk │ │ ││ │ │主构建脚本│ │环境设置 │ │构建执行 │ │ ││ │ └──────────┘ └──────────┘ └──────────┘ │ ││ └──────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────┐ ││ │ 补丁适配层 │ ││ │ sha_ohos.patch │ ││ │ ┌──────────────────────────────────────────────┐ │ ││ │ │ CMakeLists.txt 修改 │ │ ││ │ │ - 静态链接配置 │ │ ││ │ │ - OpenHarmony 特定配置 │ │ ││ │ └──────────────────────────────────────────────┘ │ ││ └──────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────────────────────────────────────────────────┐ ││ │ 原始 SHA 库 │ ││ │ BrianGladman/sha (v3ee0d88) │ ││ │ - sha1.c / sha1.h │ ││ │ - sha2.c / sha2.h │ ││ │ - hmac.c / hmac.h │ ││ │ - pwd2key.c / pwd2key.h │ ││ └──────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────┘
关键文件详解
HPKBUILD 详细解析
1. 元数据部分
pkgname=sha # 包名称pkgver=3ee0d88fc4f629b2e084f1b4cbf22cd3597542fb # Git commit hashpkgrel=0 # 包释放版本pkgdesc=""# 包描述url="https://github.com/BrianGladman/sha"# 上游地址archs=("armeabi-v7a""arm64-v8a") # 支持架构license=("the sha license") # 许可证depends=() # 运行依赖makedepends=() # 构建依赖
2. 源码配置
source="https://github.com/BrianGladman/sha.git"autounpack=false# 不自动解压downloadpackage=false# 不下载压缩包builddir=$pkgname-${pkgver}# 构建目录download_and_patch_flag=true# 下载和补丁标志
3. prepare() 函数 - 准备阶段
prepare() {if [ "$download_and_patch_flag" == true ]; then# 1. 克隆源码 git clone$source$builddir# 2. 切换到指定版本cd$builddir git reset --hard $pkgver# 3. 应用 OpenHarmony 补丁 patch -p1 < ../sha_ohos.patch# 4. 标记已完成 download_and_patch_flag=falsefi# 5. 创建构建目录 mkdir -p $builddir/$ARCH-build}
关键点:
4. build() 函数 - 构建阶段
build() {cd$builddir# 使用 OpenHarmony SDK 的 CMake${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" \ -B$ARCH-build -S./ > $buildlog 2>&1# 编译(使用 make 或 ninja)$MAKE VERBOSE=1 -C $ARCH-build >> $buildlog 2>&1 ret=$?cd$OLDPWDreturn$ret}
关键点:
- 使用 OpenHarmony SDK 提供的工具链
5. archive() 函数 - 打包阶段 ⭐
archive() {# 1. 创建输出目录 mkdir -p ${LYCIUM_ROOT}/output/$ARCH# 2. 打包 tar.gzpushd$LYCIUM_ROOT/usr/$pkgname/$ARCH tar -zvcf ${LYCIUM_ROOT}/output/$ARCH/${pkgname}_${pkgver}.tar.gz *popd# 3. 复制 HNP 配置文件 cp hnp.json $LYCIUM_ROOT/usr/$pkgname/$ARCH# 4. 设置架构相关环境变量 ⭐ 关键修复if [ "$ARCH" == "armeabi-v7a" ]; then setarm32ENV # ARM32 环境elif [ "$ARCH" == "arm64-v8a" ]; then setarm64ENV # ARM64 环境fi# 5. 打包 HNP${HNP_TOOL} pack -i ${LYCIUM_ROOT}/usr/$pkgname/$ARCH \ -o ${LYCIUM_ROOT}/output/$ARCH/# 6. 清理环境变量if [ "$ARCH" == "armeabi-v7a" ]; then unsetarm32ENVelif [ "$ARCH" == "arm64-v8a" ]; then unsetarm64ENVfi}
关键修复点:
6. package() 函数 - 安装阶段
package() {cd$builddir# 执行 make install$MAKE VERBOSE=1 -C $ARCH-build install >> $buildlog 2>&1cd$OLDPWD}
sha_ohos.patch 详细解析
这是最重要的适配补丁文件,包含以下关键修改:
1. CMakeLists.txt 修改
原始代码:
add_executable(hmac hmac_test.c)target_link_libraries(hmac PRIVATE sha)
修改后:
add_executable(hmac hmac_test.c)target_link_libraries(hmac PRIVATE sha_static) # 改为静态链接
修改的文件:
修改原因:
2. 新增 CMake 配置
# 添加 OpenHarmony 特定配置if(OHOS) target_compile_options(sha_test PRIVATE -Wno-format-security)endif()
适配流程
完整的适配流程图
┌─────────────────────────────────────────────────────────────┐│ 适配流程开始 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 1. 分析原始库 ││ - 检查依赖关系 ││ - 评估移植难度 ││ - 确定适配策略 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 2. 创建 HPKBUILD ││ - 定义包元数据 ││ - 配置源码下载 ││ - 编写构建函数 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 3. 创建补丁文件 ││ - 分析需要修改的内容 ││ - 编写 CMakeLists.txt 修改 ││ - 处理平台特定问题 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 4. 配置测试 ││ - 编写 HPKCHECK ││ - 定义测试用例 ││ - 验证功能正确性 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 5. 创建配置文件 ││ - hnp.json ││ - README 文档 ││ - 开源声明 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 6. 构建测试 ││ - 执行 ./build.sh sha ││ - 检查构建产物 ││ - 验证多架构支持 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 7. 设备测试 ││ - 部署到 OpenHarmony 设备 ││ - 运行测试程序 ││ - 验证功能完整性 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 8. 问题修复 ││ - 修复动态链接问题 ││ - 优化构建配置 ││ - 完善文档说明 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 适配流程完成 │└─────────────────────────────────────────────────────────────┘
技术要点
1. 静态链接 vs 动态链接
选择理由:
2. 多架构支持
archs=("armeabi-v7a""arm64-v8a")
实现方式:
环境变量设置:
# ARM32 环境setarm32ENV() {export CC=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clangexport CXX=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang++export HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli# ...}# ARM64 环境setarm64ENV() {export CC=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clangexport CXX=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang++export HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli# ...}
3. 补丁管理
补丁格式:
--- a/original_file.txt+++ b/modified_file.txt@@ -line_start,count +line_start,count @@ context_line-removed_line+added_line context_line
补丁应用:
patch -p1 < ../sha_ohos.patch
优势:
4. 构建产物管理
output/├── armeabi-v7a/│ ├── sha.hnp # HNP 包│ └── sha_*.tar.gz # 压缩包└── arm64-v8a/ ├── sha.hnp └── sha_*.tar.gzusr/sha/├── armeabi-v7a/│ ├── bin/ # 可执行文件│ ├── include/ # 头文件│ └── lib/ # 库文件└── arm64-v8a/ ├── bin/ ├── include/ └── lib/
常见问题
Q1: 为什么使用 commit hash 作为版本号?
A: 使用 commit hash 的优势:
Q2: 补丁文件的作用是什么?
A: 补丁文件的作用:
Q3: HNP 包和 tar.gz 包有什么区别?
A:
Q4: 如何验证构建是否成功?
A: 验证步骤:
Q5: 如何添加新的架构支持?
A: 步骤:
总结
SHA 库的 鸿蒙PC 适配是一个完整的工程实践,包含以下关键要素:
核心文件
- README.OpenSource - 合规性的声明
技术要点
适配成果
这个适配案例为其他开源库的 鸿蒙PC 移植提供了很好的参考模板。
文档版本: 1.0.0最后更新: 2026-04-07