HarmonyOS Next构建工具 lycium 原理介绍

HarmonyOS Next构建工具 lycium 原理介绍

在这里插入图片描述

背景介绍

HarmonyOS Next中很多系统API是以C++接口提供,如果要使用C++接口,必须要使用NAPI在ArkTS与C++间交互,这种场景在使用DevEco-Studio中集成的交叉编译工具,以及cmake构建工具就完全够用了。但是针对一些三方库迁移的场景,比如ffmpeg、openssl等,如果自己配置编译环境和脚本比较麻烦,进行交叉编译的过程中较关注的问题是:不同编译构建方式如何进行交叉编译、不同的编译构建平台如何配置交叉编译的环境、不同的交叉编译架构如何配置以及交叉编译后的产物如何进行测试验证。当前开源的C/C++三方库编译方式多样化,以下为主流的几种交叉编译方式:

  • cmake 编译构建。
  • configure 编译构建方式。
  • make 编译构建。
    官方提供了交叉编译构建工具lycium,帮助我们快速构建三方库。

lycium工具介绍

lycium是一款协助开发者通过shell语言实现C/C++三方库快速交叉编译,并在OpenHarmony 系统上快速验证的编译框架工具。开发者只需要设置对应C/C++三方库的编译方式以及编译参数,通过lycium就能快速的构建出能在OpenHarmony 系统运行的二进制文件。

lycium的构建原则是移植过程,不可以改源码(即不patchc/cpp文件,不patch构建脚本)。如移植必须patch,patch必须评审,给出充分理由。(不接受业务patch)

lycium构建工具地址:https://gitee.com/openharmony-sig/tpc_c_cplusplus

使用示例

  1. 编译环境准备:lycium框架支持多种构建方式的三方库,为了保障三方库能正常编译,我们需要保证编译环境中包含以下几个基本编译命令: gcc, cmake, make, pkg-config, autoconf, autoreconf, automake, 如若缺少相关命令,可通过官网下载对应版本的工具包,也可以在编译机上通过命令安装,如若Ubuntu系统上缺少cmake可以通过以下命令安装:sudo apt install cmake
  2. 修改三方库的编译方式以及编译参数,lycium框架提供了HPKBUILD文件供开发者对相应的C/C++三方库的编译配置。具体方法:
    • 在thirdparty目录下新建需要共建的三方库名字pkgname。
    • 将HPKBUILD模板文件拷贝到新建三方库目录下。
    • 根据三方库实际情况修改HPKBUILD模板,文件修改可参考minizip共建。
  3. 快速编译三方库:配置完三方库的编译方式参数后,在lycium目录执行./build.sh pkgname,进行自动编译三方库,并打包安装到当前目录的 usr/pkgname/
    ARCH 目录./build.sh # 默认编译 thirdparty 目录下的多有库,也可以:./build.sh aaa bbb ccc ... # 编译 thirdparty 目录下指定的 aaa bbb ccc ...库 当 aaa 库存在依赖时,必须保证入参中包含依赖,否则 aaa 库不会编译

lycium框架是通过linux shell脚本语言编写的,接下来我们分析构建工具的shell代码,理解构建流程,有助于帮助我们定位编译时遇到的失败问题。

构建脚本原理介绍

lycium框架主要由以下几个部分组成:

  1. HPKBUILD 构建配置
  2. 顶层构建脚本 build.sh
  3. 交叉编译工具链
  4. 测试验证环境
构建流程
1. 构建配置准备

开发者需要在 thirdparty 目录下为待编译的三方库创建目录,并编写 HPKBUILD 构建配置文件。HPKBUILD 文件定义了:

  • 源码获取方式
  • 编译参数配置
  • 依赖关系声明
  • 安装规则

HPKBUILD构建配置文件示例:

