如何讓OpenHarmony編譯速度“狂飆”
OpenHarmony有兩種編譯方式,一種是通過hb工具編譯,一種是通過build.sh腳本編譯。本文筆者將提升build.sh方式編譯速度的方法整理如下:
因為筆者只用build.sh腳本編譯,沒用過hb工具,好像下面的選項也可以用于hb工具。
在OpenHarmony源碼中執行./build.sh --h,會打印出./build.sh中可以添加的所有選項
提升OpenHarmony編譯速度的選項
build.sh腳本編譯rk3568方式命令如下:
通過在該命令后添加如下選項提升編譯速度。
添加 --disable-post-build 參數
取消Postbuild過程,最后的ninja trace解析、每個子系統(不包括源碼中的third_party部分)的rom size統計等動作會沒有(每個子系統部件描述文件名稱為bundle.json,里面定義了子系統的名稱。)
提供支持disable post build參數是怎么做的 https://gitee.com/openharmony/build/issues/I5MT9X。
添加 --disable-package-image參數
取消最后所有的image鏡像文件壓縮成tar包的動作
tar包位置 out\rk3568\images.tar.gz
添加 --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)
添加 --fast-rebuild參數
編譯流程主要分為:preloader->loader->gn->ninja這四個過程,添加后直接基于已有out/rk3568/build.ninja直接執行編譯鏈接步驟,跳過前面的產品配置解析和gn解析,在gn相關腳本沒有發生改變的前提下使用。
添加 --gn-args enable_notice_collection=false參數
notice file的搜集用于產品化的LICENSE生成,取消收集開源notice的過程,在非產品化場景開發態可關閉,提升編譯速度,節省編譯~7%時間。
OpenHarmony開源軟件Notice收集策略說明 https://gitee.com/openharmony/build/blob/master/docs/開源軟件Notice收集策。
添加 --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的生成
添加 --gn-args load_test_config=false參數
在不編譯test用例的時候加上 --gn-args load_test_config=false,來去掉gn階段test相關編譯目標的解析。
以上參數可疊加使用
例如全量編譯,筆者使用下面這條命令編譯速度提升了120%:
添加 --fast-rebuild參數 方式等效于執行 ninja -C
首先用./build.sh全量編譯,然后在源碼下執行ninja -C out/rk3568 moduleb_lib(編譯對象模塊)
將gn和ninja可執行文件添加到PATH環境變量的方法
將gn和ninja可執行文件添加到PATH環境變量的方法(臨時改變,只能在當前的終端窗口中有效)。
例如筆者的gn和ninja可執行文件絕對路徑。
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
本地打開ninja trace: 解壓out/rk3568/build.trace.gz,將build.trace拖到chrome的trace鏈接chrome://tracing/打開即可。