在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
欢迎加入开源鸿蒙跨平台社区
📌 通过C/C++三方库鸿蒙化适配一篇搞定从环境到交叉编译完成从环境到交叉编译,成功鸿蒙化适配C/C++三方库后,将需要进入验证环节。业界内C/C++三方库测试框架多种多样(ctest、make check以及原生库demo用例等),我们无法将其统一,因此为了确保原生库功能的完整性,需基于原生库的测试用例进行测试验证。三方库测试主要是make test、ctest等测试命令,因此需要集成make、cmake、busybox、perl、shell_cmd工具。
📥 下载二进制文件
💻 执行以下命令,将Lycium CI tools工程克隆到本地。
cd /data # 自定义目录mkdir tools # 自定义目录cd tools # 自定义目录git clone https://gitee.com/han_jin_fei/lycium-citools.git 
- 📱
AARCH64-linux-ohos设备- 📦
arm64-v8a-cmake_make.tar.gz:存放的是aarch64静态编译的cmake套件和make工具,可以在64位ohos设备上运行make test,和ctest测试套; - 🔧
arm64-v8a-busybox.tar.gz:存放的是aarch64静态编译的busybox工具,可以在64位ohos设备上运行toybox不支持的sh命令; - 📄
arm64-v8a-perl.tar.gz:存放的是aarch64静态编译的perl工具及编译时使用的源码,此工具包解压后直接放入ohos设备的/data目录使用(不要更换移动位置); - ⌨️
arm64-v8a-shell_cmd.tar.gz:存放的是aarch64静态编译的其他shell命令行工具。
- 📦
- 📱
ARM-linux-ohos设备- 📦
armeabi-v7a-cmake_make.tar.gz: 存放的是arm静态编译的cmake套件和make工具, 可以在32位ohos设备上运行maketest, 和ctest测试套; - 🔧
armeabi-v7a-busybox.tar.gz: 存放的是arm静态编译的busybox工具, 可以在32位ohos设备上运行toybox不支持的sh命令; - 📄
armeabi-v7a-perl.tar.gz: 存放的是arm静态编译的perl工具及编译时使用的源码, 此工具包解压后直接放入ohos设备的/data目录使用(不要轻易移动位置); - ⌨️
armeabi-v7a-shell_cmd.tar.gz: 存放的是arm静态编译的其他shell命令行工具。
- 📦
- ⚙️
setCIenv.sh:自动配置CI环境的脚本,该脚本必须和当前目录下的工具包在同一目录下,将CI资源部推送到开发板并解压后只需执行以下命令即可。
# 将lycium-citools压缩上传到测试机, 使用hdc登录测试机, 解压lycium-citools, 进入lycium-citools目录sh setCIenv.sh # 自动配置- ✔️
SHA512SUM:文件校验。
sha512sum -C SHA512SUM 📤 使用hdc将lycium-citools压缩上传到测试机
💻 执行命令将lycium-citools压缩。
cd ~/OpenHarmony/tools tar -zcvf lycium-citools.tar.gz lycium-citools 
🔗 将开源鸿蒙开发板通过数据线链接到电脑上,通过hdc命令将lycium-citools压缩工具包上传进ohos设备的/data目录。
⚠️ 注意: 确保hdc命令已经在环境变量中配置。若为配置需要在终端执行open ~/.zshrc将以下内容粘贴复制到配置文件底部,前提是你已经安装了DevEco Studio工具。当然也可以使用SDK中toolchains目录。
💻 执行以下命令查看开发板是否已经链接,使用hdc file send将lycium-citools压缩工具包上传。
hdc file send lycium-citools.tar.gz /data 
📂 执行hdc shell进入命令行交互模式,进入data目录执行命令tar -zxvf lycium-citools.tar.gz解压刚才上传的压缩包文件。
hdc shell cd data tar -zxvf lycium-citools.tar.gz 
✅ 解压完成后,进入lycium-citools目录,执行sh setCIenv.sh命令自动完成CI环境配置。
cd lycium-citools sh setCIenv.sh 
💡 注意:若出现setCIenv.sh[69]: make: inaccessible or not found、setCIenv.sh[70]: cmake: inaccessible or not found、setCIenv.sh[71]: perl: inaccessible or not found问题,表示当前软链接目录未配置到环境变量中,需要继续执行命令export PATH=/usr/CIusr/bin:$PATH完成环境变量添加。

