乐趣区

关于openharmony:如何让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

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

增加 –disable-post-build 参数:

  • 勾销 Postbuild 过程,最初的 ninja trace 解析、每个子系统(不包含源码中的 third_party 局部)的 rom size 统计等动作会没有 (每个子系统部件形容文件名称为 bundle.json, 外面定义了子系统的名称。)
  • 提供反对 disable post build 参数是怎么做的 https://gitee.com/openharmony…
./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 收集策略阐明 https://gitee.com/openharmony…
./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/1…

增加 –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…

指定编译期间的日志级别

  • 在 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/ 关上即可。
退出移动版