子系統(tǒng),部件,模塊編譯構(gòu)建全實(shí)踐
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??
前言
大家好,前段時(shí)間學(xué)業(yè)比較忙,已經(jīng)有挺長一段時(shí)間沒有更新博客了,這段時(shí)間開始實(shí)習(xí)生活,會(huì)將更多的精力投入到開源鴻蒙的研究學(xué)習(xí)中,會(huì)盡量多更新實(shí)習(xí)期間的所學(xué)所得,分享給大家,一起學(xué)習(xí)進(jìn)步!
本篇文章要分享的是OpenHarmony的一個(gè)編譯構(gòu)建實(shí)踐,隨著版本更新,OpenHarmony的編譯方式也會(huì)出現(xiàn)一些小變化,這次將以O(shè)penHarmony-3.2-Beta版本為例,使用九聯(lián)UnionPi-Tiger開發(fā)板,介紹下子系統(tǒng),部件,模塊的配置規(guī)則以及編譯構(gòu)建實(shí)踐。
概述
OpenHarmony整體遵從分層設(shè)計(jì),從下向上依次為:內(nèi)核層、系統(tǒng)服務(wù)層、框架層和應(yīng)用層。系統(tǒng)功能按照“系統(tǒng) > 子系統(tǒng) > 部件”逐級(jí)展開,在多設(shè)備部署場(chǎng)景下,支持根據(jù)實(shí)際需求裁剪某些非必要的子系統(tǒng)或部件。
- 子系統(tǒng):子系統(tǒng)是一個(gè)邏輯概念,它具體由對(duì)應(yīng)的部件構(gòu)成。
- 部件:對(duì)子系統(tǒng)的進(jìn)一步拆分,可復(fù)用的軟件單元,它包含源碼、配置文件、資源文件和編譯腳本;能獨(dú)立構(gòu)建,以二進(jìn)制方式集成,具備獨(dú)立驗(yàn)證能力的二進(jìn)制單元。需要注意的是下文中的芯片解決方案本質(zhì)是一種特殊的部件。
- 模塊:模塊就是編譯子系統(tǒng)的一個(gè)編譯目標(biāo),部件也可以是編譯目標(biāo)。
- 特性(feature):特性是部件用于體現(xiàn)不同產(chǎn)品之間的差異。
上圖編譯子系統(tǒng)的各部分關(guān)系,主要體現(xiàn)為:
- 子系統(tǒng)是某個(gè)路徑下所有部件的集合,一個(gè)部件只能屬于一個(gè)子系統(tǒng)。
- 部件是模塊的集合,一個(gè)模塊只能歸屬于一個(gè)部件。
- 通過產(chǎn)品配置文件配置一個(gè)產(chǎn)品包含的部件列表,部件不同的產(chǎn)品配置可以復(fù)用。
- 部件可以在不同的產(chǎn)品中實(shí)現(xiàn)有差異,通過變體或者特性feature實(shí)現(xiàn)。
- 模塊就是編譯子系統(tǒng)的一個(gè)編譯目標(biāo),部件也可以是編譯目標(biāo)。
環(huán)境
- OpenHarmony-3.2-Beta5
- 九聯(lián)UnionPi-Tiger開發(fā)板
- USB_Burning_Tool燒錄工具
- 串口調(diào)試助手
參考
??編譯構(gòu)建指導(dǎo)??NAPI框架生成代碼集成到OpenHarmony的方法
一、子系統(tǒng)配置
通過build倉下的subsystem\_config.json可以查看所有子系統(tǒng)的配置規(guī)則。子系統(tǒng)的配置規(guī)則主要是在build/subsystem_config.json中指定子系統(tǒng)的路徑和子系統(tǒng)名稱。
注意:在已有子系統(tǒng)的目錄下再創(chuàng)建子系統(tǒng)會(huì)導(dǎo)致重復(fù)獲取到部件配置文件而導(dǎo)致報(bào)錯(cuò)。(血淚教訓(xùn))
二、部件配置
bundle.json與ohos.build
配置完子系統(tǒng)后,系統(tǒng)會(huì)自動(dòng)識(shí)別該目錄下的所有部件配置文件,新增部件的方式有兩種,分別為增加ohos.build文件方式和增加bundle.json文件方式,各自的配置方法如下。
1、ohos.build配置格式
2、bundle.json配置格式
- 部件配置中需要配置部件的名稱、源碼路徑、功能簡(jiǎn)介、是否必選、編譯目標(biāo)、RAM、ROM、編譯輸出、已適配的內(nèi)核、可配置的特性和依賴等屬性定義。
使用場(chǎng)景對(duì)比
兩種集成方式使用場(chǎng)景說明:
ohos.build方式集成:適合3.0前版本使用。
bundle.json方式集成:兼容ohos.build方式,但3.1及以后版本建議使用此種方式集成,更好兼容HPM。
三. 模塊配置
具體參考??模塊配置規(guī)則??。
編譯子系統(tǒng)通過模塊、部件和產(chǎn)品三層配置來實(shí)現(xiàn)編譯和打包。模塊就是編譯子系統(tǒng)的一個(gè)目標(biāo),包括(動(dòng)態(tài)庫、靜態(tài)庫、配置文件、預(yù)編譯模塊等)。模塊要定義屬于哪個(gè)部件,一個(gè)模塊只能歸屬于一個(gè)部件。OpenHarmony使用定制化的Gn模板來配置模塊規(guī)則。
以下是常用的模塊配置規(guī)則:
ohos開頭的模板對(duì)應(yīng)的.gni文件路徑在:openharmony/build/templates/cxx/cxx.gni。
這里以ohos_executable為例,配置規(guī)則如下:
四、編譯構(gòu)建全實(shí)踐
1、添加子系統(tǒng)mysubsys
在子系統(tǒng)下新建一個(gè)屬于自己的名為mysubsys子系統(tǒng),并在源碼下建立相應(yīng)的mysubsys目錄。
在mysubsys新建兩個(gè)部件,分別用來測(cè)試bundle.json以及ohos.build配置部件的實(shí)現(xiàn)結(jié)果。注意ohos.build或者bundle.json文件均在對(duì)應(yīng)子系統(tǒng)所在文件夾下,BUILD.gn文件位置可以根據(jù)需要指定,整體目錄結(jié)構(gòu)如下:
2、為子系統(tǒng)配置部件及模塊
(1)添加ohos.build測(cè)試部件及模塊
mysubsys下新建一個(gè)ohos.build文件,根據(jù)ohos.build配置規(guī)則進(jìn)行配置。同目錄下建立BUILD.gn編譯腳本,用于指定部件下模塊編譯入口,然后新建文件夾test作為測(cè)試模塊,里面在新建test.c源文件以及BUILD.gn文件,生成可執(zhí)行文件安裝到開發(fā)板bin目錄下,可執(zhí)行文件名為mysubsys_test_ohos。編譯構(gòu)建關(guān)系如下圖所示:
用于測(cè)試的源文件test.c:
(2)添加bundle.json測(cè)試部件及模塊
mysubsys下新建一個(gè)bundle.json文件,根據(jù)obundle.json配置規(guī)則進(jìn)行配置。同目錄下建立BUILD.gn編譯腳本,用于指定部件下模塊編譯入口,然后新建文件夾test作為測(cè)試模塊,里面在新建test.c源文件以及BUILD.gn文件,生成可執(zhí)行文件安裝到開發(fā)板bin目錄下,可執(zhí)行文件名為mysubsys_test_bundle。編譯構(gòu)建關(guān)系如下圖所示:
上述兩個(gè)實(shí)例可以直接在"module_list"或者"sub_component"里面直接將編譯入口設(shè)置為你的模塊目標(biāo)(動(dòng)態(tài)庫、靜態(tài)庫、配置文件、預(yù)編譯模塊等),不過在學(xué)習(xí)過程中,發(fā)現(xiàn)OpenHarmony源碼里面關(guān)于部件模塊的寫法(例如third_party),發(fā)現(xiàn)很多都會(huì)額外寫一個(gè)BUILD.gn來新建一個(gè)group,用來包含一個(gè)或多個(gè)目標(biāo)的虛節(jié)點(diǎn),這里我也習(xí)慣這么寫了。
3、產(chǎn)品配置中添加相應(yīng)子系統(tǒng)及部件
在vendor/unionman/unionpi_tiger/config.json文件添加如下配置:
4、編譯燒錄運(yùn)行
操作流程具體參考https://gitee.com/openharmony/device_board_unionman/blob/master/unionpi_tiger/README_zh.md,這里不多贅述。
電腦連接開發(fā)板debug口,打開串口工具,生成的可執(zhí)行文件mysubsys_test_ohos,mysubsys_test_bundle都可以在bin目錄找到,在終端執(zhí)行執(zhí)行:
結(jié)果:
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:
?https://ost.51cto.com/resource/2564。??