通過實(shí)例學(xué)習(xí)鴻蒙靜態(tài)庫的創(chuàng)建與使用
想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:
簡要介紹
靜態(tài)共享包HAR(Harmony Archive),是為了實(shí)現(xiàn)代碼和資源的共享,可以包含代碼、C++庫、資源和配置文件,隨使用方一起編譯,如果在多個(gè)應(yīng)用中進(jìn)行調(diào)用,就需要有多個(gè)HAR,和應(yīng)用綁定在一起,是一對一的關(guān)系。
為了從零開始熟悉靜態(tài)共享包,我們通過簡單的實(shí)例,學(xué)習(xí)一下具體的創(chuàng)建過程和使用方法。
具體實(shí)現(xiàn)
1、新建主工程
新建一個(gè)普通的HarmonyOS工程,選擇Application -> Empty Ability -> Model(Stage),開發(fā)工具不允許直接新建static library工程,個(gè)人猜測可能就是因?yàn)殪o態(tài)庫必須和應(yīng)用本身綁定在一起的緣故。
單獨(dú)的工程目錄結(jié)構(gòu)如下,當(dāng)前的模塊目錄是entry目錄,字體加粗顯示,
2、建立靜態(tài)庫
右擊工程名,選擇New -> Module…,選擇Static Library,
模塊創(chuàng)建完成后,工程結(jié)構(gòu)如下圖,staticlibrary工程目錄名粗體顯示,
我們觀察staticlibrary模塊下的module.json5文件,發(fā)現(xiàn)對應(yīng)的type值為har,代表靜態(tài)庫,主工程的type類型值為entry,而動態(tài)庫的type值官方定義為shared。本人對type值的定義感覺有點(diǎn)別扭,靜態(tài)庫和動態(tài)庫的type的定義不太對應(yīng),靜態(tài)庫type定義為har了,動態(tài)庫type為什么不能定義為hsp,或者動態(tài)庫type定義為了shared,靜態(tài)庫type為什么不能定義為static?而是現(xiàn)在這種,靜態(tài)庫type為har,動態(tài)庫type為shared,其實(shí)這些都不重要,記住就行了,也不需要手動經(jīng)常改。
3、對多種形式的封裝
查了一下文檔,HAR支持ArkUI組件、接口和資源這三種形式的封裝,所以逐一測試一下。基本方法相同,首先是在屬于提供方的模塊中,實(shí)現(xiàn)模塊功能,并在index.ets中進(jìn)行導(dǎo)出export操作,然后在使用方的應(yīng)用page頁面中進(jìn)行導(dǎo)入import操作。
HAR對ArkUI組件的支持
功能實(shí)現(xiàn):
MainPage.ets:
@Component
export struct MainPage {
@State message: string = 'Hello Har'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.fontColor(Color.Red)
}
.width('100%')
}
.height('30%')
}
}
模塊導(dǎo)出:
Index.ets:
export { MainPage } from './src/main/ets/components/mainpage/MainPage'
模塊導(dǎo)入:
導(dǎo)入har,或者引用HAR前,需要先配置對HAR的依賴,打開entry主模塊下的oh-package.json5文件,因?yàn)槲覀兪窃谥髂K中要引用靜態(tài)庫,所以我們修改模塊級依賴配置文件oh-package.json5,dependencies下添加新建的庫,后面file:…/跟著的是工程目錄樹中靜態(tài)庫的名稱staticlibrary。
我們在主模塊頁面index.ets中引入靜態(tài)庫的組件。
import { MainPage } from "@ohos/library"
@Entry
@Component
struct Index {
@State message: string = 'This is entry'
build() {
Row() {
Column() {
MainPage()
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}
現(xiàn)在基本完成了,編譯看看效果,可以先編譯靜態(tài)庫,在項(xiàng)目樹中選擇staticlibrary,然后點(diǎn)擊菜單欄中的build,會看到第一個(gè)菜單為 Make Module ‘staticlibrary’,執(zhí)行后,我們發(fā)現(xiàn)在工程代碼目錄staticlibrary\build\default\outputs\default下有一個(gè)staticlibrary.har文件,說明編譯成功。
我們再選中entry,然后點(diǎn)擊菜單欄中的build,會看到第一個(gè)菜單為 Make Module ‘entry’,執(zhí)行后,我們發(fā)現(xiàn)在工程代碼目錄entry\build\default\outputs\default下有一個(gè)entry-default-unsigned.hap文件,說明也編譯成功了。
我們通過預(yù)覽器查看一下界面。
我們再通過模擬器查看一下運(yùn)行效果。
模擬器中成功運(yùn)行,說明我們通過entry中調(diào)用staticlibrary操作成功。
HAR對ArkUI接口的支持
功能實(shí)現(xiàn):
MainInterface.ets:
export class TitleManager {
static getTitle() {
return "100以內(nèi)隨機(jī)數(shù):";
}
}
export function getRandomNum() {
return Math.floor(Math.random() * 100);
}
模塊導(dǎo)出:
Index.ets:
export { TitleManager } from './src/main/ts/MainInterface'
export { getRandomNum } from './src/main/ts/MainInterface'
模塊導(dǎo)入:
由于我們是放在同一個(gè)har包中,所以不用重新配置對HAR的依賴。直接在頁面文件中引入靜態(tài)庫中的接口。
InterfaceCaller.ets:
import { TitleManager, getRandomNum } from "@ohos/library"
@Entry
@Component
struct InterfaceCaller {
build() {
Column() {
Row() {
Text(TitleManager.getTitle())
.fontSize(30)
Text(getRandomNum().toString())
.fontSize(30)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.padding(20)
}
.height('100%')
}
}
我們通過預(yù)覽器查看一下界面。
HAR對ArkUI資源的支持
功能實(shí)現(xiàn):
直接編輯staticlibrary下的resources/base/element/和media下的資源文件即可。
String.json:
{
"string": [
{
"name": "page_show",
"value": "page from npm package"
}
]
}
Har.png:
模塊導(dǎo)出:
不需要在Index.ets中做導(dǎo)出操作,HAP模塊編譯時(shí)會自動從依賴的模塊中收集資源文件。
模塊導(dǎo)入:
由于我們是放在同一個(gè)har包中,所以不用重新配置對HAR的依賴。
對于資源文件不需要在頁面文件中顯式的執(zhí)行導(dǎo)入操作。
ResourceCaller.ets:
@Entry
@Component
struct ResourceCaller {
build() {
Row() {
Column() {
Text($r('app.string.page_show'))
.fontSize(30)
.padding(20)
Image($r("app.media.har"))
.width(100)
.objectFit(ImageFit.Contain)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.padding(20)
}
.height('100%')
}
}
我們通過預(yù)覽器查看一下界面。
至此,我們基本實(shí)踐了HAR包支持的三種形式。
經(jīng)驗(yàn)總結(jié)
以前感覺HAR很陌生,這次通過對概念的了解,知道了其作用,并通過實(shí)例動手操作,完全掌握了HAR靜態(tài)庫的開發(fā)和使用,對基本使用方法有了詳細(xì)的了解,相信在以后讀開源代碼時(shí),能夠分清靜態(tài)庫和動態(tài)庫了。