📝 编写测试脚本
📦 lycium框架提供了HPKCHECK文件供开发者对相应的C/C++三方库的自动化测试,开发者只需要在脚本中配置当前三方库需要测试的命令即可。
📄 HPKCHECK测试配置模板
# This is an example HPKCHECK file. Use this as a start to creating your own, # and remove these comments. # Contributor: Your Name <[email protected]> # Maintainer: Your Name <[email protected]> source HPKBUILD > /dev/null 2>&1 # 导入HPKBUILD文件 logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log # 测试前的准备, 如果不需要可以不写。 checkprepare(){ return 0 } # 在OH环境执行测试的接口 openharmonycheck() { res=0 # 记录返回值 cd ${builddir}/${ARCH}-build # 进入到测试目录 ctest > ${logfile} 2>&1 # 执行测试命令并将测试结果导出到${logfile},测试命令根据每个库的真实情况填写 res=$? # 记录测试结果返回值 cd $OLDPWD # 返回上一次目录 return $res # 返回测试值 } 📚 三种编译方式的测试配置文件
以cJSON为例掌握ctest测试配置文件HPKCHECK 📐
✏️ 使用VSCode打开tpc_c_cplusplus项目,在thirdparty/cJSON目录创建HPKCHECK文件,按照编译配置模板编写cJSON测试配置文件。
source HPKBUILD > /dev/null 2>&1 logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log openharmonycheck() { res=0 cd $builddir/$ARCH-build echo "start test times: `date`" >> ${logfile} 2>&1 ctest --timeout 40000 >> ${logfile} 2>&1 res=$? if [ $res -ne 0 ] then mkdir -p ${LYCIUM_FAULT_PATH}/${pkgname} cp Testing/Temporary/LastTest.log ${LYCIUM_FAULT_PATH}/${pkgname}/ fi cd $OLDPWD echo "end test times: `date`" >> ${logfile} 2>&1 return $res } 
以bzip2为例掌握make测试配置文件HPKCHECK 🔨
✏️ 使用VSCode打开tpc_c_cplusplus项目,在thirdparty/bzip2目录创建HPKCHECK文件,按照编译配置模板编写bzip2测试配置文件。
source HPKBUILD > /dev/null 2>&1 logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log openharmonycheck() { cd $builddir-$ARCH-build make check > ${logfile} 2>&1 res=$? cd $OLDPWD return $res } 以libuuid为例掌握 原生库测试脚本 测试配置文件HPKCHECK ⚙️
✏️ 使用VSCode打开tpc_c_cplusplus项目,在thirdparty/libuuid目录创建HPKCHECK文件,按照编译配置模板编写libuuid测试配置文件。
source HPKBUILD > /dev/null 2>&1 logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log openharmonycheck() { res=0 cd ${builddir}/${ARCH}-build ./test_uuid > ${logfile} 2>&1 res=$? cd $OLDPWD return $res } ▶️ 执行测试用例
📌 交叉编译完成后,我们需要在ohos设备上执行测试用例,保证适配目标库功能完整。测试有三种方式:
- 📦 将完整的
tpc_c_cplusplus推送到ohos设备与交叉编译时tpc_c_cplusplus所在路径一致的目录下,这种方式使用lycium/test.sh脚本执行测试用例,对ohos设备存储要求较高,不建议。 - 📂 仅向
ohos推送交叉编译完成的C/C++三方库(即tpc_c_cplusplus/thirdparty/目标库/目标库-版本号),但需要在执行测试用例前在环境变量中配置LD_LIBRARY_PATH指向.so所在目录,推荐使用这种方式。 - 📱 鸿蒙应用集成三方库二进制文件进行测试,这种比较复杂,不建议。
📦 完整推送
💻 在tpc_c_cplusplus上级目录执行tar -zcvf tpc_c_cplusplus.tar.gz tpc_c_cplusplus将工程进行压缩。

📤 执行hdc file send tpc_c_cplusplus.tar.gz /xxx命令将压缩包推送到ohos设备上。执行hdc shell进入命令行交互模式,进入data目录执行命令tar -zxvf tpc_c_cplusplus.tar.gz解压刚才上传的压缩包文件。
⚠️ 注意:xxx为tpc_c_cplusplus所在的绝对路径。比如data目录,在交叉编译环境设备上tpc_c_cplusplus目录下执行pwd应该输出的是/data/tpc_c_cplusplus,ohos设备tpc_c_cplusplus目录下执行pwd也应该是同样的路径。因为部分测试用例在编译时可能会指定路径,故需要保证测试机上的路径与编译机的路径是一致。

