概述

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目录下:

鸿蒙动态同享包har依靠与运用

依靠自定义的Library

在指令行中依靠

创立module library,之后在terminal中切到Entry项目中添加依靠 ohpm install ../library

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

之后履行ohpm install指令

怎么把自定义的Library给他人运用
办法一:直接把har文件发送给对方

运用者在entry目录下新建lib目录,把har文件放到该目录下

鸿蒙动态同享包har依靠与运用
在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%')
  }
}