概述
HAR(Harmony Archive)是OpenHarmony靜態(tài)共享包」刖ぃ可以包含js/ts代碼桥状、c++庫帽揪、資源和配置文件。通過HAR岛宦,可以實(shí)現(xiàn)多個(gè)模塊或者多個(gè)工程共享ArkUI組件台丛、資源等相關(guān)代碼。HAR不同于HAP砾肺,不能獨(dú)立安裝運(yùn)行在設(shè)備上挽霉,只能作為應(yīng)用模塊的依賴項(xiàng)被引用。
如何安裝依賴har
三方庫的地址配置
要想引用三方倉中的har变汪,首先需要設(shè)置三方HAR的倉庫信息侠坎。鴻蒙默認(rèn)的倉庫地址是
[https://repo.harmonyos.com/ohpm/](https://repo.harmonyos.com/ohpm/)
如果想設(shè)置其他的倉庫地址,可以通過以下命令設(shè)置:
ohpm config set registry=your_registry1,your_registry2
或者打開.ohpmrc文件自己配置裙盾,文件位置:~/.ohpm/.ohpmrc
里面內(nèi)容:
registry=https://repo.harmonyos.com/ohpm/
strict_ssl=true
publish_registry=https://repo.harmonyos.com/ohpm/
log_level=info
fetch_timeout=60000
publish_id=17KSZKU1PZ
key_path=/Users/xxx/.ssh/id_ohpm
依賴三方庫中的har
在命令行中執(zhí)行install命令
ohpm install @ohos/lottie
執(zhí)行完上面命令后DevEco Studio會(huì)自動(dòng)在oh-package.json5下面加上lottie的依賴信息
"dependencies": {
"@ohos/lottie": "^2.0.9"
},
使用這種方式要注意執(zhí)行命令的目錄实胸,會(huì)添加到當(dāng)前目錄下的oh-package.json5中。
自己在oh-package.json5中添加依賴信息
"dependencies": {
"@ohos/lottie": "^2.0.9"
},
執(zhí)行執(zhí)行如下命令
ohpm install
推薦使用這種方式番官,自主可控
安裝好的依賴庫存放在oh_modules目錄下:
[圖片上傳失敗...(image-80a7e4-1713431947434)]
依賴自定義的Library
在命令行中依賴
創(chuàng)建module library,之后在terminal中切到Entry項(xiàng)目中添加依賴
ohpm install ../library
在工程項(xiàng)目下的oh-package.json5中直接依賴
"dependencies": {
"@ohos/library": "file:../library"
}
之后執(zhí)行ohpm install命令
如何把自定義的Library給他人使用
方式一:直接把har文件發(fā)送給對(duì)方
使用者在entry目錄下新建lib目錄庐完,把har文件放到該目錄下
[圖片上傳失敗...(image-83d39e-1713431947434)]
在oh-package.json5中添加依賴
"dependencies": {
"@ohos/log_fishing": "file:./lib/logfishing.har"
}
sync之后就可以正常使用了
方式二:把自定義的Library上傳到三方倉或自定義倉庫中
上傳到三方倉庫請(qǐng)看上篇文章,自定義倉庫如何搭建會(huì)在后續(xù)文章更新徘熔。具體使用方式和依賴三方倉中的資源庫一樣
如何使用har中提供內(nèi)容
使用har中的ArkTS頁面
在Library中门躯,通過export導(dǎo)出ArkTs頁面,示例如下:
// library/src/main/ets/components/mainpage/MainPage.ets
@Component
export struct MainPage {
@State message: string = 'HAR MainPage';
build() {
Column() {
Row() {
Text(this.message)
.fontSize(32)
.fontWeight(FontWeight.Bold)
}
.margin({ top: '32px' })
.height(56)
.width('624px')
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, alignContent: FlexAlign.Center }) {
Column() {
Image($r('app.media.pic_empty')).width('33%')
Text($r('app.string.empty'))
.fontSize(14)
.fontColor($r('app.color.text_color'))
}
}.width('100%')
.height('90%')
}
.width('100%')
.height('100%')
.backgroundColor($r('app.color.page_background'))
}
}
Har對(duì)外暴露接口:
// library/Index.ets
export { MainPage } from './src/main/ets/components/mainpage/MainPage';
使用har中的arkTs頁面
// entry/src/main/ets/pages/IndexSec.ets
import { MainPage } from 'library';
@Entry
@Component
struct IndexSec {
build() {
Row() {
// 引用HAR的ArkUI組件
MainPage()
}
.height('100%')
}
}
使用har中的方法
通過export導(dǎo)出方法
// library/src/main/ts/test.ts
export function func() {
return 'har func';
}
export function func2() {
return 'har func2';
}
har對(duì)外暴露的接口酷师,在Index.ets導(dǎo)出文件中聲明如下所示:
// library/Index.ets
export { func } from './src/main/ts/test';
export { func2 } from './src/main/ts/test';
使用har中的方法
// entry/src/main/ets/pages/Index.ets
import { Log } from 'library';
import { func } from 'library';
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
Column() {
Text(this.message)
.fontFamily('HarmonyHeiTi')
.fontWeight(FontWeight.Bold)
.fontSize(32)
.fontWeight(700)
.fontColor($r('app.color.text_color'))
.textAlign(TextAlign.Start)
.margin({ top: '32px' })
.width('624px')
Button($r('app.string.button'))
.id('button')
.height(48)
.width('624px')
.margin({ top: '4%' })
.type(ButtonType.Capsule)
.fontFamily('HarmonyHeiTi')
.borderRadius($r('sys.float.ohos_id_corner_radius_button'))
.backgroundColor($r('app.color.button_background'))
.fontColor($r('sys.color.ohos_id_color_foreground_contrary'))
.fontSize($r('sys.float.ohos_id_text_size_button1'))
.onClick(() => {
// 引用HAR的類和方法
Log.info('har msg');
this.message = 'func return: ' + func();
})
}
.width('100%')
.backgroundColor($r('app.color.page_background'))
.height('100%')
}
}
使用har中native方法
導(dǎo)出native方法
// library/src/main/ets/utils/nativeTest.ts
import native from 'liblibrary.so';
export function nativeAdd(a: number, b: number): number {
let result: number = native.add(a, b);
return result;
}
這里實(shí)際上是用Ts包了一層讶凉,導(dǎo)出的還是ts方法
使用har中的資源
library打包時(shí)會(huì)把資源一同打包的har中染乌。在編譯構(gòu)建HAP時(shí),DevEco Studio會(huì)從HAP模塊及依賴的模塊中收集資源文件懂讯,如果不同模塊下的資源文件出現(xiàn)重名沖突時(shí)荷憋,DevEco Studio會(huì)按照以下優(yōu)先級(jí)進(jìn)行覆蓋(優(yōu)先級(jí)由高到低):
- AppScope(僅API9的Stage模型支持)。
- HAP包自身模塊褐望。
- 依賴的HAR模塊勒庄,如果依賴的多個(gè)HAR之間有資源沖突,會(huì)按照工程oh-package.json5中dependencies下的依賴順序進(jìn)行覆蓋譬挚,依賴順序在前的優(yōu)先級(jí)較高锅铅。
例如下方示例中dayjs和lottie中包含同名文件時(shí)酪呻,會(huì)優(yōu)先使用dayjs中的資源减宣。
// oh-package.json5
{
"dependencies": {
"dayjs": "^1.10.4",
"lottie": "^2.0.0"
}
}
引用har中的資源
// entry/src/main/ets/pages/Index.ets
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
Column() {
// 引用HAR的字符串資源
Text($r('app.string.hello_har'))
.id('stringHar')
.fontFamily('HarmonyHeiTi')
.fontColor($r('app.color.text_color'))
.fontSize(24)
.fontWeight(500)
.margin({ top: '40%' })
List() {
ListItem() {
// 引用HAR的圖片資源
Image($r('app.media.icon_har'))
.id('iconHar')
.borderRadius('48px')
}
.margin({ top: '5%' })
.width('312px')
}
.alignListItem(ListItemAlign.Center)
}
.width('100%')
.backgroundColor($r('app.color.page_background'))
.height('100%')
}
}