OpenHarmony開(kāi)發(fā)入門—潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建

想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):
openharmony的編譯構(gòu)建系統(tǒng)
1、概念
一個(gè)基于gn和ninja的、以支持OpenHarmony組件化開(kāi)發(fā)為目標(biāo)的現(xiàn)代化編譯構(gòu)建系統(tǒng)。
ninja:一個(gè)專注于速度的小型編譯構(gòu)建系統(tǒng).
gn:一種現(xiàn)代化的跨平臺(tái)的編輯構(gòu)建工具,Generate ninja 的縮寫,用于產(chǎn)生ninja文件.
hb:OpenHarmony的命令行工具,用來(lái)執(zhí)行編譯命令.
2、基本功能
- 獨(dú)立構(gòu)建單個(gè)組件
- 獨(dú)立構(gòu)建芯片解決方案廠商源碼(開(kāi)發(fā)板)
- 支持按組件拼裝產(chǎn)品并編譯
3、核心理念
子系統(tǒng)
一個(gè)邏輯概念,由一個(gè)或多個(gè)具體組件構(gòu)成。
OpenHarmony系統(tǒng)功能按"系統(tǒng)">“子系統(tǒng)”>"組件"逐級(jí)展開(kāi),支持裁剪子系統(tǒng)或組件。
組件
可復(fù)用、可配置、可裁剪的系統(tǒng)最小功能單元。
APP也是組件的一種。
組件目錄獨(dú)立,可并行開(kāi)發(fā)、單獨(dú)編譯、單獨(dú)測(cè)試。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
最頂層的openharmony是一個(gè)操作系統(tǒng),他由多個(gè)系統(tǒng)或者叫做子系統(tǒng)集構(gòu)成,而每個(gè)系統(tǒng)又是由多個(gè)子系統(tǒng)構(gòu)成,每個(gè)子系統(tǒng)又包括了多個(gè)組件,子系統(tǒng)和組件,都是可以被裁剪的。
(裁剪,就是去掉它不要,在最終的構(gòu)建中不包括他)下面我們來(lái)看一下build/lite下的目錄結(jié)構(gòu)。
打開(kāi)vscode,從虛擬機(jī)中獲取1.1.3版本的源碼。獲取源碼的步驟可以看我上一篇博客:https://ost.51cto.com/posts/25292。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
├── components-------//組件描述文件
├── config-------------//編譯相關(guān)的配置項(xiàng)
│ ├── component------//組件相關(guān)的模板定義
│ ├── kernel---------//內(nèi)核的編譯配置參數(shù)
│ └── subsystem------//子系統(tǒng)模版
├── figures------------//readme中的圖片
├── hb-----------------//hb pip安裝包源碼
├── make_rootfs--------//文件系統(tǒng)鏡像制作腳本
├── ndk----------------//Native API相關(guān)編譯腳本與配置參數(shù)
├── platform-----------//ld腳本
├── testfwk------------//測(cè)試編譯框架
├── toolchain----------//編譯工具鏈配置,包括編譯器路徑、編譯選項(xiàng)、鏈接選項(xiàng)等
4、編譯構(gòu)建流程
編譯構(gòu)建流程主要分為兩步:設(shè)置(hb set) 和 編譯(hb build)。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
hb set用來(lái)設(shè)置Openharmony源碼目錄和要編譯的目標(biāo)。
比如在如下圖中,我們選擇編譯的產(chǎn)品是wifiiot_hispark_pegasus
hb build 編譯開(kāi)發(fā)板、產(chǎn)品或組件。
主要過(guò)程:
- 讀取編譯配置:根據(jù)產(chǎn)品選擇的開(kāi)發(fā)板,讀取開(kāi)發(fā)板config.gni文件內(nèi)容,主要包括編譯工具鏈、編譯鏈接命令和選項(xiàng)等。
- 調(diào)用gn:調(diào)用"gn gen",讀取產(chǎn)品配置,生成產(chǎn)品解決方案out目錄和ninja文件。
- 調(diào)用ninja: 調(diào)用"ninja -C out/board/product"啟動(dòng)編譯。
- 系統(tǒng)鏡像打包:將組件編譯產(chǎn)物打包,設(shè)置文件屬性和權(quán)限,制作文件系統(tǒng)鏡像。
注意: 在輕量系統(tǒng)中,組件作為一個(gè)單獨(dú)的模塊,不能夠直接燒錄到開(kāi)發(fā)板中,他必須加入到一個(gè)產(chǎn)品或者是一個(gè)開(kāi)發(fā)板方案中,作為一個(gè)完整的固件之中的一個(gè)功能點(diǎn)。
編譯構(gòu)建系統(tǒng)的配置規(guī)則
概述:為了實(shí)現(xiàn)組件、芯片解決方案、產(chǎn)品解決方案與OpenHarmony是解耦的、可插拔(可裁剪)的,組件、芯片解決方案和產(chǎn)品解決方案的路徑、目錄樹(shù)和配置需遵循一定的規(guī)則。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
何為目錄樹(shù)呢:
一般情況下我們會(huì)為一個(gè)組件建立一個(gè)單獨(dú)的目錄。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
- 組件源碼路徑不能隨意亂來(lái),要分為三個(gè)層級(jí):{領(lǐng)域}/{子系統(tǒng)}/{組件}。
- 領(lǐng)域:子系統(tǒng)集。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
確定好組件目錄的具體位置后,相當(dāng)于組件就有了一個(gè)家,而這個(gè)家需要簡(jiǎn)單的裝修一下,劃分一下功能區(qū)。
就像我們的家里有客廳,廚房,臥室等等。組件的家也需要有一定的結(jié)構(gòu),這個(gè)結(jié)構(gòu)就是目錄樹(shù)。下面我們來(lái)看一個(gè)例子:
- 源碼分析: loT外圍設(shè)備控制組件。
- 這個(gè)組件的源碼路徑為:base/iot hardware/peripheral。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
打開(kāi)vscode,找到這個(gè)路徑。顯示如下:
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
正是符合上圖的源碼目錄樹(shù)規(guī)則:
- kits目錄下存放了應(yīng)用接口。
- 擴(kuò)展名是.h的文件正是接口頭文件,使用具體的接口時(shí),要去include他們。
- BUILD.gn是組件編譯腳本。
至此,我們對(duì)Openharmony編譯構(gòu)建系統(tǒng)的理解已經(jīng)邁進(jìn)了一大步。
組件的定義
作為一個(gè)組件,必須要注冊(cè)到一個(gè)子系統(tǒng)中,Openharmony才會(huì)意識(shí)到你的存在。
定義的位置:build/lite/components/<對(duì)應(yīng)子系統(tǒng)>.json。
打開(kāi)vscode,找到這個(gè)路徑,顯示如下:
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
可以看到,這里存放了很多json文件,而每一個(gè)json文件都對(duì)應(yīng)了一個(gè)子系統(tǒng)。
在定義子系統(tǒng)的json文件時(shí),我們要把自己的基本情況告訴這個(gè)子系統(tǒng)。
注意:新增組件時(shí)需要在對(duì)應(yīng)子系統(tǒng)json文件中添加相應(yīng)的組件定義。產(chǎn)品所配置的組件必須在某個(gè)子系統(tǒng)中被定義過(guò),否則會(huì)校驗(yàn)失敗。
下面我們來(lái)看一下需要定義的內(nèi)容有哪些。
- 名稱
- 功能簡(jiǎn)介
- 是否必選
- 源碼路徑
- 編譯目標(biāo)
- RAM
- ROM
- 編譯輸出
- 已適配的內(nèi)核、
- 可配置的特性和依賴等。
我們繼續(xù)來(lái)看一個(gè)例子。還是剛剛的IoT外圍設(shè)備控制組件,在build/lite/components/iot_hardware.json中。
組件的編譯目標(biāo)(編譯入口)
其實(shí)就是組件定義中的targets參數(shù)。
格式:
- “targets”:[“路徑:目標(biāo)”]。
- 路徑:采用絕對(duì)路徑表示,以"http://"開(kāi)頭,從源碼根目錄開(kāi)始。
- 目標(biāo):由"路徑/BUILD.gn"定義。
舉個(gè)例子:
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
“targets”:[“//base/iot_hardware/peripheral:iothardware”]
- 路徑: //base/iot_hardware/peripheral
- 目標(biāo): iothardware Openharmony會(huì)去這個(gè)路徑下找到BUILD.gn文件,在這個(gè)文件中,找到iothardware這個(gè)目標(biāo)部分,按這部分的要求進(jìn)行編譯。
下面我們就來(lái)看一下BUILD.gn文件如何編寫。
組件的編譯腳本
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
類型
- 靜態(tài)庫(kù) (.a) : static_library
- 動(dòng)態(tài)庫(kù) (.so) : shared_library
- 可執(zhí)行文件 (bin 文件 ) : executable
- 組: group
目標(biāo):編譯目標(biāo)名稱(官方建議與組件一致)
- sources :源文件列表
- include_dirs : include 目錄列表
舉個(gè)例子:IoT外圍設(shè)備控制組件。
先從組件定義的json文件中找到編譯目標(biāo): build\lite\components\iot_hardware.json -> targets。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
再根據(jù)targets中的路徑找到BUILD.gn編譯腳本:base\iot_hardware\peripheral\BUILD.gn。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
注意:此腳本負(fù)責(zé)整個(gè) IoT 專有硬件服務(wù)子系統(tǒng)的編譯。通過(guò)subsystem_components( 子系統(tǒng)組件 ) 方式指定 IoT 外圍設(shè)備控制組件,指向下級(jí)編譯腳本。 “$ohos_vendor_adapter_dir” 表示 “device\hisilicon\hispark_pegasushi3861_adapter” 目錄。
我們?cè)俑櫟?device\hisilicon\hispark_pegasus\hi3861_adapter\hals\iot_hardware\wifiiot_liteBUILD.gn,如下正是組件的編譯腳本內(nèi)容。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
下面我們?cè)倏匆粋€(gè)例子,kv_store 組件(鍵值存儲(chǔ)),他位于 build\lite\components\utils.json 中的第 1 個(gè)組件。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
編譯腳本: utils\native\lite\kv_store\BUILD.gn。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
注意:此腳本通過(guò) lite_component( 組件 ) 的 features( 模塊 ) 方式。
指定 utils_kv_store 模塊,指向下級(jí)編譯腳本。
我們跟蹤到utils\native\lite\kv_store\src\BUILD.gn,如下正是組件編譯腳本。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
到這,我們編譯構(gòu)建系統(tǒng)的配置規(guī)則也就學(xué)習(xí)完了,相信同學(xué)們會(huì)對(duì)Openharmony的構(gòu)建編譯系統(tǒng)有更深一步的理解。
下面附上子系統(tǒng)的構(gòu)建模型。
【openharmony開(kāi)發(fā)入門】潤(rùn)和智能家居套件-輕量系統(tǒng)的編譯構(gòu)建-開(kāi)源基礎(chǔ)軟件社區(qū)
小編將會(huì)在下一篇博客中講解如何新增組件和輕量系統(tǒng)的數(shù)據(jù)持久化。




