# Contributor: Jeff Han <hanjinfei@foxmail.com>
# Maintainer: Jeff Han <hanjinfei@foxmail.com>
pkgname=FFmpeg
pkgver=n6.0
pkgrel=0
pkgdesc="FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata."
url="https://github.com/FFmpeg/FFmpeg/"
archs=("armeabi-v7a" "arm64-v8a")
license=("GPL2" "GPL3" "LGPL3" "MIT" "X11" "BSD-styl")
depends=("rtmpdump" "openssl_1_0_2u")
makedepends=()
source="https://github.com/FFmpeg/$pkgname/archive/refs/tags/$pkgver.tar.gz"autounpack=false
downloadpackage=true
buildtools="configure"builddir=$pkgname-${pkgver}
packagename=$builddir.tar.gz
source envset.sh
buildhost=true
arch=
ldflags=prepare() {if [ "$LYCIUM_BUILD_OS" == "Linux" ]thenhostosname=linuxelif [ "$LYCIUM_BUILD_OS" == "Darwi" ]thenhostosname=darwinelseecho "System cannot recognize, exiting"return -1fiif [ $buildhost == true ]thentar -zxf $packagenamecd $builddir./configure --enable-static --enable-shared --disable-doc --disable-htmlpages \--target-os=$hostosname --disable-optimizations --prefix=`pwd`/hostbuild > $publicbuildlog 2>&1$MAKE >> $publicbuildlog 2>&1$MAKE install >> $publicbuildlog 2>&1export LD_LIBRARY_PATH=`pwd`/hostbuild/lib:$LD_LIBRARY_PATHsed -i.bak 's/include $(SRC_PATH)\/tests\/fate\/source.mak/#include $(SRC_PATH)\/tests\/fate\/source.mak/g' tests/Makefile$MAKE check >> $publicbuildlog 2>&1ret=$?buildhost=falsecd $OLDPWDfimkdir $pkgname-$ARCH-buildtar -zxf $packagename -C $pkgname-$ARCH-buildcd  $pkgname-$ARCH-build/$builddirpatch -p1 < ../../FFmpeg_oh_test.patchcd $OLDPWDif [ $ARCH == "armeabi-v7a" ]thensetarm32ENVarch=armldflags="-L${OHOS_SDK}/native/sysroot/usr/lib/arm-linux-ohos"elif [ $ARCH == "arm64-v8a" ]thensetarm64ENVarch=aarch64ldflags="-L${OHOS_SDK}/native/sysroot/usr/lib/aarch64-linux-ohos"elseecho "${ARCH} not support"return -1fireturn $ret
}build() {cd $pkgname-$ARCH-build/$builddirPKG_CONFIG_LIBDIR="${pkgconfigpath}" ./configure "$@" --enable-neon --enable-asm --enable-network \--disable-vulkan --enable-cross-compile --enable-librtmp --disable-x86asm --enable-openssl --enable-protocols \--enable-static --enable-shared --disable-doc --disable-htmlpages --target-os=linux --arch=$arch \--cc=${CC} --ld=${CC} --strip=${STRIP} --host-cc="${CC}" --host-ld="${CC}" --host-os=linux \--host-ldflags=${ldflags} --sysroot=${OHOS_SDK}/native/sysroot > $buildlog 2>&1$MAKE >> $buildlog 2>&1ret=$?cd $OLDPWDreturn $ret
}package() {cd $pkgname-$ARCH-build/$builddir$MAKE install >> $buildlog 2>&1cd $OLDPWD
}checktestfiles() {cd $pkgname-$ARCH-build/$builddir/tests/reftmpdir=("fate" "acodec" "lavf" "lavf-fate" "pixfmt" "seek" "vsynth")for dir in ${tmpdir[*]}dofor file in `ls $dir`doif [ ! -f $dir/$file ]; thencontinuefistr=`cat $dir/$file | grep "\*tests"`if [ ! -z "$str" ]thensed -i.bak 's/\*tests/tests/g' $dir/$filefidonedonecd $OLDPWD
}copyhostbin() {file=$1if [[ -f tests/$file ]] && [[ ! -f tests/$file.${ARCH} ]]thenmv tests/$file tests/$file.${ARCH}cp ../../$builddir/tests/$file tests/$filefi
}check() {cd $pkgname-$ARCH-build/$builddir# disable running cmdsed -i.bak 's/	$(Q)$(SRC_PATH)\/tests\/fate-run.sh/#	$(Q)$(SRC_PATH)\/tests\/fate-run.sh/g' tests/Makefile# disable check git sourcessed -i.bak 's/include $(SRC_PATH)\/tests\/fate\/source.mak/#include $(SRC_PATH)\/tests\/fate\/source.mak/g' tests/Makefile# disable check ffprobe,this use xmllint command, which ohos is not supportsed -i.bak 's/include $(SRC_PATH)\/tests\/fate\/ffprobe.mak/#include $(SRC_PATH)\/tests\/fate\/ffprobe.mak/g' tests/Makefile# change x86 cmd for generate test targetmv ffmpeg ffmpeg.${ARCH}cp ../../$builddir/ffmpeg ./retrytimes=0ret=0while truedo$MAKE check >> $buildlog 2>&1if [ $? -eq 0 ]thenbreak;ficopyhostbin base64copyhostbin audiomatchcopyhostbin audiogencopyhostbin videogencopyhostbin tiny_psnrcopyhostbin tiny_ssimcopyhostbin rotozoomlet retrytimes=$retrytimes+1if [ $retrytimes -gt 4 ]thenret=1breakfidonemv ffmpeg.${ARCH} ffmpegfor file in `ls tests/*.${ARCH}`dotmpfile=${file%.*}mv $file $tmpfiledone# reduction running cmd for real testsed -i.bak 's/#	$(Q)$(SRC_PATH)\/tests\/fate-run.sh/	$(Q)$(SRC_PATH)\/tests\/fate-run.sh/g' tests/Makefilecd $OLDPWDchecktestfilesecho "The test must be on an OpenHarmony device!"# skip running test on host# real test CMD# make checkreturn $ret
}recoverpkgbuildenv() {unset archunset ldflagsif [ $ARCH == "armeabi-v7a" ]thenunsetarm32ENVelif [ $ARCH == "arm64-v8a" ]thenunsetarm64ENVelseecho "${ARCH} not support"return -1fi
}# 清理环境
cleanbuild() {rm -rf ${PWD}/${builddir} ${PWD}/$pkgname-arm64-v8a-build ${PWD}/$pkgname-armeabi-v7a-build #${PWD}/$packagename
}
2. 构建过程

