鸿蒙OpenHarmony:【关于deps、external_deps的使用】

 关于deps、external_deps的使用

在添加一个模块的时候,需要在BUILD.gn中声明它的依赖,为了便于后续处理部件间依赖关系,我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。

依赖分类

依赖关系分类

开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。

如上图所示,主要分为部件内依赖(图左)和部件间依赖(图右)。

  • 部件内依赖: 现有模块module1属于部件part1,要添加一个属于部件part1的模块module2,module2依赖于module1,这种情况就属于部件内依赖。
  • 部件间依赖: 现有模块module1属于部件part1,要添加一个模块module2,module2依赖于module1,module2属于部件part2。模块module2与模块module1分属于两个不同的部件,这种情况就属于部件间依赖。
  • 部件内依赖示例:

    import("//build/ohos.gni")
    ohos_shared_library("module1") {……part_name = "part1"   # 必选,所属部件名称……
    }
    import("//build/ohos.gni")
    ohos_shared_library("module2") {……deps = ["module1的gn target",……]                        # 部件内模块依赖
    part_name = "part1"       # 必选,所属部件名称
    }

  • 部件间依赖示例:

    import("//build/ohos.gni")
    ohos_shared_library("module1") {……part_name = "part1"   # 必选,所属部件名称……
    }
    import("//build/ohos.gni")
    ohos_shared_library("module2") {……external_deps = ["part1:module1",……]                      # 部件间模块依赖,这里依赖的模块必须是依赖的部件声明在inner_kits中的模块part_name = "part2"    # 必选,所属部件名称
    }

    icon-note.gif

    注意:部件间依赖要写在external_deps里面,格式为”部件名:模块名"的形式,并且依赖的模块必须是依赖的部件声明在inner_kits中的模块。

Sanitizer使用说明

