通過實例學習鴻蒙靜態庫的創建與使用
簡要介紹
靜態共享包HAR(Harmony Archive),是為了實現代碼和資源的共享,可以包含代碼、C++庫、資源和配置文件,隨使用方一起編譯,如果在多個應用中進行調用,就需要有多個HAR,和應用綁定在一起,是一對一的關系。
為了從零開始熟悉靜態共享包,我們通過簡單的實例,學習一下具體的創建過程和使用方法。
具體實現
1、新建主工程
新建一個普通的HarmonyOS工程,選擇Application -> Empty Ability -> Model(Stage),開發工具不允許直接新建static library工程,個人猜測可能就是因為靜態庫必須和應用本身綁定在一起的緣故。
單獨的工程目錄結構如下,當前的模塊目錄是entry目錄,字體加粗顯示,
2、建立靜態庫
右擊工程名,選擇New -> Module…,選擇Static Library,
模塊創建完成后,工程結構如下圖,staticlibrary工程目錄名粗體顯示,
我們觀察staticlibrary模塊下的module.json5文件,發現對應的type值為har,代表靜態庫,主工程的type類型值為entry,而動態庫的type值官方定義為shared。本人對type值的定義感覺有點別扭,靜態庫和動態庫的type的定義不太對應,靜態庫type定義為har了,動態庫type為什么不能定義為hsp,或者動態庫type定義為了shared,靜態庫type為什么不能定義為static?而是現在這種,靜態庫type為har,動態庫type為shared,其實這些都不重要,記住就行了,也不需要手動經常改。
3、對多種形式的封裝
查了一下文檔,HAR支持ArkUI組件、接口和資源這三種形式的封裝,所以逐一測試一下?;痉椒ㄏ嗤紫仁窃趯儆谔峁┓降哪K中,實現模塊功能,并在index.ets中進行導出export操作,然后在使用方的應用page頁面中進行導入import操作。
HAR對ArkUI組件的支持
功能實現:
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%')
}
}
模塊導出:
Index.ets:
export { MainPage } from './src/main/ets/components/mainpage/MainPage'
模塊導入:
導入har,或者引用HAR前,需要先配置對HAR的依賴,打開entry主模塊下的oh-package.json5文件,因為我們是在主模塊中要引用靜態庫,所以我們修改模塊級依賴配置文件oh-package.json5,dependencies下添加新建的庫,后面file:…/跟著的是工程目錄樹中靜態庫的名稱staticlibrary。
我們在主模塊頁面index.ets中引入靜態庫的組件。
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%')
}
}
現在基本完成了,編譯看看效果,可以先編譯靜態庫,在項目樹中選擇staticlibrary,然后點擊菜單欄中的build,會看到第一個菜單為 Make Module ‘staticlibrary’,執行后,我們發現在工程代碼目錄staticlibrary\build\default\outputs\default下有一個staticlibrary.har文件,說明編譯成功。
我們再選中entry,然后點擊菜單欄中的build,會看到第一個菜單為 Make Module ‘entry’,執行后,我們發現在工程代碼目錄entry\build\default\outputs\default下有一個entry-default-unsigned.hap文件,說明也編譯成功了。
我們通過預覽器查看一下界面。
我們再通過模擬器查看一下運行效果。
模擬器中成功運行,說明我們通過entry中調用staticlibrary操作成功。
HAR對ArkUI接口的支持
功能實現:
MainInterface.ets:
export class TitleManager {
static getTitle() {
return "100以內隨機數:";
}
}
export function getRandomNum() {
return Math.floor(Math.random() * 100);
}
模塊導出:
Index.ets:
export { TitleManager } from './src/main/ts/MainInterface'
export { getRandomNum } from './src/main/ts/MainInterface'
模塊導入:
由于我們是放在同一個har包中,所以不用重新配置對HAR的依賴。直接在頁面文件中引入靜態庫中的接口。
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%')
}
}
我們通過預覽器查看一下界面。
HAR對ArkUI資源的支持
功能實現:
直接編輯staticlibrary下的resources/base/element/和media下的資源文件即可。
String.json:
{
"string": [
{
"name": "page_show",
"value": "page from npm package"
}
]
}
Har.png:
模塊導出:
不需要在Index.ets中做導出操作,HAP模塊編譯時會自動從依賴的模塊中收集資源文件。
模塊導入:
由于我們是放在同一個har包中,所以不用重新配置對HAR的依賴。
對于資源文件不需要在頁面文件中顯式的執行導入操作。
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%')
}
}
我們通過預覽器查看一下界面。
至此,我們基本實踐了HAR包支持的三種形式。
經驗總結
以前感覺HAR很陌生,這次通過對概念的了解,知道了其作用,并通過實例動手操作,完全掌握了HAR靜態庫的開發和使用,對基本使用方法有了詳細的了解,相信在以后讀開源代碼時,能夠分清靜態庫和動態庫了。