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