在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库

欢迎加入开源鸿蒙跨平台社区

通过C/C++三方库鸿蒙化适配一篇搞定从环境到交叉编译完成从环境到交叉编译,成功鸿蒙化适配C/C++三方库后,将需要进入验证环节。业界内C/C++三方库测试框架多种多样(ctest、make check以及原生库demo用例等),我们无法将其统一,因此为了确保原生库功能的完整性,需基于原生库的测试用例进行测试验证。三方库测试主要是make testctest等测试命令,因此需要集成makecmakebusyboxperlshell_cmd工具。

下载二进制文件

执行以下命令,将Lycium CI tools工程克隆到本地。

shell 复制代码
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设备上运行make test, 和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资源部推送到开发板并解压后只需执行以下命令即可。
shell 复制代码
# 将lycium-citools压缩上传到测试机, 使用hdc登录测试机, 解压lycium-citools, 进入lycium-citools目录
sh setCIenv.sh          # 自动配置
  • SHA512SUM:文件校验。
shell 复制代码
sha512sum -C SHA512SUM

使用hdc将lycium-citools压缩上传到测试机

执行命令将lycium-citools压缩。

shell 复制代码
cd ~/OpenHarmony/tools
tar -zcvf lycium-citools.tar.gz lycium-citools

将开源鸿蒙开发板通过数据线链接到电脑上,通过hdc命令将lycium-citools压缩工具包上传进ohos设备的/data目录。

注意: 确保hdc命令已经在环境变量中配置。若为配置需要在终端执行open ~/.zshrc将以下内容粘贴复制到配置文件底部,前提是你已经安装了DevEco Studio工具。当然也可以使用SDK中toolchains目录。

复制代码
export PATH=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/toolchains:$PATH

# HDC端口变量名为:HDC_SERVER_PORT,变量值可设置为任意未被占用的端口,如7035
HDC_SERVER_PORT=7035 
launchctl setenv HDC_SERVER_PORT $HDC_SERVER_PORT 
export HDC_SERVER_PORT

执行以下命令查看开发板是否已经链接,使用hdc file sendlycium-citools压缩工具包上传。

shell 复制代码
hdc file send lycium-citools.tar.gz /data

执行hdc shell进入命令行交互模式,进入data目录执行命令tar -zxvf lycium-citools.tar.gz解压刚才上传的压缩包文件。

shell 复制代码
hdc shell
cd data
tar -zxvf lycium-citools.tar.gz

解压完成后,进入lycium-citools目录,执行sh setCIenv.sh命令自动完成CI环境配置。

shell 复制代码
cd lycium-citools
sh setCIenv.sh

注意:若出现setCIenv.sh[69]: make: inaccessible or not foundsetCIenv.sh[70]: cmake: inaccessible or not foundsetCIenv.sh[71]: perl: inaccessible or not found问题,表示当前软链接目录未配置到环境变量中,需要继续执行命令export PATH=/usr/CIuser/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 <youremail@domain.com>
# Maintainer: Your Name <youremail@domain.com>

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设备上执行测试用例,保证适配目标库功能完整。测试有三种方式:

  1. 将完整的tpc_c_cplusplus推送到ohos设备与交叉编译时tpc_c_cplusplus所在路径一致的目录下,这种方式使用lycium/test.sh脚本执行测试用例。
  2. 仅向ohos推送交叉编译完成的C/C++三方库(即tpc_c_cplusplus/thirdparty/目标库/目标库-版本号),但需要在执行测试用例前在环境变量中配置LD_LIBRARY_PATH指向.so所在目录。
  3. 鸿蒙应用集成三方库二进制文件进行测试,这种比较复杂,不建议。

完整推送

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_cplusplusohos设备tpc_c_cplusplus目录下执行pwd也应该是同样的路径。因为部分测试用例在编译时可能会指定路径,故需要保证测试机上的路径与编译机的路径是一致。

测试运行

lycium目录下执行脚本./test.sh,自动运行thridparty目录下已编译的三方库,并在终端显示已测试三方库总数以及通过和未通过的三方。

shell 复制代码
./test.sh # 默认测试 thirdparty 目录下的所有已编译的三方库
shell 复制代码
./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编译方式)
相关推荐
小镇敲码人2 小时前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
lbb 小魔仙2 小时前
【HarmonyOS实战】OpenHarmony + RN:自定义 useFormik 表单处理
react native·harmonyos
ujainu2 小时前
Flutter + OpenHarmony 实现经典打砖块游戏开发实战—— 物理反弹、碰撞检测与关卡系统
flutter·游戏·openharmony·arkanoid·breakout
风指引着方向2 小时前
图编译优化全链路:CANN graph-engine 仓库技术拆解
c语言
果粒蹬i2 小时前
【HarmonyOS】DAY7:鸿蒙跨平台 Tab 开发问题与列表操作难点深度复盘
华为·harmonyos
张张努力变强3 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
小镇敲码人3 小时前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn
平安的平安3 小时前
面向大模型算子开发的高效编程范式PyPTO深度解析
c++·mfc