主入口 build.sh 脚本执行以下步骤:

  1. 解析命令行参数,确定要编译的目标库
  2. 检查编译环境(编译工具链等)
  3. 读取目标库的 HPKBUILD 配置
  4. 按照依赖关系顺序编译各个库
  5. 对每个库执行:
    • 获取源码
    • 配置编译参数
    • 执行编译
    • 安装到指定目录

检查编译环境代码:

# 检测操作系统类型
unames=`uname -s`
osname=${unames:0:5}# 设置根目录
LYCIUM_ROOT=$(cd $(dirname ${BASH_SOURCE[0]}); pwd)# 检查 OHOS_SDK 环境
if [ -z ${OHOS_SDK} ]
thenecho "OHOS_SDK 未设置..."exit 1
fi

依赖管理检测:

# 依赖库暂存文件
depend_tmp_file="/tmp/$USER-lycium_deps-$build_time"
export LYCIUM_DEPEND_PKGNAMES=$depend_tmp_file# 已完成库列表
donelist=()
donelibs=()

核心函数 buildhpk() 实现了构建流程控制:

  1. 任务分轮次执行
  2. 处理依赖关系
  3. 错误处理机制
    主要变量:
  • nextroundlist: 下一轮待构建项目
  • notdonelist: 未完成项目列表
  • buildfalselist: 构建失败项目列表

