har-package.md 6.8 KB
Newer Older
J
jsjzju 已提交
1
# HAR
C
changzheng6 已提交
2
HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
C
changzheng6 已提交
3 4

## 创建HAR模块
H
Handsome_Afraican_Man 已提交
5 6 7 8 9 10
通过DevEco Studio创建一个HAR模块,创建方式可[参考](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/creating_har_api9-0000001518082393-V3#section143510369612)

需要对代码资产进行保护时,建议开启混淆能力,混淆能力开启后,DevEco Studio在构建HAR时,会对代码进行编译、混淆及压缩处理,保护代码资产。
注意:仅Stage模型的ArkTS工程支持混淆。

### 在API9中,HAR模块默认不开启混淆能力,开启混淆能力,需要把HAR模块的build-profile.json5文件中的artifactType字段设置为obfuscation,配置如下所示:
C
changzheng6 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23

```json
{
  "apiType": "stageMode",
  "buildOption": {
      "artifactType": "obfuscation"
  }
}
```
artifactType字段有以下两种取值,默认缺省为original。
- original:不混淆。
- obfuscation:混淆,目前仅支持uglify混淆。

H
Handsome_Afraican_Man 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
### 在API10中,HAR模块默认开启混淆能力,可以在HAR模块的build-profile.json5文件中的ruleOptions字段下的enable进行设置,配置如下所示:

```json
{
  "apiType": "stageMode",
  "buildOption": {
  },
  "buildOptionSet": [
    {
      "name": "release",
      "arkOptions": {
        "obfuscation": {
          "ruleOptions": {
            "enable": true,
            "files": [
              "./obfuscation-rules.txt"
            ]
          },
          "consumerFiles": [
            "./consumer-rules.txt"
          ]
        }
      }
    },
  ],
  "targets": [
    {
      "name": "default"
    }
  ]
}
```
### 适配指导

该字段配置前向兼容,原有功能暂时不受影响。API10后续将逐步废弃,建议尽快用新的配置方式。
C
changzheng6 已提交
59

C
changzheng6 已提交
60
## HAR开发注意事项
J
jsjzju 已提交
61
- HAR不支持在配置文件中声明abilities、extensionAbilities组件。
C
changzheng6 已提交
62 63 64
- HAR不支持在配置文件中声明pages页面。
- HAR不支持在build-profile.json5文件的buildOption中配置worker。
- FA模型与Stage模型的HAR不支持相互引用。
C
changzheng6 已提交
65
- Stage模型的HAR,不能引用AppScope内的内容。在编译构建时APPScope中的内容不会打包到HAR中,导致HAR资源引用失败。
C
changzheng6 已提交
66

C
changzheng6 已提交
67
## 导出HAR的ArkUI组件、接口、资源
Y
yangmingliang 已提交
68
index.ets文件是HAR导出声明文件的入口,HAR需要导出的接口,统一在index.ets文件中导出。index.ets文件是DevEco Studio默认自动生成的,用户也可以自定义,在模块的oh-package.json5文件中的main字段配置入口声明文件,配置如下所示:
C
changzheng6 已提交
69 70 71 72 73
```json
{
  "main": "index.ets"
}
```
C
changzheng6 已提交
74
### 导出ArkUI组件
C
changzheng6 已提交
75
ArkUI组件的导出方式与ts的导出方式一致,通过`export`导出ArkUI组件,示例如下:
C
changzheng6 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
```js
// library/src/main/ets/components/MainPage/MainPage.ets
@Component
export struct MainPage {
  @State message: string = 'Hello World'
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}
```
HAR对外暴露的接口,在index.ets导出文件中声明如下所示:
```js
// library/index.ets
export { MainPage } from './src/main/ets/components/MainPage/MainPage'
```
### 导出ts类和方法
C
changzheng6 已提交
100
通过`export`导出ts类和方法,支持导出多个ts类和方法,示例如下所示:
C
changzheng6 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
```js
// library/src/main/ts/test.ets
export class Log {
    static info(msg) {
        console.info(msg);
    }
}

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

export function func2() {
  return "har func2";
}
```
HAR对外暴露的接口,在index.ets导出文件中声明如下所示:
```js
// library/index.ets
export { Log } from './src/main/ts/test'
export { func } from './src/main/ts/test'
export { func2 } from './src/main/ts/test'
```
### 资源
C
changzheng6 已提交
125
HAR模块编译打包时会把资源打包到HAR中。在编译构建HAP时,DevEco Studio会从HAP模块及依赖的模块中收集资源文件,如果不同模块下的资源文件出现重名冲突时,DevEco Studio会按照以下优先级进行覆盖(优先级由高到低):
C
changzheng6 已提交
126 127 128 129
- AppScope(仅API9的Stage模型支持)。
- HAP包自身模块。
- 依赖的HAR模块,如果依赖的多个HAR之间有资源冲突,会按照依赖顺序进行覆盖(依赖顺序在前的优先级较高)。

C
changzheng6 已提交
130
## 引用HAR的ArkUI组件、接口、资源
J
junyi233 已提交
131
引用HAR前,需要先配置对HAR的依赖,配置方式可[参考](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/creating_har_api9-0000001518082393-V3#section611662614153)
C
changzheng6 已提交
132

C
changzheng6 已提交
133
### 引用HAR的ArkUI组件
C
changzheng6 已提交
134

C
changzheng6 已提交
135
HAR的依赖配置成功后,可以引用HAR的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过`import`引入HAR导出的ArkUI组件,示例如下所示:
C
changzheng6 已提交
136 137 138 139 140 141 142 143 144 145
```js
// entry/src/main/ets/pages/index.ets
import { MainPage } from "@ohos/library"

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  build() {
    Row() {
C
changzheng6 已提交
146
      // 引用HAR的ArkUI组件
C
changzheng6 已提交
147 148 149 150 151 152 153 154 155 156 157 158
      MainPage()
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}
```
C
changzheng6 已提交
159 160
### 引用HAR的类和方法
通过`import`引用HAR导出的ts类和方法,示例如下所示:
C
changzheng6 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173
```js
// entry/src/main/ets/pages/index.ets
import { Log } from "@ohos/library"
import { func } from "@ohos/library"

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button('Button')
          .onClick(()=>{
C
changzheng6 已提交
174
            // 引用HAR的类和方法
C
changzheng6 已提交
175 176 177 178 179 180 181 182 183 184
            Log.info("har msg");
            func();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
```
C
changzheng6 已提交
185 186
### 引用HAR的资源
通过`$r`引用HAR中的资源,例如在HAR模块的`src/main/resources`里添加字符串资源(在string.json中定义,name:hello_har)和图片资源(icon_har.png),然后在Entry模块中引用该字符串和图片资源的示例如下所示:
C
changzheng6 已提交
187 188 189 190 191 192 193 194
```js
// entry/src/main/ets/pages/index.ets
@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
C
changzheng6 已提交
195
        // 引用HAR的字符串资源
C
changzheng6 已提交
196 197 198
        Text($r("app.string.hello_har"))
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
C
changzheng6 已提交
199
        // 引用HAR的图片资源
C
changzheng6 已提交
200
        Image($r("app.media.icon_har"))
C
changzheng6 已提交
201 202 203 204 205 206 207
      }
      .width('100%')
    }
    .height('100%')
  }
}
```
J
junyi233 已提交
208 209 210 211

## 发布HAR

发布HAR可[参考](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/creating_har_api9-0000001518082393-V3#section1213451811512)