鸿蒙三方库适配HPKCHECK 文件执行流程详解欢迎大家加入开源鸿蒙跨平台开发者社区HPKCHECK文件是通过执行test.sh脚本来运行的。现在解释整个执行流程1. 执行入口cd/path/to/lycium_plusplus/lycium ./test.sh[库名1][库名2]...或者测试所有库./test.sh2. 执行流程图┌─────────────────────────────────────┐ │ 执行 test.sh 脚本 │ │ (在 OpenHarmony 设备上运行) │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ main() 函数入口 │ │ - 设置 LYCIUM_ROOT │ │ - 设置 LYCIUM_THIRDPARTY_ROOT │ │ - 设置 OHOS_SDK_VER │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ checktestenv() │ │ - 检查 cmake/make/ctest/perl 是否存在│ │ - 创建日志目录 │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ getcpuarchitecture() │ │ - 检测 CPU 架构 │ │ - 设置 ARCH 变量 │ │ (arm64-v8a 或 armeabi-v7a) │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ setloaddynamiclibrarypath() │ │ - 设置动态库搜索路径 │ │ - export LD_LIBRARY_PATH │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 查找要测试的库 │ │ - 如果指定库名: findlibsdir() │ │ - 如果未指定: findbuilddir() │ │ - 填充 hpkPaths 数组 │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ checkhpk() 函数 │ │ 遍历所有要测试的库 │ └──────────────┬──────────────────────┘ │ ▼ ┌───────┴───────┐ │ for 循环 │ └───────┬───────┘ │ ▼ ┌─────────────────────────────────────┐ │ 检查 HPKCHECK 文件是否存在 │ │ if [ ! -f $libdir/HPKCHECK ] │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ cd $libdir │ │ 进入库的源码目录 │ │ (如: thirdparty/AES) │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ source ./HPKCHECK │ │ 加载 HPKCHECK 文件 │ │ (关键步骤) │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ HPKCHECK 文件执行内容 │ │ 1. source HPKBUILD │ │ - 导入构建脚本 │ │ - 获取 pkgname, builddir 等变量 │ │ │ │ 2. 设置 logfile 变量 │ │ - 定义测试日志路径 │ │ │ │ 3. 定义 openharmonycheck() 函数 │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 检查是否有 checkprepare() 函数 │ │ type -t checkprepare │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 如果存在执行 checkprepare() │ │ 执行测试前的准备工作 │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ openharmonycheck │ │ 调用 HPKCHECK 中定义的测试函数 │ │ - cd ${builddir}/${ARCH}-build │ │ - ctest ${logfile} 21 │ │ - 保存测试结果 │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 检查测试结果 │ │ - 成功: 加入 successlibs │ │ - 失败: 加入 failedlibs │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 收集测试日志 │ │ - 复制到 LOG_PATH │ │ - 失败的日志复制到 LYCIUM_FAULT_PATH│ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ cd $OLDPWD │ │ 返回原目录 │ └──────────────┬──────────────────────┘ │ ▼ ┌───────┴───────┐ │ 继续下一个库 │ └───────┬───────┘ │ ▼ ┌─────────────────────────────────────┐ │ 输出测试报告 │ │ - 总测试库数量 │ │ - 失败的库列表 │ └─────────────────────────────────────┘3. 关键代码解析3.1 在test.sh中加载 HPKCHECK行号以你本地lycium/test.sh为准source./HPKCHECK这行代码的作用使用source命令加载HPKCHECK文件source会在当前 Shell 环境中执行文件内容这样HPKCHECK中定义的函数如openharmonycheck就可以在当前脚本中调用3.2 调用测试函数openharmonycheck/dev/null21这行代码调用HPKCHECK中定义的openharmonycheck()函数将输出重定向到/dev/null不显示在终端测试结果保存在日志文件中4. 执行示例示例1测试单个库AEScd/path/to/lycium_plusplus/lycium ./test.sh AES执行过程test.sh设置环境变量在LYCIUM_THIRDPARTY_ROOT即thirdparty中查找AES库进入thirdparty/AES目录source ./HPKCHECK加载测试脚本执行openharmonycheck()函数生成测试日志输出测试结果示例2测试多个库./test.sh AES zlib openssl示例3测试所有已编译的库./test.sh5. 执行环境要求根据test.sh中的说明脚本设计为在OpenHarmony 设备上使用重要test.sh必须在OpenHarmony 设备或已与交叉产物路径对齐的环境上运行因为需要在真实设备上运行编译出的测试程序测试程序是目标架构二进制不能在宿主机上直接当本机程序运行需要访问 OpenHarmony 的系统库和资源6. 执行前提条件在执行test.sh之前需要编译三方库cd/path/to/lycium_plusplus/lycium ./build.sh AES部署到设备将编译产物和测试脚本推送到 OpenHarmony 设备确保设备上有必要的工具cmake, make, ctest, perl在设备上执行测试cd/path/to/lycium ./test.sh AES7. 总结HPKCHECK 文件的执行方式✅ 通过执行test.sh脚本✅test.sh使用source命令加载HPKCHECK✅ 调用HPKCHECK中定义的openharmonycheck()函数✅ 须在 OpenHarmony 设备或等效环境上运行执行流程test.sh → checkhpk() → source ./HPKCHECK → openharmonycheck() → 生成测试日志