梳理NEXT的工程結(jié)構(gòu)與應(yīng)用程序包結(jié)構(gòu)

?三層工程結(jié)構(gòu)

項(xiàng)目里采用的工程結(jié)構(gòu)是官方推薦的“三層工程結(jié)構(gòu)”伐蒂,本質(zhì)上和Android工程里的結(jié)構(gòu)是類似的煞躬。如下圖HMOSWorld里的工程結(jié)構(gòu):

1、common(公共能力層)

該路徑下的各個(gè)module是一些公共基礎(chǔ)能力逸邦,比如工具庫(kù)恩沛、公共配置、通用常量缕减、自定義基礎(chǔ)組件等雷客。

common路徑下的各個(gè)module可以根據(jù)具體的module設(shè)計(jì)需求,在創(chuàng)建時(shí)可以選擇Shared Library或Static Library烛卧,選擇了Static Library創(chuàng)建的后續(xù)需編譯成一個(gè)HAR包佛纫。該路徑下的module們只可以被products或features路徑下的module依賴,不可以反向依賴总放。該路徑下的module之間是可以橫向調(diào)用的呈宇。

注意:a、選擇Shared Library創(chuàng)建的module局雄,在后續(xù)編譯時(shí)甥啄,會(huì)生成一個(gè).hsp文件,同時(shí)其內(nèi)部的使用export關(guān)鍵字修飾的class炬搭、interface蜈漓、function等可導(dǎo)出項(xiàng)還會(huì)被組合一起打一個(gè).har包宫盔。各個(gè)宿主module通過該.har來引用HSP里的導(dǎo)出項(xiàng)有额,但是在進(jìn)程中該HSP的代碼只有一份,大家共享茴迁。

b、選擇Static Library創(chuàng)建的module倦卖,在后續(xù)編譯時(shí)糖耸,該module會(huì)被打成一個(gè)har包嘉竟,凡是引用了該module里的可導(dǎo)出項(xiàng)或資源的宿主module舍扰,在后續(xù)打出的hap包里都會(huì)擁有該har包希坚。要注意避免引入過多的無用代碼裁僧。

2、features(基礎(chǔ)特性層/業(yè)務(wù)模塊層)

該路徑下一般是各個(gè)業(yè)務(wù)模塊茬底,各個(gè)module高內(nèi)聚获洲、低耦合贡珊,可以供products層的各個(gè)entry選擇性地引用门岔,以實(shí)現(xiàn)靈活地部署寒随。不需要單獨(dú)部署的module通常會(huì)被編譯為HAR包逢防,供products層或features層的其它module使用忘朝。需要單獨(dú)部署的module通常會(huì)被編譯為Feature類型的HAP包,和products下Entry類型的HAP包進(jìn)行組合部署晦墙。features層里的各個(gè)module可以橫向調(diào)用及依賴common層晌畅,同時(shí)可以被products層里的不同設(shè)備形態(tài)的HAP(可以認(rèn)為是不同的項(xiàng)目)所依賴但指,但是不能反向依賴products層里的entry module抗楔。

在創(chuàng)建時(shí),選擇前面圖中的Empty Ability连躏,選擇feature。

3入热、products(產(chǎn)品定制層)

該路徑下的各個(gè)entry module是在不同的設(shè)備情況下app應(yīng)用的入口拍棕,每個(gè)module會(huì)針對(duì)不同的設(shè)備形態(tài)進(jìn)行不同的功能和特性集成。

它們各自被編譯為一個(gè)Entry類型的HAP包绰播,作為應(yīng)用主入口。products層不可以橫向調(diào)用。

注意:整個(gè)代碼工程最終會(huì)構(gòu)建出一個(gè)APP包尾组,應(yīng)用以APP包的形式發(fā)布到應(yīng)用市場(chǎng)中。

引用module

在工程內(nèi)上層引用下層的module時(shí)

有兩種簡(jiǎn)單的操作方式:

a跨跨、在Terminal窗口中囱皿,執(zhí)行如下命令進(jìn)行安裝嘱腥,IDE會(huì)在引用方module里的oh-package.json5中自動(dòng)添加依賴。

比如entry要引用不同路徑下的utils拘悦,utils要引用同路徑下的constants:

cd entry 或 cd ../common/utils//? 切到entry module目錄下 或 切到common路徑下的utils module目錄下

ohpm install ../common/utils 或 ohpm install ../constants// 把utils module引用到entry module中 或 把同為common路徑下的constants module引用到utils module中

結(jié)果如下齿兔,在oh-package.json5文件中的dependencies里會(huì)生成依賴項(xiàng):

{

? "name": "entry",

? "version": "1.0.0",

? "description": "Please describe the basic information.",

? "main": "",

? "author": "",

? "license": "",

? "dependencies": {

? ? "@ohos/utils": "file:../common/utils"? ? ? ? ? // key為utils module的name,value是utils module的路徑

? },

? "devDependencies": {},

? "dynamicDependencies": {}

}

// 或者

{

? "name": "@ohos/utils",

? "version": "1.0.0",

? "description": "Please describe the basic information.",

? "main": "Index.ets",

? "author": "",

? "license": "Apache-2.0",

? "dependencies": {

? ? "constants": "file:../constants"? ? ? ? ? ? // key為同路徑下的constants module的name础米,value是constants module的路徑

? },

? "devDependencies": {},

? "dynamicDependencies": {}

}

b分苇、直接在entry或utils下的oh-package.json5文件中手動(dòng)添加依賴項(xiàng),然后sync project屁桑。

引用社區(qū)庫(kù)時(shí)

社區(qū)庫(kù)是指由代碼貢獻(xiàn)者已經(jīng)上架到ohpm中心供其他開發(fā)者下載使用的庫(kù)医寿,可以通過如下兩種方式設(shè)置對(duì)ohpm倉(cāng)三方包的依賴信息,這里推薦第一種蘑斧。

(下面步驟以@ohos/lottie三方庫(kù)舉例):

方式一:在Terminal窗口中靖秩,執(zhí)行如下命令安裝三方包,DevEco Studio會(huì)自動(dòng)在當(dāng)前module中的oh-package.json5中自動(dòng)添加三方包依賴乌叶。

ohpm install @ohos/lottie

結(jié)果示例:

{

? "name": "entry",

? "version": "1.0.0",

? "description": "Please describe the basic information.",

? "main": "",

? "author": "",

? "license": "",

? "dependencies": {

? ? "@ohos/utils": "file:../common/utils",

? ? "@ohos/lottie": "^2.0.12"? ? ? ? // 注意:value里版本號(hào)前面有個(gè)符合^

? },

? "devDependencies": {},

? "dynamicDependencies": {}

}

方式二:在工程的某個(gè)module中的oh-package.json5文件中設(shè)置三方包依賴盆偿,配置示例如下:

"dependencies": {

? "@ohos/lottie": "^2.0.12"

}

其實(shí)是跟上面的步驟一樣的,只是手動(dòng)處理下而已准浴。

module的name里包含@ohos

在一個(gè)module里的oh-package.json5文件中事扭,name字段對(duì)應(yīng)的字符串值是用于設(shè)置該module的名稱的。如果名稱中包含了@ohos/這樣的字樣乐横,表明這是一個(gè)屬于鴻蒙操作系統(tǒng)生態(tài)里(ohpm倉(cāng)庫(kù))提供的可供三方應(yīng)用使用的庫(kù)求橄。‘@ohos’命名標(biāo)識(shí)是用于區(qū)分是社區(qū)庫(kù)提供的模塊還是用戶工程里自定義的其他模塊葡公。

例如罐农,我們想要引用一個(gè)社區(qū)庫(kù)時(shí),如網(wǎng)絡(luò)模塊axios催什。在提供方工程的axios module里涵亏,它的oh-package.json5中的name應(yīng)該這樣寫:

{

? ? "name": "@ohos/axios",

? ? "description": "Axios ,是一個(gè)基于 promise 的網(wǎng)絡(luò)請(qǐng)求庫(kù)蒲凶。本庫(kù)气筋。。旋圆。",

? ? // ....

}

在我們的代碼中就可以通過@ohos/axios來引用這個(gè)模塊了宠默,這有助于避免與我們自己工程里的同名模塊發(fā)生沖突,我們工程里引用axios模塊的module里的oh-package.json5文件如下:

{

? "name": "entry",

? // ...

? "dependencies": {

? ? "constants": "file:../constants",? ? ? // 自己工程里的constants module

? ? "@ohos/axios": "^2.2.3"? ? ? ? ? ? ? ? // 發(fā)布到ohos社區(qū)庫(kù)里的開源庫(kù)axios

? }

}

應(yīng)用程序包的結(jié)構(gòu)

工程里的多module機(jī)制

在進(jìn)行應(yīng)用開發(fā)時(shí)灵巧,一個(gè)應(yīng)用工程中通常包含一個(gè)或多個(gè)Module搀矫。Module中包含了源代碼抹沪、資源文件、第三方庫(kù)及應(yīng)用/服務(wù)配置文件瓤球,每一個(gè)Module都可以獨(dú)立進(jìn)行編譯和運(yùn)行融欧。

Module分為“Ability”和“Library”兩種類型:

“Ability”類型的Module編譯后生成HAP包,type為entry或feature冰垄。

“Library”類型的Module編譯后生成HAR包蹬癌,type為har或shared,shared的同時(shí)還生成hsp包虹茶。

不同類型的hap包

HarmonyOS應(yīng)用是以APP Pack的形式發(fā)布的,app包里包含了一個(gè)或多個(gè)hap包隅要。HAP是HarmonyOS應(yīng)用在安裝時(shí)的基本單位蝴罪,HAP可以分為Entry和Feature兩種類型:

1、Entry類型的HAP:即應(yīng)用的主模塊步清。在同一個(gè)應(yīng)用中要门,同一設(shè)備類型只支持一個(gè)Entry類型的HAP,通常用于實(shí)現(xiàn)應(yīng)用的入口界面廓啊、入口圖標(biāo)欢搜、主特性功能等。

注意:不同的設(shè)備形態(tài)谴轮,比如手機(jī)(phone)和平板(tablet)屬于不同的形態(tài)炒瘟,是分別有不同的Entry類型的hap包的,但是它們都在同一個(gè)app pack中第步,應(yīng)用是以pack上架應(yīng)用市場(chǎng)的疮装,在不同的設(shè)備形態(tài)上的應(yīng)用市場(chǎng)中可以分別下載安裝各自對(duì)應(yīng)的Entry類型的hap包。

2粘都、Feature類型的HAP:應(yīng)用的動(dòng)態(tài)特性模塊廓推。Feature類型的HAP通常用于實(shí)現(xiàn)應(yīng)用的特性功能,一個(gè)應(yīng)用程序包可以包含一個(gè)或多個(gè)Feature類型的HAP翩隧,也可以不包含樊展。

編譯態(tài)的包結(jié)構(gòu)

不同類型的Module編譯后會(huì)生成對(duì)應(yīng)的HAP、HAR堆生、HSP等文件专缠,開發(fā)態(tài)視圖與編譯態(tài)視圖的對(duì)照關(guān)系如下:

從開發(fā)態(tài)到編譯態(tài),一個(gè)Module中的文件會(huì)發(fā)生如下變更:

ets目錄:里面的所有ArkTS源碼會(huì)被編譯生成一個(gè).abc文件顽频。

resources目錄:AppScope目錄下的資源文件會(huì)合入到每個(gè)Module下面的資源目錄中藤肢,如果兩個(gè)目錄下存在重名文件,編譯打包后只會(huì)保留AppScope目錄下的資源文件糯景。

