鴻蒙動(dòng)態(tài)共享包har依賴與使用

概述

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%')
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玩荠,隨后出現(xiàn)的幾起案子漆腌,更是在濱河造成了極大的恐慌,老刑警劉巖阶冈,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷尿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡女坑,警方通過查閱死者的電腦和手機(jī)填具,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匆骗,“玉大人劳景,你說我怎么就攤上這事〉锞停” “怎么了盟广?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓮钥。 經(jīng)常有香客問我筋量,道長,這世上最難降的妖魔是什么碉熄? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任桨武,我火速辦了婚禮,結(jié)果婚禮上锈津,老公的妹妹穿的比我還像新娘呀酸。我一直安慰自己,他們只是感情好一姿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布七咧。 她就那樣靜靜地躺著跃惫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艾栋。 梳的紋絲不亂的頭發(fā)上爆存,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音蝗砾,去河邊找鬼先较。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悼粮,可吹牛的內(nèi)容都是我干的闲勺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼扣猫,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菜循!你這毒婦竟也來了告匠?” 一聲冷哼從身側(cè)響起堡距,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刃泌,沒想到半個(gè)月后昧穿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勺远,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年时鸵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胶逢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饰潜,死狀恐怖初坠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囊拜,我是刑警寧澤某筐,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站冠跷,受9級(jí)特大地震影響南誊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜜托,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一抄囚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橄务,春花似錦幔托、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗓化。三九已至,卻和暖如春谬哀,著一層夾襖步出監(jiān)牢的瞬間刺覆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工史煎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谦屑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓篇梭,卻偏偏與公主長得像氢橙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恬偷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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