如何讓OpenHarmony編譯速度“狂飆”
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
OpenHarmony有兩種編譯方式,一種是通過(guò)hb工具編譯,一種是通過(guò)build.sh腳本編譯。本文筆者將提升build.sh方式編譯速度的方法整理如下:
因?yàn)楣P者只用build.sh腳本編譯,沒(méi)用過(guò)hb工具,好像下面的選項(xiàng)也可以用于hb工具。
在OpenHarmony源碼中執(zhí)行./build.sh --h,會(huì)打印出./build.sh中可以添加的所有選項(xiàng)
提升OpenHarmony編譯速度的選項(xiàng)
build.sh腳本編譯rk3568方式命令如下:
通過(guò)在該命令后添加如下選項(xiàng)提升編譯速度。
添加 --disable-post-build 參數(shù)
取消Postbuild過(guò)程,最后的ninja trace解析、每個(gè)子系統(tǒng)(不包括源碼中的third_party部分)的rom size統(tǒng)計(jì)等動(dòng)作會(huì)沒(méi)有(每個(gè)子系統(tǒng)部件描述文件名稱為bundle.json,里面定義了子系統(tǒng)的名稱。)
提供支持disable post build參數(shù)是怎么做的 https://gitee.com/openharmony/build/issues/I5MT9X。
添加 --disable-package-image參數(shù)
取消最后所有的image鏡像文件壓縮成tar包的動(dòng)作
tar包位置 out\rk3568\images.tar.gz
添加 --ccache 參數(shù)
ccache會(huì)緩存c/c++編譯的編譯輸出,下一次在編譯輸入不變的情況下,直接復(fù)用緩存的產(chǎn)物。用來(lái)緩存編譯過(guò)的.o文件等
執(zhí)行sudo apt-get install ccache命令安裝ccache
再在 --ccache后添加export CCACHE_NOHASHDIR=“true” 和 export CCACHE_SLOPPINESS=“include_file_ctime” (設(shè)置ccache在做hash的時(shí)候不hash路徑、不檢查文件的change time)
添加 --fast-rebuild參數(shù)
編譯流程主要分為:preloader->loader->gn->ninja這四個(gè)過(guò)程,添加后直接基于已有out/rk3568/build.ninja直接執(zhí)行編譯鏈接步驟,跳過(guò)前面的產(chǎn)品配置解析和gn解析,在gn相關(guān)腳本沒(méi)有發(fā)生改變的前提下使用。
添加 --gn-args enable_notice_collection=false參數(shù)
notice file的搜集用于產(chǎn)品化的LICENSE生成,取消收集開(kāi)源notice的過(guò)程,在非產(chǎn)品化場(chǎng)景開(kāi)發(fā)態(tài)可關(guān)閉,提升編譯速度,節(jié)省編譯~7%時(shí)間。
OpenHarmony開(kāi)源軟件Notice收集策略說(shuō)明 https://gitee.com/openharmony/build/blob/master/docs/開(kāi)源軟件Notice收集策。
添加 --build-only-gn 參數(shù)
重新執(zhí)行Preloader、loader、gn,不進(jìn)行最后的編譯動(dòng)作。
編譯流程主要分為:preloader->loader->gn->ninja這四個(gè)過(guò)程,標(biāo)準(zhǔn)系統(tǒng)的編譯構(gòu)建過(guò)程請(qǐng)參考https://ost.51cto.com/posts/13594。
添加 --build-target 參數(shù)
該參數(shù)用于指定編譯模塊
如何找模塊的名字:
- 相關(guān)倉(cāng)下BUILD.gn中關(guān)注group、ohos_shared_library、ohos_executable等關(guān)鍵字。
- ./build.sh --product-name 產(chǎn)品名 --build-target 模塊名 --build-only-gn生成build.ninja,然后去該文件中查找相關(guān)模塊名。
添加 --gn-args enable_lto_O0=true參數(shù)
在鏈接的時(shí)候會(huì)減弱優(yōu)化的等級(jí),建議在只考慮編譯是否成功的時(shí)候使用(會(huì)影響最后的so的性能和rom大小)
添加 --gn-args archive_ndk=false參數(shù)
編譯sdk的時(shí)候不執(zhí)行輸出壓縮包的動(dòng)作
添加 export NO_DEVTOOL=1 參數(shù)
取消webpack打包過(guò)程中生成sourcemap的動(dòng)作
添加 --gn-args skip_generate_module_list_file=true參數(shù)
跳過(guò)為test 生成記錄文件的過(guò)程,節(jié)省gn解析的過(guò)程,只要不跑tdd測(cè)試用例,這個(gè)參數(shù)都可以加上,編譯tdd用例也沒(méi)關(guān)系
添加 -T packages --gn-args skip_gen_module_info=true參數(shù)
在不編譯image的時(shí)候:-T packages --gn-args skip_gen_module_info=true,去掉gn階段module info的生成
添加 --gn-args load_test_config=false參數(shù)
在不編譯test用例的時(shí)候加上 --gn-args load_test_config=false,來(lái)去掉gn階段test相關(guān)編譯目標(biāo)的解析。
以上參數(shù)可疊加使用
例如全量編譯,筆者使用下面這條命令編譯速度提升了120%:
添加 --fast-rebuild參數(shù) 方式等效于執(zhí)行 ninja -C
首先用./build.sh全量編譯,然后在源碼下執(zhí)行ninja -C out/rk3568 moduleb_lib(編譯對(duì)象模塊)
將gn和ninja可執(zhí)行文件添加到PATH環(huán)境變量的方法
將gn和ninja可執(zhí)行文件添加到PATH環(huán)境變量的方法(臨時(shí)改變,只能在當(dāng)前的終端窗口中有效)。
例如筆者的gn和ninja可執(zhí)行文件絕對(duì)路徑。
notice file是否收集的編譯選項(xiàng)–gn-args enable_notice_collection=false是如何支持的。
相關(guān)PR https://gitee.com/openharmony/build/pulls/772/files
指定編譯期間的日志級(jí)別
在OpenHarmony的build.sh里通過(guò)–log-level可以指定編譯期間的日志級(jí)別,三個(gè)級(jí)別可選:debug, info和error,默認(rèn)值是info
本地打開(kāi)ninja trace: 解壓out/rk3568/build.trace.gz,將build.trace拖到chrome的trace鏈接chrome://tracing/打開(kāi)即可。
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??