qidao123.com技术社区-IT企服评测·应用市场

标题: 鸿蒙HarmonyOS 5.0开辟:应用步伐包-HAR [打印本页]

作者: 愛在花開的季節    时间: 前天 09:39
标题: 鸿蒙HarmonyOS 5.0开辟:应用步伐包-HAR
 往期鸿蒙全套实战文章必看:(文中附带鸿蒙全栈学习资料)



HAR

HAR(Harmony Archive)是静态共享包,可以包罗代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相干代码。
使用场景


约束限定


创建

通过DevEco Studio创建一个HAR模块。
开辟

介绍如何导出HAR的ArkUI组件、接口、资源,供其他应用或当前应用的其他模块引用。
Index.ets文件是HAR导作声明文件的入口,HAR必要导出的接口,统一在Index.ets文件中导出。Index.ets文件是DevEco Studio默认自动生成的,用户也可以自定义,在模块的oh-package.json5文件中的main字段配置入口声明文件,配置如下所示:
  1. {
  2.   "main": "Index.ets"
  3. }
复制代码
导出ArkUI组件

ArkUI组件的导出方式与ts的导出方式一致,通过export导出ArkUI组件,示例如下:
  1. // library/src/main/ets/components/mainpage/MainPage.ets
  2. @Component
  3. export struct MainPage {
  4.   @State message: string = 'HAR MainPage';
  5.   build() {
  6.     Column() {
  7.       Row() {
  8.         Text(this.message)
  9.           .fontSize(32)
  10.           .fontWeight(FontWeight.Bold)
  11.       }
  12.       .margin({ top: '32px' })
  13.       .height(56)
  14.       .width('624px')
  15.       Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, alignContent: FlexAlign.Center }) {
  16.         Column() {
  17.           Image($r('app.media.pic_empty')).width('33%')
  18.           Text($r('app.string.empty'))
  19.             .fontSize(14)
  20.             .fontColor($r('app.color.text_color'))
  21.         }
  22.       }.width('100%')
  23.       .height('90%')
  24.     }
  25.     .width('100%')
  26.     .height('100%')
  27.     .backgroundColor($r('app.color.page_background'))
  28.   }
  29. }
复制代码
HAR对外袒露的接口,在Index.ets导出文件中声明如下所示:
  1. // library/Index.ets
  2. export { MainPage } from './src/main/ets/components/mainpage/MainPage';
复制代码
导出ts类和方法

通过export导出ts类和方法,支持导出多个ts类和方法,示例如下所示:
  1. // library/src/main/ts/test.ets
  2. export class Log {
  3.     static info(msg: string) {
  4.         console.info(msg);
  5.     }
  6. }
  7. export function func() {
  8.   return 'har func';
  9. }
  10. export function func2() {
  11.   return 'har func2';
  12. }
复制代码
HAR对外袒露的接口,在Index.ets导出文件中声明如下所示:
  1. // library/Index.ets
  2. export { Log } from './src/main/ts/test';
  3. export { func } from './src/main/ts/test';
  4. export { func2 } from './src/main/ts/test';
复制代码
导出native方法

在HAR中也可以包罗C++编写的so。对于so中的native方法,HAR通过以下方式导出,以导出liblibrary.so的加法接口add为例:
  1. // library/src/main/ets/utils/nativeTest.ets
  2. import native from 'liblibrary.so';
  3. export function nativeAdd(a: number, b: number): number {
  4.   let result: number = native.add(a, b);
  5.   return result;
  6. }
复制代码
HAR对外袒露的接口,在Index.ets导出文件中声明如下所示:
  1. // library/Index.ets
  2. export { nativeAdd } from './src/main/ets/utils/nativeTest';
复制代码
导出资源

在编译构建HAP时,DevEco Studio会从HAP模块及依赖的模块中收集资源文件,如果不同模块下的资源文件出现重名冲突时,DevEco Studio会按照以下优先级举行覆盖(优先级由高到低):

  1. // oh-package.json5
  2. {
  3.   "dependencies": {
  4.     "dayjs": "^1.10.4",
  5.     "lottie": "^2.0.0"
  6.   }
  7. }
