鴻蒙動態共享包har依賴與使用

概述

HAR(Harmony Archive)是OpenHarmony靜態共享包。可以包含js/ts代碼、c++庫、資源和配置文件。通過HAR,可以實現多個模塊或者多個工程共享ArkUI組件、資源等相關代碼。HAR不同于HAP,不能獨立安裝運行在設備上,只能作為應用模塊的依賴項被引用。

如何安裝依賴har

三方庫的地址配置

要想引用三方倉中的har,首先需要設置三方HAR的倉庫信息。鴻蒙默認的倉庫地址是
[https://repo.harmonyos.com/ohpm/](https://repo.harmonyos.com/ohpm/)
如果想設置其他的倉庫地址,可以通過以下命令設置:
ohpm config set registry=your_registry1,your_registry2

或者打開.ohpmrc文件自己配置,文件位置:~/.ohpm/.ohpmrc
里面內容:

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

在命令行中執行install命令

ohpm install @ohos/lottie
執行完上面命令后DevEco Studio會自動在oh-package.json5下面加上lottie的依賴信息

"dependencies": {
    "@ohos/lottie": "^2.0.9"
  },

使用這種方式要注意執行命令的目錄,會添加到當前目錄下的oh-package.json5中。

自己在oh-package.json5中添加依賴信息
"dependencies": {
  "@ohos/lottie": "^2.0.9"
},

執行執行如下命令
ohpm install
推薦使用這種方式,自主可控
安裝好的依賴庫存放在oh_modules目錄下:
[圖片上傳失敗...(image-80a7e4-1713431947434)]

依賴自定義的Library

在命令行中依賴

創建module library,之后在terminal中切到Entry項目中添加依賴
ohpm install ../library

在工程項目下的oh-package.json5中直接依賴
"dependencies": {
   "@ohos/library": "file:../library"
}

之后執行ohpm install命令

如何把自定義的Library給他人使用
方式一:直接把har文件發送給對方

使用者在entry目錄下新建lib目錄,把har文件放到該目錄下
[圖片上傳失敗...(image-83d39e-1713431947434)]
在oh-package.json5中添加依賴

 "dependencies": {
    "@ohos/log_fishing": "file:./lib/logfishing.har"
  }

sync之后就可以正常使用了

方式二:把自定義的Library上傳到三方倉或自定義倉庫中

上傳到三方倉庫請看上篇文章,自定義倉庫如何搭建會在后續文章更新。具體使用方式和依賴三方倉中的資源庫一樣

如何使用har中提供內容

使用har中的ArkTS頁面

在Library中,通過export導出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對外暴露接口:

// 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導出方法

// library/src/main/ts/test.ts

export function func() {
  return 'har func';
}

export function func2() {
  return 'har func2';
}

har對外暴露的接口,在Index.ets導出文件中聲明如下所示:

// 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方法

導出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;
}

這里實際上是用Ts包了一層,導出的還是ts方法

使用har中的資源

library打包時會把資源一同打包的har中。在編譯構建HAP時,DevEco Studio會從HAP模塊及依賴的模塊中收集資源文件,如果不同模塊下的資源文件出現重名沖突時,DevEco Studio會按照以下優先級進行覆蓋(優先級由高到低):

  • AppScope(僅API9的Stage模型支持)。
  • HAP包自身模塊。
  • 依賴的HAR模塊,如果依賴的多個HAR之間有資源沖突,會按照工程oh-package.json5中dependencies下的依賴順序進行覆蓋,依賴順序在前的優先級較高。

例如下方示例中dayjs和lottie中包含同名文件時,會優先使用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%')
  }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容