电子说
在添加一个模块的时候,需要在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" # 必选,所属部件名称
}
注意 :部件间依赖要写在external_deps里面,格式为”部件名:模块名"的形式,并且依赖的模块必须是依赖的部件声明在inner_kits中的模块。
在添加模块时,可选地对该模块开启编译器提供的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:
发布、调测模式
通过debug
选项控制使用发布模式还是调测模式,默认为发布模式,使用debug = true
显式声明开启调测模式。debug
选项仅对Sanitizer生效,且与模块是否编译为调试版本无关,但在模块发布版本的编译配置中不应带此选项,或显式地将debug
设置为false
,使得Sanitizer处于发布模式。
屏蔽名单
指定该模块中不受Sanitizer选项影响的函数或源程序文件名单,用于避免良性行为被识别为错误、热点函数产生了不合理、不可接受的开销;该名单需谨慎使用。名单示例如下所示:
[cfi]
fun:*([Tt]est|TEST)*
fun: main
[integer]
src:example/*.cpp
开源软件Notice是与项目开源相关的文件,收集这些文件的目的是为了符合开源的规范。
收集目标
只收集打包到镜像里面的模块对应的License;不打包的都不收集,比如构建过程使用的工具(如clang、python、ninja等)都是不收集的。
静态库本身是不会被打包的,一般是作为动态库或者可执行程序的一部分被打包到系统中的,为了确保完备,静态库的都会收集。
最终合并的NOTICE.txt要体现出镜像中每个文件都是用了哪些License,模块和License要有对应关系。
最终合并的NOTICE.txt文件在/system/etc/ 目录下。
收集规则
按照优先级收集License,以下由1到4,优先级依次降低。
ohos_shared_library("example") {
...
license_file = "path-to-license-file"
...
}
需要注意及检查的问题
编译时,适当选择添加以下的编译参数可以加快编译的过程。
out/rk3568/.ninja_log文件记录了每个模块编译的开始和结束时间(ms),结束时间和开始时间间隔越短表示模块的编译时间越短,编译性能越高。
从左到右分别表示:start time|end time|mtime|command hash。
图形化显示编译时间。
针对同一个芯片解决方案下的子产品的定制能力,将差异能力放到 chip_prod 分区,因此需要支持对不同子产品生成对应的 chip_prod.img。
"chipprod_config_path"
配置选项,即"chipprod_config_path":"子产品定义文件所在的路径"
。 其中子产品定义文件的文件名为chip_product_list.gni
,文件格式为:chip_product_list = ["productA", "productB", ...]
。{
"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" ] }
]
},
{
......
}
......
更多子系统和部件
}
}
install_images
和module_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
`HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿`
4. 打包结果:
如果定义了子产品productA和productB,即chip_product_list = ["productA", "productB"],
并且有模块安装到了该产品下,则打包后镜像输出路径如下:
images/productA/chip_prod.img
images/productB/chip_prod.img
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !