鴻蒙標準系統(tǒng)3.1的編譯構(gòu)建簡單解讀
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
一、Prebuilts Download階段
./build/prebuilts_download.sh該命令主要是在構(gòu)建之前下載一些依賴的工具包或二進制,見源碼同級目錄的文件夾OpenHarmony_2.0_canary_prebuilts。
二、腳本的簡明編譯流程
下圖是除了進入GN構(gòu)建之外的腳本的全局構(gòu)建流程:
三、Preloader階段
子系統(tǒng)配置文件包含以下三個文件,定義了子系統(tǒng)的名稱和所在路徑。
- 子系統(tǒng)配置文件://build/subsystem_config.json,主要包含子系統(tǒng)名稱與路徑信息。
- product配置文件:productdefine/common/products/{產(chǎn)品名稱}.json,該配置文件主要包含產(chǎn)品名稱,產(chǎn)品廠商,產(chǎn)品設(shè)備名,產(chǎn)品類型,產(chǎn)品對應子系統(tǒng)路徑,產(chǎn)品所包含的部件等信息。
- device配置文件:productdefine/common/device/{產(chǎn)品設(shè)備名稱}.json,該配置文件主要包含設(shè)備名稱,設(shè)備廠商,設(shè)備的目標os與目標cpu,設(shè)備對應子系統(tǒng)路徑等信息。
在preloader階段以上三個文件會被加載,并通過提取不同字段的信息,歸類出多個配置文件。
以上工作主要由腳本build/lite/hb_internal/preloader/preloader.py完成,并將配置文件輸出在**out/preloader/{產(chǎn)品名稱}**目錄下,為loader階段掃描相應的子系統(tǒng)配置文件做準備,具體對應關(guān)系如下圖:
四、GN/Ninja Build階段
鴻蒙的編譯構(gòu)建子系統(tǒng)提供了一個基于Gn和ninja的編譯構(gòu)建框架。根據(jù)產(chǎn)品配置,編譯生成對應的鏡像包。其中編譯構(gòu)建流程為:
- 使用Gn配置構(gòu)建目標。
- Gn運行后會生成ninja文件。
- 通過運行ninja來執(zhí)行編譯任務(wù)。
1、觸發(fā)GN構(gòu)建
Preloader階段結(jié)束后,//build/lite/hb_internal/build/build_process.py.gn_build開始觸發(fā)構(gòu)建,以產(chǎn)品Hi3516DV300為例,命令和參數(shù)如下:
gn gen --args=ohos_build_compiler_specified="clang" ohos_build_compiler_dir="http://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'
2、GN構(gòu)建流程
GN的總?cè)肟冢篵uild/core/gn/BUILD.gn。
(1)Loader階段
GN構(gòu)建的第一步就是進入Loader階段,該階段主要是通過Preloader階段整合的配置信息加載build configs到out/{產(chǎn)品名稱}/build_configs目錄,該工作是由腳本//build/loader/load.py完成的:
1、根據(jù)out/preloader/{產(chǎn)品名稱}/subsystem_config.json文件中的子系統(tǒng)名稱和路徑信息掃描該路徑下的子系統(tǒng)配置文件,同時兼容bundle.json和ohos.build。
2、loading platforms config:跟據(jù)out/preloader/{產(chǎn)品名稱}/platforms.build加載平臺配置信息,生成out/{產(chǎn)品名稱}/build_configs/platform_list目錄下的文件。
3、根據(jù)1中獲取的bundle.json/ohos.build,解析出out/{產(chǎn)品名稱}/build_configs/{subsystem}/{part}/BUILD.gn、out/{產(chǎn)品名稱}/build_configs/parts_info/、out/{產(chǎn)品名稱}/build_configs/*.gni以及out/{產(chǎn)品名稱}/build_configs/**.json等,以及將編譯入口的模板build/loader/build_gn.template拷貝到out/{產(chǎn)品名稱}/build_configs/BUILD.gn,從而在out/{產(chǎn)品名稱}/build_configs目錄下構(gòu)建出整個工程gn腳本的完整依賴關(guān)系。
(2)make inner_kits
inner_kits是組件提供其它組件的接口,會被其他組件依賴,因此首先編譯該部分。構(gòu)建的具體targets見out/{產(chǎn)品名稱}/build_configs/inner_kits_list.gni
(3)packages階段
該階段主要包括版本打包和處理流程,輸出目錄主要在out/{產(chǎn)品名稱}/packages/phone目錄下,package的流程如下:
(4)images階段
images階段主要是根據(jù)packages階段生成的system module配置文件制作系統(tǒng)文件和升級鏡像,輸出目錄主要在out/{產(chǎn)品名稱}/packages/phone/{image_name}和out/{產(chǎn)品名稱}/packages/phone/images目錄下,主要流程如下:
3、Ninja Build
以上是GN的配置構(gòu)建流程,GN命令只是用來生成ninja中間文件,運行ninja才會開始真正的構(gòu)建任務(wù)。以產(chǎn)品Hi3516DV300為例,命令和參數(shù)如下:
ninja -w dupbuild=warn -C /home/osm/Work/openharmony/openharmony_3.1/code/out/hi3516dv300 images
該命令執(zhí)行過程中或結(jié)束后才會生成上述流程中所輸出的文件或鏡像文件。
五、PostBuild
該階段主要做一些收尾的工作,內(nèi)容如下:
1、stat_ccache()
統(tǒng)計ccache信息,并在根目錄輸出ccache.log文件。
2、generate_ninja_trace()
備份前一次的build.trace.gz并在文件命名上打上時間戳,生成新的build.trace.gz和sorted_action_duration.txt。
3、get_warning_list()
根據(jù)生成的out/{產(chǎn)品名稱}/build.log,提取出所有的warnnings并統(tǒng)計到out/{產(chǎn)品名稱}/packages/warning_list.txt。
4、compute_overlap_rate()
根據(jù)build/subsystem_config.json統(tǒng)計出C的重復率,并打印到終端。