如何让加快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,里面定义了子系统的名称。)
./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 这四个过程,标准系统的编译构建过程

添加 --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/ 打开即可。

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习知识点,请移步前往小编:https://gitee.com/MNxiaona/733GH/blob/master/jianshu
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容