如何让加快OpenHarmony编译速度?

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.mzph.cn/news/834429.shtml

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

相关文章

Jenkins--自动化构建和部署SpringBoot项目

一、实现目标 通过在Jenkins中创建流水线任务,编写流水线脚本以实现自动化构建和部署SpringBoot项目。流水线脚本主要实现以下几个步骤: Preparation:从gitee上拉取远程仓库的SpringBoot项目代码。Build:使用Maven对拉取的代码进…

部署JVS服务出现上传文件不可用,问题原因排查。

事情的起因是这样的,部门经理让我部署一下JVS资源共享框架,项目的地址是在这里 项目资源地址 各位小伙伴们做好了,我要开始发车了,全新的“裂开之旅” 简单展示一下如何部署JVS文档 直达链接 撕裂要开始了 本来服务启动的好好…

链式二叉树的基本操作1

1.概念回顾 讲二叉树的基本操作之前,我们回顾一下二叉树的概念 在讲树之前,我们的每讲一种数据结构,无外乎就是在讲它们的增删查改,但是在树这里,就有了不小变化。 2.结点的定义 既然是链式二叉树,那必须…

部署 Sentinel 控制台:实现流量管理和监控

序言 Sentinel 是阿里巴巴开源的一款流量防护与监控平台,它可以帮助开发者有效地管理微服务的流量,实现流量控制、熔断降级、系统负载保护等功能。本文将介绍如何在项目中部署和配置 Sentinel 控制台,实现微服务的流量防护和监控。 一、Sen…

深入理解Linux中TCP/IP协议栈的实现原理与具体过程

一、Linux内核与网络体系结构 在我们了解整个linux系统的网络体系结构之前,我们需要对整个网络体系调用,初始化和交互的位置,同时也是Linux操作系统中最为关键的一部分代码-------内核,有一个初步的认知。 1、Linux内核的结构 …

智能改写文章怎么做,3个方法让你轻松改出高质量文章

在如今的自媒体兴盛时代,内容创作对于自媒体人来说是必不可少的一项工作,然而,如何在保持内容原创性的前提下迅速生成高质量的文章变得尤为重要。智能改写文章的出现,为所有的自媒体人带来了一种全新的思路,它让大家在…

2024付费进群系统,源码及搭建变现视频课程(教程+源码)

前三节讲解搭建支付对接,后两节讲解一些引流变现的方法,还有一种变现就是帮人搭建这样的平台,因为全网都没有一套完整的视频教怎么搭建的,有也只是文字教程,一般新人根本看不懂,我视频实操演示,…

16-LINUX--线程安全

一。线程安全 线程安全即就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 要保证线程安全需要做到: 1) 对线程同步,保证同一时刻只有一个线程访问临界资…

minio安装部署

MinIO 介绍 MinIO是一个对象存储解决方案,它提供了与Amazon Web Services S3兼容的API,并支持所有核心S3功能。 MinIO有能力在任何地方部署 - 公有云或私有云,裸金属基础设施,编排环境,以及边缘基础设施。 MinIO 安装…

【网络基础2】深入理解TCP协议:协议段、可靠性、各种机制

文章目录 1. TCP协议段格式1.1. 如何解包 / 向上交付1.1.1. 交付1.1.2. 解包 1.2. 如何理解可靠性1.2.1. 确认应答机制(ACK)1.2.2. 序号 与 确认序号 2. TCP做到全双工的原因2.1. 16位窗口大小2.2. 6个标记位 3. 如何理解连接3.1 连接管理机制3.1.1. 三次…

Web安全研究(九)

知识星球 首先推荐一下我们的知识星球,以AI与安全结合作为主题,包括AI在安全上的应用和AI本身的安全; 加入星球你将获得: 【Ai4sec】:以数据驱动增强安全水位,涵盖内容包括:恶意软件分析,软件安全,AI安全,数据安全,系统安全,流量分析,防爬,验证码等安全方向。…

IP地址证书的详细申请步骤

IP地址证书申请的条件有两个,一个是此IP必须是公网IP,另一个是IP的80和443端口必须允许短暂开放。满足这两个条件才能为其部署SSL证书。 IP地址ssl证书申请网址链接https://www.joyssl.com/certificate/select/ip_certificate.html?nid16 1 访问提供IP…

PyCharm安装详细教程

PyCharm安装详细教程 PyCharm简介及其下载网站 PyCharm是由JetBrains打造的一款Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。PyCharm提供了代码编辑、调试、语法高亮…

nature《自然》期刊文献怎么在家查看下载

nature《自然》期刊我们都知道,是世界上历史悠久的、最有名望的科学杂志之一。下载该期刊文献是需要使用权限的,如果你没有nature《自然》期刊的资源,又该如何获取呢?请看本文的经验分享。 一、先百度“文献党下载器” 在文献党下…

Faststone Capture:高效屏幕捕获神器评测【AI写作】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

PMP课程知识点很多,无法入手,该如何学习?

回顾整个学习过程,我花费了不少时间,但也学到了系统的项目管理知识,考试结果也让我感到满意。在学习过程中,我认为以下几点非常重要: 1、需要对课本进行整体阅读,以便对内容有一个整体印象; 2…

「MDN web 入门」学习笔记

目录 写在前面 1. MDN 简介 1.1 MDN 的主要特点 1.2 MDN 的主要功能 1.3 MDN 网页开发的指南 2. 安装基础软件 2.1 专业人士工具 2.2 初学者基本工具 3. 设计网站外观 3.1 计划 3.2 绘制草图 3.3 选定素材 3.4 文本 3.5 主题颜色 3.6 图像 3.7 字体 4. 处理文…

数字人捕捉、建模与合成

在感知系统中,我们与外部合作者一起创建逼真的 3D 人类,其行为可以像虚拟世界中的真实人类一样。这项工作在今天有许多实际应用,并且对于元宇宙的未来至关重要。但是,在感知系统中,我们的目标是科学的——通过重现人类…

MySQL——系统变量

使用 #最大连接用户数 select MAX_CONNECTIONS; #临时存放构成每次事务的SQL的缓冲区长度 select BINLOG_CACHE_SIZE; #SQL Server的版本信息 select VERSION; 查询结果

Python实现一个简单的计算器

简单版本 使用 Python 的 Tkinter 模块来实现一个简单的图形化计算器。以下是一个基本的示例代码 示例效果 代码源码 import tkinter as tkdef button_click(number):current = entry.get()entry.delete(0, tk.END)entry.insert(0, current + str(number))def button_clear()…