如何让加快OpenHarmony编译速度?

devtools/2024/9/22 21:35:19/

OpenHarmony 有两种编译方式,一种是通过 hb 工具编译,一种是通过 build.sh 脚本编译。本文笔者将提升 build.sh 方式编译速度的方法整理如下:

因为笔者只用 build.sh 脚本编译,没用过 hb 工具,好像下面的选项也可以用于 hb 工具

  • 在 OpenHarmony 源码中执行./build.sh --h,会打印出./build.sh 中可以添加的所有选项
$ ./build.sh -h
++++++++++++++++++++++++++++++++++++++++
The system shell is bash 4.4.20(1)-release
++++++++++++++++++++++++++++++++++++++++
2023-02-07 12:58:04
-h
Usage: entry.py [options]Options:-h, --help            show this help message and exit--source-root-dir=SOURCE_ROOT_DIR--product-name=PRODUCT_NAME--device-name=DEVICE_NAME--target-cpu=TARGET_CPU--target-os=TARGET_OS--compile-config=COMPILE_CONFIG-T BUILD_TARGET, --build-target=BUILD_TARGET--gn-args=GN_ARGS     --ninja-args=NINJA_ARGS-v, --verbose         --keep-ninja-going    --sparse-image        --jobs=JOBS           --export-para=EXPORT_PARA--build-only-gn       --ccache              --fast-rebuild        --disable-package-image--disable-post-build  --disable-part-of-post-build=DISABLE_PART_OF_POST_BUILD--log-level=LOG_LEVEL--device-type=DEVICE_TYPE--build-variant=BUILD_VARIANT--share-ccache=SHARE_CCACHE
=====build  successful=====

提升 OpenHarmony 编译速度的选项

build.sh 脚本编译 rk3568 方式命令如下:

./build.sh --product-name rk3568 --ccache

通过在该命令后添加如下选项提升编译速度

添加 --jobs 参数

  • 为编译添加多线程并发执行
./build.sh --product-name rk3568 --jobs=N

N 为工作线程数(ninja 默认的 N 是 cpu 核数 +2)

  • 根据系统的内核数设置工作线程的默认数。在构建大型项目时,速度可能会受到主线程分派工作和连接依赖关系图的速度的限制。如果有太多的工作线程,主线程就会被耗尽,并且它的整体运行速度会变慢。
  • 从理论上和实验上看,工作线程数比物理 cpu 数少一个是一个不错的值。但是总是至少使用一些 worker 来防止我们在低端系统上对 I/0 延迟过于敏感。
  • oh gn 目前的瓶颈点不在于并发度的设置,主要是阻塞式的调用 py 脚本的执行,这个已经在优化中,预计很快会解决掉。

添加 --disable-post-build 参数:

  • 取消 Postbuild 过程,最后的 ninja trace 解析、每个子系统(不包括源码中的 third_party 部分)的 rom size 统计等动作会没有(每个子系统部件描述文件名称为 bundle.json,里面定义了子系统的名称。)
  • 提供支持 disable post build 参数是怎么做的 https://gitee.com/openharmony/build/issues/I5MT9X
./build.sh --product-name rk3568 --disable-post-build

添加 --disable-package-image 参数

  • 取消最后所有的 image 镜像文件压缩成 tar 包的动作
  • tar 包位置 out\rk3568\images.tar.gz
./build.sh --product-name rk3568 --disable-package-image

添加 --ccache 参数:

  • ccache 会缓存 c/c++ 编译的编译输出,下一次在编译输入不变的情况下,直接复用缓存的产物。用来缓存编译过的.o 文件等
  • 执行 sudo apt-get install ccache 命令安装 ccache
  • 再在 --ccache 后添加 export CCACHE_NOHASHDIR=“true” 和 export CCACHE_SLOPPINESS=“include_file_ctime” (设置 ccache 在做 hash 的时候不 hash 路径、不检查文件的 change time)
./build.sh --product-name rk3568 --ccache export CCACHE_NOHASHDIR="true" export CCACHE_SLOPPINESS="include_file_ctime"