关键函数说明如下:
checkbuildenv()
检查必要的构建工具是否安装:

  • gcc, cmake, make 等基础工具

  • autoconf, automake 等自动化工具

  • git, curl 等辅助工具 prepareshell()
    为每个构建目录准备必要的脚本:

  • build_hpk.sh: 项目构建脚本

  • envset.sh: 环境设置脚本 makelibsdir()
    管理构建目录:

  • 检查目录有效性

  • 过滤已构建项目

  • 添加到构建队列

3. 交叉编译支持

框架通过以下方式实现交叉编译:

  1. 使用 OpenHarmony NDK 提供的交叉编译工具链
  2. 在 HPKBUILD 中配置交叉编译相关参数
  3. 支持 arm32/arm64/x86 等多架构编译
4. 产物输出

编译产物按照如下结构组织:

usr/└── ${pkgname}/└── ${ARCH}/├── lib/      # 库文件├── include/  # 头文件└── bin/      # 可执行文件
build_hpk.sh构建脚本说明

核心构建函数说明:

1. prepare()

准备构建环境:

  • 宿主机构建(buildhost=true时)
  • 解压源码包
  • 应用补丁
  • 设置交叉编译环境
2. build()

执行构建过程:

  • 配置构建参数
  • 执行configure配置
  • 执行make编译
  • 返回构建结果
3. package()

安装打包:

  • 执行make install
  • 生成最终安装包
4. check()

测试验证:

  • 修改测试配置
  • 准备测试环境
  • 执行测试用例
  • 处理测试结果
5. 环境管理函数
  • recoverpkgbuildenv()
    • 清理编译环境变量
    • 恢复原始环境
  • cleanbuild()
    • 清理构建目录
    • 删除临时文件

总结

本文介绍了HarmonyOS Next跨平台构建脚本功能、使用、以及原理,介绍了构建脚本相关的shell代码等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【远程视频必备】Briefing:安全视频群聊让远程办公无忧

文章目录 前言1.关于briefing2.本地部署briefing3.使用briefing4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定briefing公网地址 前言 对于有远程办公或者身处异地与家人好友视频聊天需求的人来说&#xff0c;在享受高效沟通的同时&#xff0c;也或多或少会有对信息泄…

热更新杂乱记

热更新主要有一个文件的MD5值的比对过程&#xff0c;期间遇到2个问题&#xff0c;解决起来花费了一点时间 1. png 和 plist 生成zip的时候再生成MD5值会发生变动。 这个问题解决起来有2种方案&#xff1a; &#xff08;1&#xff09;.第一个方案是将 png和plist的文件时间改…

Elementor Pro 3.27 汉化版 2100套模板 安装教程 wordpress主题中文编辑器插件免费下载

插件下载地址 https://a5.org.cn/a5ziyuan/732506.html 转载请注明出处! Elementor Pro 是流行的 Elementor 的付费扩展 WordPress 页面构建器插件. 它为免费的 Elementor 插件添加了许多附加功能和增强功能&#xff0c;使其成为创建美丽的更强大的工具 WordPress 网站。 如果…

计算机工程:解锁未来科技之门!

计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展&#xff0c;计算机技术已经深深渗透到我们生活的方方面面&#xff0c;从医疗、金融到教育&#xff0c;无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业&#xff0c;计算机技术的应用尤为突出。比如&a…

AT8870单通道直流电机驱动芯片

AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器&#xff0c;适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器&#xff0c;该驱动器由四个N-MOS组成&#xff0c;能够以高达3.6A的峰值电流双向控制电机。利用电流…

Vue2.0+ElementUI实现查询条件展开和收起功能组件

一、需求 el-form如果查询条件过多&#xff0c;影响页面的展示效果。查询条件表单是我们系统中非常常见的功能&#xff0c;我们需要把它封装成一个通用的组件&#xff0c;方便在系统开发中提升开发效率。除了在实现基本查询条件的功能上&#xff0c;还需要实现多条件的折叠和展…

Scrapy之一个item包含多级页面的处理方案

