当前位置: 首页 > news >正文

【鸿蒙 PC三方库构建系统】SHA 库 鸿蒙PC 适配详解

【鸿蒙 PC三方库构建系统】SHA 库 鸿蒙PC 适配详解

📋 目录

  • 核心文件介绍
  • SHA 适配架构
  • 关键文件详解
  • 适配流程
  • 技术要点
  • 常见问题

欢迎大家加入开源鸿蒙PC社区

项目地址:https://atomgit.com/oh-tpc/pc_sha

核心文件介绍

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()# 安装阶段:安装到目标目录

核心功能:

  1. 源码获取: 通过 git clone 获取指定版本的源码
  2. 补丁应用: 自动应用 OpenHarmony 适配补丁
  3. 多架构构建: 支持 armeabi-v7a 和 arm64-v8a 两种架构
  4. 产物打包: 生成 HNP 包和 tar.gz 压缩包

关键改进:

# 添加环境配置加载sourceenvset.sh# archive 函数中添加环境变量设置if["$ARCH"=="armeabi-v7a"];thensetarm32ENV# 设置 ARM32 环境elif["$ARCH"=="arm64-v8a"];thensetarm64ENV# 设置 ARM64 环境fi${HNP_TOOL}pack-i...# 打包 HNP

2. HPKCHECK - 测试配置文件 ⭐⭐⭐⭐

重要性: ⭐⭐⭐⭐ (质量保证)

作用: 定义测试逻辑和测试执行方式

关键配置:

sourceHPKBUILD>/dev/null2>&1# 加载 HPKBUILD 配置# 测试函数openharmonycheck(){cd$builddir/$ARCH-build ctest>${logfile}2>&1# 执行 CMake 测试res=$?cd$OLDPWDreturn$res}

测试内容:

  • SHA-1 算法正确性测试
  • SHA-256 算法正确性测试
  • SHA-512 算法正确性测试
  • HMAC 功能测试
  • 密钥派生功能测试

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 接口 ## 使用示例 ## 构建说明 ## 测试验证 ## 常见问题 ## 安全建议

文档亮点:

  • ✅ 完整的 API 接口文档
  • ✅ 3 个实用的代码示例
  • ✅ 详细的构建步骤
  • ✅ 测试验证方法
  • ✅ 常见问题解答
  • ✅ 安全使用建议

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. 克隆源码gitclone$source$builddir# 2. 切换到指定版本cd$builddirgitreset--hard$pkgver# 3. 应用 OpenHarmony 补丁patch-p1<../sha_ohos.patch# 4. 标记已完成download_and_patch_flag=falsefi# 5. 创建构建目录mkdir-p$builddir/$ARCH-build}

关键点:

  • 使用 git clone 而不是下载压缩包
  • 精确控制源码版本(通过 commit hash)
  • 自动应用适配补丁
  • 为每个架构创建独立的构建目录