在添加模块时,可选地对该模块开启编译器提供的Sanitizer功能,包括整数溢出排错、控制流完整性检查等。配置的每一项都是可选的,如不指定默认为false或者空。Sanitizer配置示例如下所示:

 ohos_shared_library("example") {sanitize = {cfi = true                             # 开启控制流完整性检测cfi_cross_dso = true                   # 开启跨so调用的控制流完整性检测integer_overflow = true                # 开启整数溢出检测boundary_sanitize = true               # 开启边界检测ubsan = true                           # 开启部分ubsan选项all_ubsan = true                       # 开启全量ubsan选项debug = true                           # 可选,调测模式,默认是不开启blocklist = "./blocklist.txt"          # 可选,屏蔽名单路径}...}

支持的Sanitizer类型

目前支持开启的Sanitizer:

  • 整数溢出排错:unsigned_integer_overflow/signed_integer_overflow/integer_overflow(同时包括无符号和有符号整数溢出两种检查)
  • 控制流完整性:cfi、cfi_cross_dso(跨so的cfi检查)
  • 边界检测:boundary_sanitize
  • 部分未定义行为检测:ubsan(bool,integer-divide-by-zero,return,returns-nonnull-attribute,shift-exponent,unreachable,vla-bound等编译选项)
  • 全量未定义行为检测:all_ubsan(全量undefined behavior sanitizer编译选项)

发布、调测模式

通过debug选项控制使用发布模式还是调测模式,默认为发布模式,使用debug = true显式声明开启调测模式。debug选项仅对Sanitizer生效,且与模块是否编译为调试版本无关,但在模块发布版本的编译配置中不应带此选项,或显式地将debug设置为false,使得Sanitizer处于发布模式。

  • 调测模式:用于开发时排查问题。该模式下会输出产生错误相关的丰富信息来辅助定位错误,并且在发生错误后并不会直接中断程序运行,而是会恢复程序运行进一步识别后续的错误。
  • 发布模式:保护程序不发生错误或被恶意攻击,在产生错误后直接中断程序不会继续执行。

屏蔽名单

指定该模块中不受Sanitizer选项影响的函数或源程序文件名单,用于避免良性行为被识别为错误、热点函数产生了不合理、不可接受的开销;该名单需谨慎使用。名单示例如下所示:

[cfi]
fun:*([Tt]est|TEST)*
fun: main[integer]
src:example/*.cpp

开源软件Notice收集策略说明

开源软件Notice是与项目开源相关的文件,收集这些文件的目的是为了符合开源的规范。

收集目标

只收集打包到镜像里面的模块对应的License;不打包的都不收集,比如构建过程使用的工具(如clang、python、ninja等)都是不收集的。

静态库本身是不会被打包的,一般是作为动态库或者可执行程序的一部分被打包到系统中的,为了确保完备,静态库的都会收集。

最终合并的NOTICE.txt要体现出镜像中每个文件都是用了哪些License,模块和License要有对应关系。

最终合并的NOTICE.txt文件在/system/etc/ 目录下。

收集规则

按照优先级收集License,以下由1到4,优先级依次降低。

  1. 模块在BUILD.gn中直接声明自己使用的License文件,优先级最高。如下示例:

    ohos_shared_library("example") {...license_file = "path-to-license-file"...
    }

  2. 如果模块没有显式声明,那么编译脚本会在BUILD.gn所在的当前目录中查找Readme.OpenSource文件,解析该文件,找出该文件中声明的license,将其作为模块的License。 如果Readme.OpenSource文件中配置的license文件不存在,直接报错。
  3. 如果Readme.OpenSource文件不存在,编译脚本会从当前目录开始,向上层目录寻找(一直找到源码的根目录),默认查找License、Copyright、Notice三个文件,如果找到,则将其作为模块的License。
  4. 如果上面三种方式都未找到license,则使用默认的license作为该模块的license;默认license是Apache2.0 License。

需要注意及检查的问题

  • 三方的开源软件,比如openssl,icu等,这部分软件基本上在源码目录下都要求配置Readme.OpenSource,要检查Readme.OpenSource文件是否和BUILD.gn文件在同一个目录,以及Readme.OpenSource文件中配置的License文件是否存在以及真实有效。
  • 代码目录下,如果代码使用的不是Apache2.0 License,需要在目录下提供对应的License文件,或者直接在模块中指定license_file。
  • 如果BUILD.gn中添加的源码文件不是当前目录的,需要检查下源码文件所在仓下的license是否和BUILD.gn文件所在仓的一致。

加快本地编译的一些参数

编译时,适当选择添加以下的编译参数可以加快编译的过程。

  • 添加--ccache参数:

    • 原理:ccache会缓存c/c++编译的编译输出,下一次在编译输入不变的情况下,直接复用缓存的产物。
    • 安装:

      • 快速安装:执行sudo apt-get install ccache命令。
      • 官网下载,下载二进制文件,把ccache所在路径配置到环境变量。
    • 使用:执行./build.sh --product-name 产品名 --ccache命令。
  • 添加--fast-rebuild参数

    • 原理:编译流程主要分为:preloader->loader->gn->ninja这四个过程,在本地没有修改gn和产品配置相关文件的前提下,添加--fast-rebuild会让你直接从ninja编译开始。
    • 使用:执行./build.sh --product-name 产品名 --fast-rebuild命令。
  • 添加enable_notice_collection=false参数

    • 原理:省略掉收集开源软件模块的license的过程。
    • 使用:执行./build.sh --product-name 产品名 --gn-args --enable_notice_collection=false --ccache命令。
  • 添加--build-target参数

    • 该参数用于指定编译模块,如何找模块的名字:

      • 相关仓下BUILD.gn中关注group、ohos_shared_library、ohos_executable等关键字。
      • ./build.sh --product-name 产品名 --build-target 模块名 --build-only-gn生成build.ninja,然后去该文件中查找相关模块名。
    • 使用:执行./build.sh --product-name 产品名 --build-target ark_js_host_linux_tools_packages命令。

查看NinjaTrace

out/rk3568/.ninja_log文件记录了每个模块编译的开始和结束时间(ms),结束时间和开始时间间隔越短表示模块的编译时间越短,编译性能越高。

从左到右分别表示:start time|end time|mtime|command hash。

Ninja_Trace

图形化显示编译时间。

  • 本地打开ninja trace: 解压out/rk3568/build.trace.gz,将build.trace拖到chrome的trace链接chrome://tracing/打开即可。
  • 在CI网站ci.openharmony.cn/events上打开ninja trace: CI上每个编译的输出里面有build.trace.html可直接打开,具体方法是:

    1. 点击静态检查下的“成功”;
    2. 点击输出列的“输出”即可在左侧的build_trace列看到build.trace.html文件,单击该文件即可打开。

定制打包chip_prod镜像使用说明

背景

针对同一个芯片解决方案下的子产品的定制能力,将差异能力放到 chip_prod 分区,因此需要支持对不同子产品生成对应的 chip_prod.img。

使用步骤

  1. 产品解决方案配置:
    产品解决方案配置文件config.json中添加"chipprod_config_path"配置选项,即"chipprod_config_path":"子产品定义文件所在的路径"。 其中子产品定义文件的文件名为chip_product_list.gni,文件格式为:chip_product_list = ["productA", "productB", ...] 。
    示例:
    以MyProduct产品定制chipprod镜像为例,//vendor/产品厂商/MyProduct/config.json配置如下:

    {"product_name": "MyProduct",                                 # 产品名称"version": "3.0",                                            # config.json的版本号, 固定"3.0""chipprod_config_path": "",                                  # 存放chipprod配置文件路径,可选项"subsystems": [{"subsystem": "arkui",                                    # 选择的子系统"components": [{"component": "ace_engine","features":[ "ace_engine_feature_enable_web = true","ace_engine_feature_enable_accessibility = true" ] }   ]},{......}......更多子系统和部件}
    }

  2. 模块编译配置:
    某个配置文件在不同的子产品中有差异,比如要打包到productA对应的chip_prod.img中,则模块编译需要配置install_imagesmodule_install_dir
    ohos_prebuilt_executable示例:

    ohos_prebuilt_executable("moduleXXX"){install_images = [ "chip_prod" ]module_install_dir = "productA/etc/***"     # module_install_dir指定的路径需要以productA开始。
    }

3.编译命令

./build.sh --product-name {product_name} --build-target chip_prod_image

搜狗高速浏览器截图20240326151450.png

  1. 打包结果:
    如果定义了子产品productA和productB,即chip_product_list = ["productA", "productB"],并且有模块安装到了该产品下,则打包后镜像输出路径如下:

    images/productA/chip_prod.img
    images/productB/chip_prod.img

鸿蒙Next核心技术分享

1、鸿蒙基础知识←《鸿蒙NEXT星河版开发学习文档》

2、鸿蒙ArkUI←《鸿蒙NEXT星河版开发学习文档》

3、鸿蒙进阶技术←《鸿蒙NEXT星河版开发学习文档》

 4、鸿蒙就业高级技能←《鸿蒙NEXT星河版开发学习文档》 

 5、鸿蒙多媒体技术←《鸿蒙NEXT星河版开发学习文档》 

6、鸿蒙南向驱动开发←《鸿蒙NEXT星河版开发学习文档》  

7、鸿蒙南向内核设备开发←《鸿蒙NEXT星河版开发学习文档》  

 8、鸿蒙系统裁剪与移植←《鸿蒙NEXT星河版开发学习文档》  

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

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

相关文章

conan2 基础入门(01)-介绍

conan2 基础入门(01)-介绍 文章目录 conan2 基础入门(01)-介绍⭐什么是conan官网Why use Conan? ⭐使用现状版本情况个人知名开源企业 ⭐ConanCenter包中心github ⭐说明文档END ⭐什么是conan 官网 官网:Conan 2.0: C and C Open Source Package Manager 一句话来…

Array.map解析

map方法会创建一个新数组。该方法会循环数组中的每个值,如果仅仅是想循环数组不需要返回值使用数组的forEach方法就可以。原数组中的每个元素都调用一次提供的函数后的返回值组成。Array.map 它接收一个函数 这个函数可以接收三个参数 数组的每个值item 这个值的索引…

SC-Lego-LOAM建图与ndt_localization的实车实现

参考:https://blog.csdn.net/weixin_44303829/article/details/121524380 https://github.com/AbangLZU/SC-LeGO-LOAM.git https://github.com/AbangLZU/ndt_localizer.git 将建图和定位分别使用lego-loam和ndt来进行,实车上的效果非常不错,…

STM32F103学习笔记 | 7.使用寄存器点亮LED灯

int main(void) { // 分析指南者硬件原理图得知要实现点亮灯泡需要将PB0设置为低电位, // 查阅STM32F10x中文手册的端口配置低寄存器,得知一个PB有8个配置位,查阅手册找到了PB0的位置是3:2位置, // 插入未知知识:将端…

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件 <?php class Email { //---设置全局变量 var $mailTo ""; // 收件人 var $mailCC ""; // 抄送 var $mailBCC ""; // 秘密抄送 var $mailFrom ""; // 发件人 var $mailSubje…

获取Android开发板已连接WiFi密码

硬件/软件环境&#xff1a; 1&#xff09;全志芯片开发板A40i 2&#xff09;Android Studio Giraffe | 2022.3.1 Patch 3 连接条件&#xff1a; 1)两端都是USB-A接口线&#xff0c;一端插入电脑端USB接口&#xff0c;另一端插入开发板USB接口&#xff1b; 2&#xff09;Andr…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; #Options local_llm llama3 llm ChatOllama(modellocal_llm, format"json", temperature0) #embeddings #embeddings OllamaEmbeddings(model"nomic-embed-text") embed…

作为网络安全工程师需要掌握的安全小知识!

网络安全风险无处不在&#xff0c;今天为大家梳理了一些网络安全相关的小知识&#xff0c;希望能进一步提升大家的安全意识&#xff0c;帮助大家建立更加安全的网络环境。 一、主机电脑安全 1、操作系统安全&#xff1a;安装操作系统时需要选择合适的版本&#xff0c;及时打补…

制造业如何选择合适的项目管理软件?(内含软件推荐)

近期&#xff0c;收到很多小伙伴的提问&#xff1a;“想了解制造行业如何选择到合适的项目管理软件&#xff1f;”在竞争激烈的市场环境中&#xff0c;有效的项目管理对于制造业的发展至关重要&#xff0c;而项目管理软件则是重要支撑&#xff0c;能帮助企业更好地规划和跟踪项…

ok_Keil实用小技巧 | Keil定制Hex文件名实现的方法

Keil实用小技巧 | Keil定制Hex文件名实现的方法 echo off REM 可执行文件&#xff08;Hex&#xff09;文件名 set HEX_NAMEDemo REM 可执行文件&#xff08;Hex&#xff09;文件路径 set HEX_PATH.\Objects REM 定制Hex输出路径 set OUTPUT_PATH.\Output REM 软件版本文件…

大模型微调之 在亚马逊AWS上实战LlaMA案例(八)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;八&#xff09; 微调技术 Llama 等语言模型的大小超过 10 GB 甚至 100 GB。微调如此大的模型需要具有非常高的 CUDA 内存的实例。此外&#xff0c;由于模型的大小&#xff0c;训练这些模型可能会非常慢。因此&#xff0c…

element 输入框禁止输入空格以及复制的值进去删除空格(vue自定义指令)开箱即用

实例图&#xff1a; 代码&#xff1a; //输入框禁止输入空格 Vue.directive(noSpace, {bind(el) {//禁止输入空格el.addEventListener("keydown", function (event) {if (event.keyCode 32) {event.preventDefault();}});//复制值时去掉空格el.addEventListener(&q…

node——使用localtunnel做内网穿透

前言 内网穿透是一种允许外网用户访问内网主机的技术。 将您的本地主机公开到世界各地&#xff0c;使之能访问&#xff0c;无需混淆DNS或部署。 内网穿透技术通常涉及以下几个关键步骤&#xff1a; 使用公网服务器或NAT&#xff08;网络地址转换&#xff09;设备&#xff1a;这…

「51媒体」邀请媒体参会报道和媒体发稿有啥不同

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体参会报道和媒体发稿是新闻报道的两种不同形式&#xff0c;它们的主要区别在于内容来源、报道方式和目的。 内容来源&#xff1a; 媒体参会报道&#xff1a;通常指的是记者或媒体代…

火绒安全原理、用法、案例和注意事项

火绒安全是一款功能强大的安全软件&#xff0c;它采用了先进的安全技术和算法&#xff0c;通过实时监测、恶意代码识别、防火墙功能、沙箱技术和网络保护等多种手段&#xff0c;为用户提供全面的计算机安全防护。 1.为什么选用火绒安全&#xff1f; 火绒安全是一款优秀的安全软…

2024年第九届数维杯大学生数学建模挑战赛B 题思路1.0版本

B题&#xff1a;生物质和煤共热解问题的研究 数维杯分享资料&#xff08;问题一代码论文思路&#xff09;链接&#xff08;18点更新&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1GSv9dkqcY6G-XUnd0sJe_A 提取码&#xff1a;sxjm 题目分析&#xff1…

4G,5G执法记录仪人脸识别、人脸比对使用说明

4G/5G执法记录仪或4G/5G智能安全帽&#xff0c;做前端人脸识别、人脸比对&#xff0c;采用了上市公司的成熟的人脸识别算法&#xff0c;需要支付LICENSE给算法公司&#xff0c;理论上前端设备支持30K的人脸库&#xff08;受设备运行内存限制&#xff09;。 4G/5G执法记录仪侧要…

【Spring源码分析】ResolvableType

【Spring源码分析】ResolvableType 参考 目录 文章目录 【Spring源码分析】ResolvableType一、ParameterizedType 参数化类型&#xff0c;即泛型&#xff1b;例如&#xff1a;List< T>、Map< K,V>等带有参数化的对象;二、GenericArrayType—— 泛型数组 泛型数组…

Flink container exit 143 问题排查

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

一站式PDF解决方案:如何部署自己的PDF全能工具(Docker部署和群晖部署教程)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 开始部署 📒📝 Docker部署📝 群晖部署📝 本地安装⚓️ 相关链接 ⚓️📖 介绍 📖 在数字化办公的今天,PDF文件几乎成了我们日常工作中不可或缺的一部分。但你是否曾因为PDF文件的编辑、转换、合并等问题而头疼?如果…