目标 在实际开发过程中&#xff0c;我们所需要的数据往往需要通过多个页面的数据汇总得到&#xff0c;通过列表获取到的数据只有简单的介绍。站在Scrapy框架的角度来看&#xff0c;实际上就是考虑如何处理一个item包含多级页面数据的问题。本文将以获取叶子猪网站的手游排行榜及…

MySQL8【学习笔记】

第一章前提须知 1.1 需要学什么 Dbeaver 的基本使用SQL 语句&#xff1a;最重要的就是查询&#xff08;在实战的时候&#xff0c;你会发现我们做的绝大部分工作就是 “查询”&#xff09;MySQL 存储过程&#xff08;利用数据库底层提供的语言&#xff0c;去进行业务逻辑的封装…

【JVM】垃圾收集器详解

你将学到 1. Serial 收集器 2. ParNew 收集器 3. Parallel Scavenge 收集器 4. Serial Old 收集器 5. Parallel Old 收集器 6. CMS 收集器 7. G1 收集器 在 Java 中&#xff0c;垃圾回收&#xff08;GC&#xff09;是自动管理内存的一个重要机制。HotSpot JVM 提供了多种…

SOME/IP服务接口

本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟&#xff0c;并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理&#xff0c;并结合实际代码展示 SOME/IP 的使用&#xff0c;旨在自我复习并与大家交流。文中引用了一些例图&#xff0c;但由于未能找到原作…

编写0号中断的处理程序

实验内容、程序清单及运行结果 编写0号中断的处理程序&#xff08;课本实验12&#xff09; 解&#xff1a; assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例…

Android系统开发(十五):从 60Hz 到 120Hz,多刷新率进化简史

引言 欢迎来到“帧率探索实验室”&#xff01;今天&#xff0c;我们要聊聊 Android 11 中对多种刷新率设备的支持。你可能会问&#xff1a;“这和我写代码有什么关系&#xff1f;”别急&#xff0c;高刷新率不仅仅让屏幕更顺滑&#xff0c;还会直接影响用户体验。想象一下&…

基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…

国内有哪些著名的CRM系统提供商?

嘿&#xff0c;你有没有想过&#xff0c;在这个信息爆炸的时代里&#xff0c;企业怎么才能更好地管理客户关系呢&#xff1f;答案就是使用高效的CRM系统。今天我就来给大家聊聊那些在国际上非常有名的CRM系统提供商吧。 悟空CRM 首先不得不提的就是悟空CRM了&#xff01;这可…

Linux中的几个基本指令(二)

文章目录 1、cp指令例一&#xff1a;例二&#xff1a;例三&#xff1a;例四&#xff1a;例五&#xff1a; 2、mv 指令例一&#xff1a;例二&#xff1a; 3、cat指令例一&#xff1a; 4、tac指令5、which指令6、date指令时间戳&#xff1a;7、zip指令 今天我们继续学习Linux下的…

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…

9. 神经网络(一.神经元模型)

首先&#xff0c;先看一个简化的生物神经元结构&#xff1a; 生物神经元有多种类型&#xff0c;内部也有复杂的结构&#xff0c;但是可以把单个神经元简化为3部分组成&#xff1a; 树突&#xff1a;一个神经元往往有多个树突&#xff0c;用于接收传入的信息。轴突&#xff1a;…

Web 音视频(二)在浏览器中解析视频

前言 浏览器中已经能直接播放视频&#xff0c;为什么还需要手动写代码解析&#xff1f; 因为&#xff0c;某些场景需要对视频进行更细致的处理&#xff0c;比如截取关键帧、提取视频中的文字、人物打码、极低延时播放视频等等。 总之&#xff0c;除了最单纯的视频播放外&…

ETLCloud在iPaas中的是关键角色?

在当今的数字化时代&#xff0c;企业越来越依赖于其处理和分析数据的能力。为了实现这一目标&#xff0c;企业需要将各种异构的应用和数据源集成在一起&#xff0c;形成一个统一的数据视图。在这一过程中&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;和iPa…