4. build() 函数 - 构建阶段
build(){cd$builddir# 使用 OpenHarmony SDK 的 CMake${OHOS_SDK}/native/build-tools/cmake/bin/cmake"$@"\-B$ARCH-build -S./>$buildlog2>&1# 编译(使用 make 或 ninja)$MAKEVERBOSE=1-C$ARCH-build>>$buildlog2>&1ret=$?cd$OLDPWDreturn$ret}

关键点:

  • 使用 OpenHarmony SDK 提供的工具链
  • 支持多架构并行构建
  • 构建日志记录到$buildlog
  • 返回编译结果状态码
5. archive() 函数 - 打包阶段 ⭐
archive(){# 1. 创建输出目录mkdir-p${LYCIUM_ROOT}/output/$ARCH# 2. 打包 tar.gzpushd$LYCIUM_ROOT/usr/$pkgname/$ARCHtar-zvcf${LYCIUM_ROOT}/output/$ARCH/${pkgname}_${pkgver}.tar.gz *popd# 3. 复制 HNP 配置文件cphnp.json$LYCIUM_ROOT/usr/$pkgname/$ARCH# 4. 设置架构相关环境变量 ⭐ 关键修复if["$ARCH"=="armeabi-v7a"];thensetarm32ENV# ARM32 环境elif["$ARCH"=="arm64-v8a"];thensetarm64ENV# ARM64 环境fi# 5. 打包 HNP${HNP_TOOL}pack-i${LYCIUM_ROOT}/usr/$pkgname/$ARCH\-o${LYCIUM_ROOT}/output/$ARCH/# 6. 清理环境变量if["$ARCH"=="armeabi-v7a"];thenunsetarm32ENVelif["$ARCH"=="arm64-v8a"];thenunsetarm64ENVfi}

关键修复点:

  • ✅ 添加了架构特定的环境变量设置
  • ✅ 解决了 HNP_TOOL 找不到的问题
  • ✅ 确保每个架构使用正确的工具链
6. package() 函数 - 安装阶段
package(){cd$builddir# 执行 make install$MAKEVERBOSE=1-C$ARCH-buildinstall>>$buildlog2>&1cd$OLDPWD}

sha_ohos.patch 详细解析

这是最重要的适配补丁文件,包含以下关键修改:

1. CMakeLists.txt 新增

注意:原始 BrianGladman/sha 仓库没有 CMakeLists.txt 文件。补丁中的时间戳1969-12-31(Unix 纪元)表明原始文件不存在,补丁是新增文件而非修改文件。

补丁新增的 CMakeLists.txt 中,工具程序采用静态链接策略:

add_executable(hmac hmac_test.c) target_link_libraries(hmac PRIVATE sha_static) # 静态链接

静态链接的目标:

  • hmacsha_static
  • pwd2keysha_static
  • sha_testsha_static
  • sha256sumsha_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 动态链接

特性动态链接静态链接(采用)
文件大小
内存占用
部署复杂度
运行时依赖需要库文件
更新便利性
适用场景系统库工具程序

选择理由:

  • SHA 库体积小,静态链接增加的体积可忽略
  • 简化部署,无需管理库路径
  • 避免版本冲突问题
  • 适合独立运行的工具

2. 多架构支持

archs=("armeabi-v7a""arm64-v8a")

实现方式:

  • 为每个架构独立构建
  • 使用架构特定的工具链
  • 生成架构特定的产物
  • 统一的构建流程

环境变量设置:

# ARM32 环境setarm32ENV(){exportCC=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clangexportCXX=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang++exportHNP_TOOL=${OHOS_SDK}/toolchains/hnpcli# ...}# ARM64 环境setarm64ENV(){exportCC=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clangexportCXX=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang++exportHNP_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.gz usr/sha/ ├── armeabi-v7a/ │ ├── bin/ # 可执行文件 │ ├── include/ # 头文件 │ └── lib/ # 库文件 └── arm64-v8a/ ├── bin/ ├── include/ └── lib/

常见问题

Q1: 为什么使用 commit hash 作为版本号?

A: 使用 commit hash 的优势:

  • 精确标识源码版本
  • 便于追溯和调试
  • 避免版本号冲突
  • 符合开源项目管理习惯

Q2: 补丁文件的作用是什么?

A: 补丁文件的作用:

  • 修改原始代码以适配 OpenHarmony
  • 保持原始代码不变
  • 便于版本升级和合并
  • 清晰记录所有修改

Q3: HNP 包和 tar.gz 包有什么区别?

A:

包类型用途格式工具
HNPOpenHarmony 原生包专有格式hnpcli
tar.gz通用压缩包标准格式tar

Q4: 如何验证构建是否成功?

A: 验证步骤:

  1. 检查构建日志是否无错误
  2. 检查产物文件是否生成
  3. 在设备上运行测试程序
  4. 验证功能正确性

Q5: 如何添加新的架构支持?

A: 步骤:

  1. 在 HPKBUILD 中添加新架构
  2. 在 envset.sh 中添加环境设置函数
  3. 测试新架构的构建和运行

总结

SHA 库的 鸿蒙PC 适配是一个完整的工程实践,包含以下关键要素:

核心文件

  1. HPKBUILD- 构建配置的核心
  2. HPKCHECK- 质量保证的关键
  3. hnp.json- 部署配置的必需
  4. README_zh.md- 用户使用的指南
  5. README.OpenSource- 合规性的声明

技术要点

  • ✅ 静态链接简化部署
  • ✅ 多架构支持
  • ✅ 补丁管理
  • ✅ 完整的测试验证
  • ✅ 详细的文档说明

适配成果

  • 🎯 成功适配 OpenHarmony 平台
  • 🎯 支持 ARM64 和 ARM 架构
  • 🎯 提供完整的测试工具
  • 🎯 编写详细的文档
  • 🎯 解决动态链接问题

这个适配案例为其他开源库的 鸿蒙PC 移植提供了很好的参考模板。


http://www.rkmt.cn/news/1464161.html

相关文章:

  • 一文讲清楚 Agent 权限怎么做:从最小权限到提示注入防护
  • 别再死记硬背BMS架构了!用一张图搞懂集中式与分布式的核心差异与选型指南
  • 从MobileNetV3的h-swish激活函数聊起:为什么Google要放弃Swish?手把手复现与性能对比
  • HMS Core 5.2.0实战:用Network Kit给你的App网络请求和文件传输“提提速”
  • 如何突破文档下载限制:kill-doc一站式解决方案
  • 逆向思维抓包:当APP检测代理时,如何用Fiddler+夜神模拟器依然搞定数据捕获?
  • 从“分不清”到“分得清”:用粗糙集思想,5分钟看懂数据挖掘中的特征选择核心
  • PyTorch转ONNX时,那个神秘的ScatterND算子到底在干啥?一个例子讲透
  • 2026年整理的Web3九大核心赛道
  • 别再只盯着宏块了!H.265/HEVC里的CTU、Tile和Slice到底怎么选?实战配置避坑指南
  • Anaconda安装后必做的5件事:从配置国内镜像源到用conda管理Python包(Win/Mac通用)
  • 手把手教你用TwinCAT 3为倍福EK1100模块导出XML配置文件(附详细步骤图)
  • 品牌长期投入方法拆解:老板到底该把预算压在哪些资产上
  • 计算机毕业设计之基于python的四川大学生就业方向数据分析与应用
  • 降噪蓝牙耳机选购指南:通勤 / 运动多场景选型思路与主流机型实测解析
  • 别让运放自激振荡!手把手教你用波特图分析反相放大器的稳定性(附LTspice仿真)
  • 免费Grok网页端构建自动素材池的实战方法论
  • 告别unsafe!C#安全高效转换Halcon HImage为彩色Bitmap的完整指南
  • HC-05蓝牙模块连接老是失败?一份STM32CubeMX配置避坑指南(附常见问题排查)
  • 别再用截图了!Cadence自带导出工具,5分钟搞定原理图归档与分享
  • 我终于知道为什么小龙虾OpenClaw越来越凉了
  • 计算机毕业设计之基于大数据的共享单车数据分析系统的设计与实现
  • 告别AT指令!用STM32CubeMX + HAL库轻松玩转HC-05蓝牙模块(附手机调试助手实测)
  • 别让连接池拖垮你的应用:从TongWeb Hulk到Druid,5个必调的优化参数实战
  • 从‘Asking APP’需求文档反推:产品经理与工程师如何高效协作不扯皮
  • 深入ThreadX内核:结合STM32H743的Cache配置与性能调优实战
  • 收藏!小白程序员必看:避开AI三大坑,轻松入门大模型学习之旅
  • 告别抓包失败!保姆级教程:在夜神模拟器上配置Fiddler抓取APP流量(附证书安装避坑指南)
  • Python一键复现PULSE人脸超分:马赛克图秒变高清正脸
  • Plausible Analytics 自托管搭建指南:隐私优先的 Google Analytics 替代方案