添加 --fast-rebuild 参数

  • 编译流程主要分为:preloader->loader->gn->ninja 这四个过程,添加后直接基于已有 out/rk3568/build.ninja 直接执行编译链接步骤,跳过前面的产品配置解析和 gn 解析,在 gn 相关脚本没有发生改变的前提下使用
./build.sh --product-name rk3568 --fast-rebuild

添加 --gn-args enable_notice_collection=false 参数

  • notice file 的搜集用于产品化的 LICENSE 生成,取消收集开源 notice 的过程,在非产品化场景开发态可关闭,提升编译速度,节省编译~7% 时间。
  • OpenHarmony 开源软件 Notice 收集策略说明
./build.sh --product-name rk3568 --gn-args enable_notice_collection=false

添加 --build-only-gn 参数

  • 重新执行 Preloader、loader、gn,不进行最后的编译动作

编译流程主要分为:preloader->loader->gn->ninja 这四个过程,标准系统的编译构建过程请参考 https://ost.51cto.com/posts/13594

添加 --build-target 参数

  • 该参数用于指定编译模块
  • 如何找模块的名字:
    • 相关仓下 BUILD.gn 中关注 group、ohos_shared_library、ohos_executable 等关键字。
    • ./build.sh --product-name 产品名 --build-target 模块名 --build-only-gn 生成 build.ninja,然后去该文件中查找相关模块名。

添加 --gn-args enable_lto_O0=true 参数

  • 在链接的时候会减弱优化的等级,建议在只考虑编译是否成功的时候使用(会影响最后的 so 的性能和 rom 大小)

添加 --gn-args archive_ndk=false 参数

  • 编译 sdk 的时候不执行输出压缩包的动作

添加 export NO_DEVTOOL=1 参数

  • 取消 webpack 打包过程中生成 sourcemap 的动作

添加 --gn-args skip_generate_module_list_file=true 参数

  • 跳过为 test 生成记录文件的过程,节省 gn 解析的过程,只要不跑 tdd 测试用例,这个参数都可以加上,编译 tdd 用例也没关系

添加 -T packages --gn-args skip_gen_module_info=true 参数

  • 在不编译 image 的时候:-T packages --gn-args skip_gen_module_info=true,去掉 gn 阶段 module info 的生成
./build.sh --product-name rk3568 --build-target 模块名 -T packages --gn-args skip_gen_module_info=true

添加 --gn-args load_test_config=false 参数

  • 在不编译 test 用例的时候加上 --gn-args load_test_config=false,来去掉 gn 阶段 test 相关编译目标的解析

以上参数可叠加使用

例如全量编译,笔者使用下面这条命令编译速度提升了 120%:

./build.sh --product-name rk3568 --disable-post-build --disable-package-image --gn-args enable_notice_collection=false --gn-args load_test_config=false

添加 --fast-rebuild 参数 方式等效于执行 ninja -C

  • 首先用./build.sh 全量编译,然后在源码下执行 ninja -C out/rk3568 moduleb_lib(编译对象模块)
# 例如编译wukong部件的二进制可执行文件wukong
# 将gn和ninja可执行文件添加到PATH环境变量的方法(临时改变,只能在当前的终端窗口中有效)
export PATH=$PATH:/home/jiajiahao/ohos3.2beta4/sources/prebuilts/build-tools/linux-x86/bin
# 然后在源码目录下执行如下语句
ninja -C out/rk3568 wukong

# 例如编译ace_napi部件的动态库libace_napi.z.so
# 将gn和ninja可执行文件添加到PATH环境变量的方法(临时改变,只能在当前的终端窗口中有效)
export PATH=$PATH:/你自己的源码路径/sources/prebuilts/build-tools/linux-x86/bin
# 然后在源码目录下执行如下语句
ninja -C out/rk3568 ace_napi

将 gn 和 ninja 可执行文件添加到 PATH 环境变量的方法

将 gn 和 ninja 可执行文件添加到 PATH 环境变量的方法(临时改变,只能在当前的终端窗口中有效)

# 找到读者你自己的OpenHarmony源码目录下的gn和ninja可执行文件绝对路径,在源码下/prebuilts/build-tools/linux-x86/bin
export PATH=$PATH:/home/xxx/xxx/sources/prebuilts/build-tools/linux-x86/bin

例如笔者的 gn 和 ninja 可执行文件绝对路径