🚀 测试运行
💻 在lycium目录下执行脚本./test.sh,自动运行thridparty目录下已编译的三方库,并在终端显示已测试三方库总数以及通过和未通过的三方。
./test.sh # 默认测试 thirdparty 目录下的所有已编译的三方库./test.sh aaa bbb ccc ... # 测试 thirdparty 目录下指定的 aaa bbb ccc ...库 当指定的库未编译时不会进行测试❓ FAQ:
💡 出现/bin/sh: ./test.sh: No such file or directory需要在命令前加bash。比如bash ./test.sh cJSON。
💡 出现ctest command not found, please follow the CITools instruction,需要执行export PATH=/usr/CIusr/bin:$PATH添加环境变量。
📐 cJSON自动测试(cmake编译方式)

✅ 出现check cJSON success表示测试成功,在/data/tpc_c_cplusplus/thirdparty/cJSON目录下可以查看测试日志文件cJSON_armeabi-v7a_OpenHarmony_4.0.8.1_test.log。

⚙️ libuuid自动测试(configure编译方式)

🔨 bzip2自动测试(make编译方式)

📂 仅推送交叉编译文件
📌 在上面我们也提到了就是tpc_c_cplusplus/thirdparty/目标库/目标库-版本号这个目录,该目录下会存在交叉编译后的CPU架构的文件。

📦 使用压缩命令tar -zcvf cJSON-1.7.19.tar.gz cJSON-1.7.19进行压缩。

📤 并使用hdc file send cJSON-1.7.19.tar.gz /data将压缩包推送到ohos设备上。

📂 根据ohos设备CPU架构进入到编译后的文件夹。

▶️ 使用ctest命令执行cJSON的测试用例。
- 💡 若提示
/bin/sh: ctest: inaccessible or not found,表示当前ctest未配置环境变量,需要在当前终端窗口执行export PATH=/usr/CIusr/bin:$PATH添加环境变量。

- 💡 执行
ctest命令提示如下错误信息,则表示运行时加载器找不到动态库,需要通过设置export LD_LIBRARY_PATH=$PWD:$PWD/tests:$LD_LIBRARY_PATH指向.so所在目录,然后再次执行ctest命令。
Test project /data/cJSON-1.7.19/armeabi-v7a-build Start 1: cJSON_test 1/19 Test #1: cJSON_test .......................***Failed 0.01 sec Start 2: parse_examples 2/19 Test #2: parse_examples ...................***Failed 0.01 sec Start 3: parse_number 3/19 Test #3: parse_number .....................***Failed 0.01 sec Start 4: parse_hex4 4/19 Test #4: parse_hex4 .......................***Failed 0.01 sec Start 5: parse_string 5/19 Test #5: parse_string .....................***Failed 0.01 sec Start 6: parse_array 6/19 Test #6: parse_array ......................***Failed 0.01 sec Start 7: parse_object 7/19 Test #7: parse_object .....................***Failed 0.01 sec Start 8: parse_value 8/19 Test #8: parse_value ......................***Failed 0.01 sec Start 9: print_string 9/19 Test #9: print_string .....................***Failed 0.01 sec Start 10: print_number 10/19 Test #10: print_number .....................***Failed 0.01 sec Start 11: print_array 11/19 Test #11: print_array ......................***Failed 0.01 sec Start 12: print_object 12/19 Test #12: print_object .....................***Failed 0.01 sec Start 13: print_value 13/19 Test #13: print_value ......................***Failed 0.01 sec Start 14: misc_tests 14/19 Test #14: misc_tests .......................***Failed 0.01 sec Start 15: parse_with_opts 15/19 Test #15: parse_with_opts ..................***Failed 0.01 sec Start 16: compare_tests 16/19 Test #16: compare_tests ....................***Failed 0.01 sec Start 17: cjson_add 17/19 Test #17: cjson_add ........................***Failed 0.01 sec Start 18: readme_examples 18/19 Test #18: readme_examples ..................***Failed 0.01 sec Start 19: minify_tests 19/19 Test #19: minify_tests .....................***Failed 0.01 sec0% tests passed, 19 tests failed out of 19 Total Test time(real)=0.15 sec The following tests FAILED: 1 - cJSON_test (Failed)2 - parse_examples (Failed)3 - parse_number (Failed)4 - parse_hex4 (Failed)5 - parse_string (Failed)6 - parse_array (Failed)7 - parse_object (Failed)8 - parse_value (Failed)9 - print_string (Failed)10 - print_number (Failed)11 - print_array (Failed)12 - print_object (Failed)13 - print_value (Failed)14 - misc_tests (Failed)15 - parse_with_opts (Failed)16 - compare_tests (Failed)17 - cjson_add (Failed)18 - readme_examples (Failed)19 - minify_tests (Failed) Errors while running CTest Output from these tests are in: /data/cJSON-1.7.19/armeabi-v7a-build/Testing/Temporary/LastTest.log Use "--rerun-failed --output-on-failure" to re-run the failed cases verbosely. 