复制代码
使用

介绍如何配置HAR依赖,并引用HAR的ArkUI组件、接口、资源。
引用HAR前,必要先配置对HAR的依赖。
引用HAR的ArkUI组件

HAR的依赖配置成功后,可以引用HAR的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过import引入HAR导出的ArkUI组件,示例如下所示:
  1. // entry/src/main/ets/pages/IndexSec.ets
  2. import { MainPage } from 'library';
  3. @Entry
  4. @Component
  5. struct IndexSec {
  6.   build() {
  7.     Row() {
  8.       // 引用HAR的ArkUI组件
  9.       MainPage()
  10.     }
  11.     .height('100%')
  12.   }
  13. }
复制代码
引用HAR的ts类和方法

通过import引用HAR导出的ts类和方法,示例如下所示:
  1. // entry/src/main/ets/pages/Index.ets
  2. import { Log } from 'library';
  3. import { func } from 'library';
  4. @Entry
  5. @Component
  6. struct Index {
  7.   @State message: string = 'Hello World';
  8.   build() {
  9.     Column() {
  10.       Text(this.message)
  11.         .fontFamily('HarmonyHeiTi')
  12.         .fontWeight(FontWeight.Bold)
  13.         .fontSize(32)
  14.         .fontWeight(700)
  15.         .fontColor($r('app.color.text_color'))
  16.         .textAlign(TextAlign.Start)
  17.         .margin({ top: '32px' })
  18.         .width('624px')
  19.       //引用HAR的ts类和方法
  20.       Button($r('app.string.button'))
  21.         .id('button')
  22.         .height(48)
  23.         .width('624px')
  24.         .margin({ top: '4%' })
  25.         .type(ButtonType.Capsule)
  26.         .fontFamily('HarmonyHeiTi')
  27.         .borderRadius($r('sys.float.ohos_id_corner_radius_button'))
  28.         .backgroundColor($r('app.color.button_background'))
  29.         .fontColor($r('sys.color.ohos_id_color_foreground_contrary'))
  30.         .fontSize($r('sys.float.ohos_id_text_size_button1'))
  31.         .onClick(() => {
  32.           // 引用HAR的类和方法
  33.           Log.info('har msg');
  34.           this.message = 'func return: ' + func();
  35.         })
  36.     }
  37.     .width('100%')
  38.     .backgroundColor($r('app.color.page_background'))
  39.     .height('100%')
  40.   }
  41. }
复制代码
引用HAR的native方法

通过import引用HAR导出的native方法,示例如下所示:
  1. // entry/src/main/ets/pages/Index.ets
  2. import { nativeAdd } from 'library';
  3. @Entry
  4. @Component
  5. struct Index {
  6.   @State message: string = 'Hello World';
  7.   build() {
  8.     Column() {
  9.       Text(this.message)
  10.         .fontFamily('HarmonyHeiTi')
  11.         .fontWeight(FontWeight.Bold)
  12.         .fontSize(32)
  13.         .fontWeight(700)
  14.         .fontColor($r('app.color.text_color'))
  15.         .textAlign(TextAlign.Start)
  16.         .margin({ top: '32px' })
  17.         .width('624px')
  18.       //引用HAR的native方法
  19.       Button($r('app.string.native_add'))
  20.         .id('nativeAdd')
  21.         .height(48)
  22.         .width('624px')
  23.         .margin({ top: '4%', bottom: '6%' })
  24.         .type(ButtonType.Capsule)
  25.         .fontFamily('HarmonyHeiTi')
  26.         .borderRadius($r('sys.float.ohos_id_corner_radius_button'))
  27.         .backgroundColor($r('app.color.button_background'))
  28.         .fontColor($r('sys.color.ohos_id_color_foreground_contrary'))
  29.         .fontSize($r('sys.float.ohos_id_text_size_button1'))
  30.         .onClick(() => {
  31.           this.message = 'result: ' + nativeAdd(1, 2);
  32.         })
  33.     }
  34.     .width('100%')
  35.     .backgroundColor($r('app.color.page_background'))
  36.     .height('100%')
  37.   }
  38. }