export PATH=$PATH:/home/jiajiahao/ohos3.2beta4/sources/prebuilts/build-tools/linux-x86/bin

notice file 是否收集的编译选项–gn-args enable_notice_collection=false 是如何支持的

指定编译期间的日志级别

  • 在 OpenHarmony 的 build.sh 里通过–log-level 可以指定编译期间的日志级别,三个级别可选:debug, info 和 error,默认值是 info
./build.sh --product-name rk3568 --ccache --log-level=debug
  • 本地打开 ninja trace: 解压 out/rk3568/build.trace.gz,将 build.trace 拖到 chrome 的 trace 链接  chrome://tracing/ 打开即可。

码牛课堂也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线。大家可以进行参考学习:https://qr21.cn/FV7h05

①全方位,更合理的学习路径
路线图包括ArkTS基础语法、鸿蒙应用APP开发、鸿蒙能力集APP开发、次开发多端部署开发、物联网开发等九大模块,六大实战项目贯穿始终,由浅入深,层层递进,深入理解鸿蒙开发原理!

②多层次,更多的鸿蒙原生应用
路线图将包含完全基于鸿蒙内核开发的应用,比如一次开发多端部署、自由流转、元服务、端云一体化等,多方位的学习内容让学生能够高效掌握鸿蒙开发,少走弯路,真正理解并应用鸿蒙的核心技术和理念。

③实战化,更贴合企业需求的技术点
学习路线图中的每一个技术点都能够紧贴企业需求,经过多次真实实践,每一个知识点、每一个项目,都是码牛课堂鸿蒙研发团队精心打磨和深度解析的成果,注重对学生的细致教学,每一步都确保学生能够真正理解和掌握。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:https://qr21.cn/FV7h05

如何快速入门:

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05

大厂鸿蒙面试题::https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙
音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.ppmy.cn/devtools/38735.html

相关文章

设计模式之拦截过滤器模式

想象一下,在你的Java应用里,每个请求就像一场冒险旅程,途中需要经过层层安检和特殊处理。这时候,拦截过滤器模式就化身为你最可靠的特工团队,悄无声息地为每一个请求保驾护航,确保它们安全、高效地到达目的…

C++每日一练——两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2]示例 2: 输入:nums…

SQL优化详解

目录 插入数据 insert的优化(少量数据) 批量插入 手动事务提交 主键顺序插入 插入大量数据 主键优化 数据组织方式: 页分裂: 主键顺序插入的方式: 主键乱序插入: 页合并: 主键设计…

docker-compose安装 人大金仓数据库

下载官网安装包 将安装包重命名为: kingbase.tar 再导入镜像仓库 docker load -i kingbase.tar目录创建data文件夹创建docker-compose文件 version: 3 services: kingbase: image: kingbase:v1 container_name: kingbaseports: - "54321:54321" volumes: -…

探讨关于AutoPSA里CII算法的结构荷载

UKP3D,AutoPDMS导出应力计算文件至管道应力分析软件分析,如下图AutoPSA.用户咨询如图 1.如果计算时考虑水重,把工况中的w改为ww; 2.CAD表格中结构荷载不是单纯的1.5倍,是参照仿GLIF的算法,计算了水重的(根…

设计模式之服务定位器模式

想象一下,你的Java应用是一座庞大的迷宫,里面藏着无数宝贵的服务宝藏,而你正需要一张精确的藏宝图来指引方向,迅速找到并利用这些宝藏。服务定位器模式,正是这样一张神奇的地图,它帮你动态定位并获取应用中…

5.9gunplot绘图堆叠柱状图

gunplot绘图堆叠柱状图 plot"要用的数据(后缀名是.dat)" using 2 t(或者title) 跟着是要命名的属性名称 这个名称可以用.dat里的每列列名,也可以直接在后面跟着定义 plot "data.dat" using 2 t columnheader(2), using 3 t column…

Selenium 自动化 —— 常用的定位器(Locator)

什么是定位器 定位器(Locator)是识别DOM中一个或多个特定元素的方法。 也可以叫选择器 Selenium 通过By类,提供了常见的定位器。具体语法如下: By.xxx("");我们选择单个元素时可以使用findByElement: Web…