如何让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-husage: 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通过在该命令后添加如下选项提升编译速度。  
①添加 --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 k3568images.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 收集策略说明:
https://gitee.com/openharmony/build/blob/master/docs/%e5%bc%80%e6%ba%90%e8%bd%af%e4%bb%b6notice%e6%94%b6%e9%9b%86%e7%ad%96%e7%95%a5%e8%af%b4%e6%98%8e.md./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:/home/jiajiahao/ohos3.2beta4/sources/prebuilts/build-tools/linux-x86/bin# 然后在源码目录下执行如下语句ninja -c out/rk3568 ace_napi
将 gn 和 ninja 可执行文件添加到 path 环境变量的方法
将 gn 和 ninja 可执行文件添加到 path 环境变量的方法(临时改变,只能在当前的终端窗口中有效)
export path=$path:/home/jiajiahao/ohos3.2beta4/sources/prebuilts/build-tools/linux-x86/bin     
notice file 是否收集的编译选项–gn-args enable_notice_collection=false 是如何支持的。
相关 pr:
https://gitee.com/openharmony/build/pulls/772/files指定编译期间的日志级别
在 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/ 打开即可。


Xilinx可编程逻辑器件设计与开发(基础篇)连载20:Spartan
是德科技公司宣布已完成对Sanjole的收购
Vishay发布10款温度范围扩展至+15 5℃的新型IHLP低高 度、高电流电感器
Mygica Movie Box魅影网络电影播放器
沉浸式AR一体机RealMax“干”在上海正式发布
如何让OpenHarmony编译速度“狂飙”
Allegro布线规则的设置
锤子坚果Pro是iPhone 7 Plus的弟弟吗?孪生兄弟
电池回收利用,可以解决钴资源的供应问题
国产奥迪Q3 40 TFSI上手体验评测
微软在与Polygon的会议上确认了其下一代高端控制台的一些功能
linux修改网卡ip配置文件
关于共享网络销售柜专用MS1793S低功耗蓝牙芯片的介绍
英特尔CEO:开启超级摩尔定律的时代,推动前沿进展
电荷泵电路的基本原理及性能分析
知用DP6700A高压差分探头实验应用案例
谈一谈AR对品牌营销的四大重点影响
新材料测样难?优可测提供白光干涉仪测试服务
QLED还能走多远?纯色硬屏现在进行时
800V高压快充的关键技术解析