module配置文件:AppScope目錄下的app.json5文件字段會(huì)合入到每個(gè)Module下面的module.json5文件之中嘁圈,編譯后生成HAP或HSP最終的module.json文件省骂。

注意:在編譯生成HAP和HSP時(shí),會(huì)把他們所依賴的HAR包直接編譯到HAP和HSP中最住。

發(fā)布態(tài)的包結(jié)構(gòu)

每個(gè)應(yīng)用(app pack)中至少包含了一個(gè).hap文件钞澳,同時(shí)可能包含若干個(gè).hsp文件,也可能不含涨缚。一個(gè)應(yīng)用中的所有的.hap與.hsp文件合在一起稱為Bundle轧粟,它的bundleName字段的值是應(yīng)用的唯一標(biāo)識(shí),即安卓中常說的包名脓魏。

當(dāng)一個(gè)應(yīng)用要發(fā)布上架到應(yīng)用市場(chǎng)時(shí)兰吟,需要將Bundle打包為一個(gè).app后綴的文件用于上架,這個(gè).app文件稱為App Pack(Application Package)茂翔,與此同時(shí)混蔼,DevEco Studio工具會(huì)自動(dòng)生成一個(gè)pack.info文件。pack.info文件里描述了App Pack中每個(gè)HAP和HSP的屬性珊燎,包含APP中的bundleName和versionCode信息惭嚣、以及每個(gè)Module中的name、type和abilities等信息悔政。

所以晚吞,發(fā)布態(tài)的包結(jié)構(gòu)里包含了:1個(gè)entry.hap、0個(gè)或多個(gè)feature.hap谋国、0個(gè)或多個(gè)library.hsp槽地、pack.info峭咒。

打包-上架-下載安裝的流程如下:

注意:

1婆芦、App Pack是發(fā)布上架到應(yīng)用市場(chǎng)的基本單元,但是不能在設(shè)備上直接安裝和運(yùn)行能真。

2旅急、在應(yīng)用簽名逢勾、云端分發(fā)、端側(cè)安裝時(shí)藐吮,都是以HAP/HSP為單位進(jìn)行簽名溺拱、分發(fā)和安裝的。

結(jié)語:希望每一次梳理-總結(jié)都能帶給你我一定的收獲谣辞。迫摔。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泥从,一起剝皮案震驚了整個(gè)濱河市句占,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躯嫉,老刑警劉巖纱烘,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杨拐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡擂啥,警方通過查閱死者的電腦和手機(jī)哄陶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哺壶,“玉大人屋吨,你說我怎么就攤上這事∩奖觯” “怎么了至扰?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)资锰。 經(jīng)常有香客問我渊胸,道長(zhǎng),這世上最難降的妖魔是什么台妆? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮胖翰,結(jié)果婚禮上接剩,老公的妹妹穿的比我還像新娘。我一直安慰自己萨咳,他們只是感情好懊缺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著培他,像睡著了一般鹃两。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舀凛,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天俊扳,我揣著相機(jī)與錄音,去河邊找鬼猛遍。 笑死馋记,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懊烤。 我是一名探鬼主播梯醒,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腌紧!你這毒婦竟也來了茸习?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤壁肋,失蹤者是張志新(化名)和其女友劉穎号胚,沒想到半個(gè)月后籽慢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涕刚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嗡综,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杜漠。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡极景,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驾茴,到底是詐尸還是另有隱情盼樟,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布锈至,位于F島的核電站晨缴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏峡捡。R本人自食惡果不足惜击碗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望们拙。 院中可真熱鬧稍途,春花似錦、人聲如沸砚婆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)装盯。三九已至坷虑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埂奈,已是汗流浹背迄损。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挥转,地道東北人海蔽。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绑谣,于是被迫代替她去往敵國(guó)和親党窜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容