开源软件Notice是与项目开源相关的文件,收集这些文件的目的是为了符合开源的规范。
收集目标
只收集打包到镜像里面的模块对应的License;不打包的都不收集,比如构建过程使用的工具(如clang、python、ninja等)都是不收集的。
静态库本身是不会被打包的,一般是作为动态库或者可执行程序的一部分被打包到系统中的,为了确保完备,静态库的都会收集。
最终合并的NOTICE.txt要体现出镜像中每个文件都是用了哪些License,模块和License要有对应关系。
最终合并的NOTICE.txt文件在/system/etc/ 目录下。
收集规则
按照优先级收集License,以下由1到4,优先级依次降低。
- 模块在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命令。
- 使用:执行./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: 解压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。
使用步骤
- 产品解决方案配置:
产品解决方案配置文件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_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
4.打包结果:
如果定义了子产品productA和productB,即chip_product_list = ["productA", "productB"],并且有模块安装到了该产品下,则打包后镜像输出路径如下:images/productA/chip_prod.img images/productB/chip_prod.img
那么很多小伙伴肯定主要是查找一些鸿蒙开发相关的内容提升自己,在这里,我为大家准备了一套《Open Harmony4.0&Next》的学习导图,从入门到进阶再到南北向开发实战的一整套完整体系,想要学习了解更多鸿蒙开发的相关知识可以借鉴:《做鸿蒙应用开发到底学习些啥?》
除了以上的知识内容,我还为大家整理了一份《鸿蒙 (Harmony OS)开发学习手册》都是整理成PDF文档方式,分享给大家参考学习:《鸿蒙基础入门开发宝典!》
《鸿蒙 (Harmony OS)开发学习手册》
一、入门必看
1. 应用开发导读(ArkTS)
2. 应用开发导读(Java)
3.......
二、HarmonyOS 概念
1. 系统定义
2. 技术架构
3. 技术特性
4. 系统安全
5......
三、如何快速入门?《鸿蒙开发学习指南》
1. 基本概念
2. 构建第一个ArkTS应用
3. 构建第一个JS应用
4. ……
四、开发基础知识
1. 应用基础知识
2. 配置文件
3. 应用数据管理
4. 应用安全管理
5. 应用隐私保护
6. 三方应用调用管控机制
7. 资源分类与访问
8. 学习ArkTS语言
9. ……
五、基于ArkTS 开发
1. Ability开发
2. UI开发
3. 公共事件与通知
4. 窗口管理
5. 媒体
6. 安全
7. 网络与链接
8. 电话服务
9. 数据管理
10. 后台任务(Background Task)管理
11. 设备管理
12. 设备使用信息统计
13. DFX
14. 国际化开发
15. 折叠屏系列
16. ……
更多了解更多鸿蒙开发的相关知识可以参考:《做鸿蒙应用开发到底学习些啥?》