作者:陳會
一、Prebuilts Download階段
./build/prebuilts_download.sh
該指令主要是在建構之前下載下傳一些依賴的工具包或二進制,見源碼同級目錄的檔案夾OpenHarmony_2.0_canary_prebuilts
二、腳本的簡明編譯流程
下圖是除了進入GN建構之外的腳本的全局建構流程:

三、Preloader階段
子系統配置檔案包含以下三個檔案,定義了子系統的名稱和所在路徑。
- 子系統配置檔案://build/subsystem_config.json,主要包含子系統名稱與路徑資訊
- product配置檔案:productdefine/common/products/{産品名稱}.json,該配置檔案主要包含産品名稱,産品廠商,産品裝置名,産品類型,産品對應子系統路徑,産品所包含的部件等資訊。
-
device配置檔案:productdefine/common/device/{産品裝置名稱}.json,該配置檔案主要包含裝置名稱,裝置廠商,裝置的目标os與目标cpu,裝置對應子系統路徑等資訊。
在preloader階段以上三個檔案會被加載,并通過提取不同字段的資訊,歸類出多個配置檔案。
以上工作主要由腳本build/lite/hb_internal/preloader/preloader.py完成,并将配置檔案輸出在**out/preloader/{産品名稱}**目錄下,為loader階段掃描相應的子系統配置檔案做準備,具體對應關系如下圖:
四、GN/Ninja Build階段
鴻蒙的編譯建構子系統提供了一個基于Gn和ninja的編譯建構架構。根據産品配置,編譯生成對應的鏡像包。其中編譯建構流程為:
- 使用Gn配置建構目标。
- Gn運作後會生成ninja檔案。
- 通過運作ninja來執行編譯任務。
4.1 觸發GN建構
Preloader階段結束後,//build/lite/hb_internal/build/build_process.py.gn_build開始觸發建構,以産品Hi3516DV300為例,指令和參數如下:
gn gen --args=ohos_build_compiler_specified="clang" ohos_build_compiler_dir="//prebuilts/clang/ohos/linux-x86_64/llvm" product_path="/home/osm/Work/openharmony/openharmony_3.1/code/productdefine/common/products" product_name="Hi3516DV300" device_name="hi3516dv300" target_cpu="arm" target_os="ohos" is_standard_system=true device_path="device/board/hisilicon/hispark_taurus/linux" ohos_kernel_type="linux" common_feature_verify=true ohos_build_type="debug" ohos_build_time="1651857930667" ohos_build_datetime="2022-05-06 03:25:30" ohos_build_enable_ccache=true', '/home/osm/Work/openharmony/openharmony_3.1/code/out/hi3516dv300'
4.2 GN建構流程
GN的總入口:build/core/gn/BUILD.gn
4.2.1 Loader階段
GN建構的第一步就是進入Loader階段,該階段主要是通過Preloader階段整合的配置資訊加載build configs到out/{産品名稱}/build_configs目錄,該工作是由腳本//build/loader/load.py完成的:
1、根據out/preloader/{産品名稱}/subsystem_config.json檔案中的子系統名稱和路徑資訊掃描該路徑下的子系統配置檔案,同時相容bundle.json和ohos.build;
2、loading platforms config:跟據out/preloader/{産品名稱}/platforms.build加載平台配置資訊,生成out/{産品名稱}/build_configs/platform_list目錄下的檔案
3、根據1中擷取的bundle.json/ohos.build,解析出out/{産品名稱}/build_configs/{subsystem}/{part}/BUILD.gn、out/{産品名稱}/build_configs/parts_info/、out/{産品名稱}/build_configs/*.gni以及out/{産品名稱}/build_configs/**.json等,以及将編譯入口的模闆build/loader/build_gn.template拷貝到out/{産品名稱}/build_configs/BUILD.gn,進而在out/{産品名稱}/build_configs目錄下建構出整個工程gn腳本的完整依賴關系。
4.2.2 make inner_kits
inner_kits是元件提供其它元件的接口,會被其他元件依賴,是以首先編譯該部分。建構的具體targets見out/{産品名稱}/build_configs/inner_kits_list.gni
4.2.3 packages階段
該階段主要包括版本打包和處理流程,輸出目錄主要在out/{産品名稱}/packages/phone目錄下,package的流程如下:
4.2.4 images階段
images階段主要是根據packages階段生成的system module配置檔案制作系統檔案和更新鏡像,輸出目錄主要在out/{産品名稱}/packages/phone/{image_name}和out/{産品名稱}/packages/phone/images目錄下,主要流程如下:
4.3 Ninja Build
以上是GN的配置建構流程,GN指令隻是用來生成ninja中間檔案,運作ninja才會開始真正的建構任務。以産品Hi3516DV300為例,指令和參數如下:
ninja -w dupbuild=warn -C /home/osm/Work/openharmony/openharmony_3.1/code/out/hi3516dv300 images
該指令執行過程中或結束後才會生成上述流程中所輸出的檔案或鏡像檔案。
五、PostBuild
該階段主要做一些收尾的工作,内容如下:
1、stat_ccache()
統計ccache資訊,并在根目錄輸出ccache.log檔案
2、generate_ninja_trace()
備份前一次的build.trace.gz并在檔案命名上打上時間戳,生成新的build.trace.gz和sorted_action_duration.txt
3、get_warning_list()
根據生成的out/{産品名稱}/build.log,提取出所有的warnnings并統計到out/{産品名稱}/packages/warning_list.txt
4、compute_overlap_rate()
根據build/subsystem_config.json統計出C的重複率,并列印到終端
更多原創内容請關注:深開鴻技術團隊
入門到精通、技巧到案例,系統化分享HarmonyOS開發技術,歡迎投稿和訂閱,讓我們一起攜手前行共建鴻蒙生态。
附件連結:https://ost.51cto.com/resource/2053