复制代码
引用HAR的资源

通过$r引用HAR中的资源,例如在HAR模块的src/main/resources里添加字符串资源(在string.json中定义,name:hello_har)和图片资源(icon_har.png),然后在Entry模块中引用该字符串和图片资源的示例如下所示:
  1. // entry/src/main/ets/pages/Index.ets
  2. @Entry
  3. @Component
  4. struct Index {
  5.   @State message: string = 'Hello World';
  6.   build() {
  7.     Column() {
  8.       // 引用HAR的字符串资源
  9.       Text($r('app.string.hello_har'))
  10.         .id('stringHar')
  11.         .fontFamily('HarmonyHeiTi')
  12.         .fontColor($r('app.color.text_color'))
  13.         .fontSize(24)
  14.         .fontWeight(500)
  15.         .margin({ top: '40%' })
  16.       List() {
  17.         ListItem() {
  18.           // 引用HAR的图片资源
  19.           Image($r('app.media.icon_har'))
  20.             .id('iconHar')
  21.             .borderRadius('48px')
  22.         }
  23.         .margin({ top: '5%' })
  24.         .width('312px')
  25.       }
  26.       .alignListItem(ListItemAlign.Center)
  27.     }
  28.     .width('100%')
  29.     .backgroundColor($r('app.color.page_background'))
  30.     .height('100%')
  31.   }
  32. }
复制代码
编译

HAR可以作为二方库和三方库提供给其他应用使用,如果必要对代码资产举行保护时,建议开启混淆本领。
混淆本领开启后,DevEco Studio在构建HAR时,会对代码举行编译、混淆及压缩处理,保护代码资产。
   说明:
  编译HAR时,如果没有开启混淆本领,编译后的产物是源码文件。
  仅Stage模子的ArkTS工程支持混淆。
  HAR开启混淆后资源ID为-1,ResourceManager等通过ID获取资源的API不再生效。
  HAR模块原先默认开启混淆本领,会对API 10及以上的HAR模块,且编译模块为release时,自动举行简单的代码混淆;从DevEco Studio 5.0.3.600开始,新建工程默认关闭代码混淆功能,可以在HAR模块的build-profile.json5文件中的ruleOptions字段下的enable举行开启混淆,配置如下所示:
  1. {
  2.   "apiType": "stageMode",
  3.   "buildOption": {
  4.   },
  5.   "buildOptionSet": [
  6.     {
  7.       "name": "release",
  8.       "arkOptions": {
  9.         "obfuscation": {
  10.           "ruleOptions": {
  11.             "enable": true,
  12.             "files": [
  13.               "./obfuscation-rules.txt"
  14.             ]
  15.           },
  16.           "consumerFiles": [
  17.             "./consumer-rules.txt"
  18.           ]
  19.         }
  20.       }
  21.     },
  22.   ],
  23.   "targets": [
  24.     {
  25.       "name": "default"
  26.     }
  27.   ]
  28. }
复制代码
编译生成TS文件

   说明:
  在HAR中使用Sendable时,开启该配置。
  使用限定
在依赖TS HAR时,禁止引用TS HAR中的ArkUI组件。
HAR模块中arkts文件编译后,默认产物为js文件,想要将产物修改为ts文件,可以在HAR模块下的module.json5文件中将"metadata"字段下的"name"设置为“UseTsHar”,配置如下所示:
  1. {
  2.   "module": {
  3.     "name": "TsClosedHar",
  4.     "type": "har",
  5.     "deviceTypes": [
  6.       "default",
  7.       "tablet",
  8.       "2in1"
  9.     ],
  10.     "metadata": [
  11.       {
  12.         "name": "UseTsHar",
  13.         "value": "true"
  14.       }
  15.     ]
  16.   }
  17. }
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4