ArkTS---HAR

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

一、使用场景

  • 作为二方库,发布到OHPM私仓,供公司内部其他应用使用。
  • 作为三方库,发布到OHPM中心仓,供其他应用使用。

二、约束限制

  • HAR不支持在设备上单独安装/运行,只能作为应用模块的依赖项被引用。
  • HAR不支持在配置文件中声明UIAbility组件与ExtensionAbility组件。
  • HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转。
  • HAR不支持引用AppScope目录中的资源。在编译构建时,AppScope中的内容不会打包到HAR中,因此会导致HAR资源引用失败。
  • HAR可以依赖其他HAR,但不支持循环依赖,也不支持依赖传递。

三、开发

         Index.ets文件是HAR导出声明文件的入口,HAR需要导出的接口,统一在Index.ets文件中导出。Index.ets文件是DevEco Studio默认自动生成的,用户也可以自定义,在模块的oh-package.json5文件中的main字段配置入口声明文件,配置如下所示:

{"main": "Index.ets"
}

        1、导出ArkUI组件

        ArkUI组件的导出方式与ts的导出方式一致,通过export导出ArkUI组件,示例如下:

// 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对外暴露的接口,在Index.ets导出文件中声明如下所示:

// library/Index.ets
export { MainPage } from './src/main/ets/components/mainpage/MainPage';

        2、导出ts类和方法

        通过export导出ts类和方法,支持导出多个ts类和方法,示例如下所示:

// library/src/main/ts/test.ets
export class Log {static info(msg: string) {console.info(msg);}
}export function func() {return 'har func';
}export function func2() {return 'har func2';
}

        HAR对外暴露的接口,在Index.ets导出文件中声明如下所示:

// library/Index.ets
export { Log } from './src/main/ts/test';
export { func } from './src/main/ts/test';
export { func2 } from './src/main/ts/test';

        3、导出native方法

        在HAR中也可以包含C++编写的so。对于so中的native方法,HAR通过以下方式导出,以导出liblibrary.so的加法接口add为例:

// library/src/main/ets/utils/nativeTest.ets
import native from 'liblibrary.so';export function nativeAdd(a: number, b: number): number {let result: number = native.add(a, b);return result;
}

         HAR对外暴露的接口,在Index.ets导出文件中声明如下所示:

// library/Index.ets
export { nativeAdd } from './src/main/ets/utils/nativeTest';

4、资源

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

  • AppScope(仅API9的Stage模型支持)。
  • HAP包自身模块。
    // oh-package.json5
    {"dependencies": {"dayjs": "^1.10.4","lottie": "^2.0.0"}
    }

四、使用

        1、引用HAR的ArkUI组件

        HAR的依赖配置成功后,可以引用HAR的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过import引入HAR导出的ArkUI组件,示例如下所示:

// entry/src/main/ets/pages/IndexSec.ets
import { MainPage } from 'library';@Entry
@Component
struct IndexSec {build() {Row() {// 引用HAR的ArkUI组件MainPage()}.height('100%')}
}

        2、引用HAR的ts类和方法

        通过import引用HAR导出的ts类和方法,示例如下所示:

// 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')//引用HAR的ts类和方法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%')}
}

        3、引用HAR的native方法

        通过import引用HAR导出的native方法,示例如下所示:

// entry/src/main/ets/pages/Index.ets
import { nativeAdd } 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')//引用HAR的native方法Button($r('app.string.native_add')).id('nativeAdd').height(48).width('624px').margin({ top: '4%', bottom: '6%' }).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(() => {this.message = 'result: ' + nativeAdd(1, 2);})}.width('100%').backgroundColor($r('app.color.page_background')).height('100%')}
}

        4、引用HAR的资源

        通过$r引用HAR中的资源,例如在HAR模块的src/main/resources里添加字符串资源(在string.json中定义,name:hello_har)和图片资源(icon_har.png),然后在Entry模块中引用该字符串和图片资源的示例如下所示:

// 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%')}
}

五、编译

        HAR可以作为二方库和三方库提供给其他应用使用,如果需要对代码资产进行保护时,建议开启混淆能力。

        混淆能力开启后,DevEco Studio在构建HAR时,会对代码进行编译、混淆及压缩处理,保护代码资产。

        HAR模块原先默认开启混淆能力,会对API 10及以上的HAR模块,且编译模块为release时,自动进行简单的代码混淆;从DevEco Studio 5.0.3.600开始,新建工程默认关闭代码混淆功能,可以在HAR模块的build-profile.json5文件中的ruleOptions字段下的enable进行开启混淆,配置如下所示:

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

六、编译生成TS文件

        在依赖TS HAR时,禁止引用TS HAR中的ArkUI组件。

        HAR模块中arkts文件编译后,默认产物为js文件,想要将产物修改为ts文件,可以在HAR模块src/main目录下的module.json5文件中的"metadata"字段下的"UseTsHar"进行设置,配置如下所示:

{"module": {"name": "TsClosedHar","type": "har","deviceTypes": ["default","tablet","2in1"],"metadata": [{"name": "UseTsHar","value": "true"}]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux --- 文件系统

1. 文件系统的概念 Linux 文件系统是一种用于管理、存储和组织数据的层次结构,用于在 Linux 操作系统中管理磁盘上的数据存储。它定义了如何在存储介质(如硬盘、固态硬盘或 USB 闪存)上组织文件和目录,以及如何读取、写入和操作这…

java整合DL645-2007与Dl645-1997

注意事项: 前导字节-一般在传输帧信息前,都要有0~4个FE不等,所以这里要注意,对于主站来说,直接发送4个FE作为前导字节即可。而从站回复,就不一定了,根据厂家不同而不同,有些没有FE的,也有4个FE的,所以对于接受程序,一定要慎重传输次序-所有的数据项都是先传低字节,…

鸿蒙HarmonyOS实战:IPC与RPC设备内进程通信

基本 IPC(Inter-Process Communication)与RPC(Remote Procedure Call)用于实现跨进程通信,不同的是前者使用Binder驱动,用于设备内的跨进程通信,后者使用软总线驱动,用于跨设备跨进…

嵌入式八股-C++面试35题(20240824)

1. 进程和线程的基本概念是什么? 进程:进程是操作系统分配资源的基本单位,是一个正在运行的程序实例。每个进程都有自己的内存空间、文件句柄和其他资源。线程:线程是进程的一个执行单元,是CPU调度和分派的基本单位。…

K8S部署MySQL5.7的主从服务

mysql-slave-0是master mysql-slave-1是备份 当mysql写的时候,找headless service中的 mysql-slave-0.mysql57-slave-headless;当mysql读的时候,找clusterip service中的mysql57-slave-read读,实现读写分离。 statefulset维护两个…

linux文本分析工具grep、sed和awk打印输出文本的单双奇偶行(grep也可以打印奇偶行)以及熟悉的ssh命令却有你不知道的一些用法

一、linux文本分析工具grep、sed和awk打印输出文本的单双奇偶行(grep也可以打印奇偶行) 其实sed和awk要打印输出奇偶行是很容易的事情,不过只能使用grep来输出奇偶行的话怎么实现呢?今天我就想了一下,如果真的只能使用…

【Leetcode 1897 】重新分配字符使所有字符串都相等 —— 数组模拟哈希表

给你一个字符串数组 words(下标 从 0 开始 计数)。 在一步操作中,需先选出两个 不同 下标 i 和 j,其中 words[i] 是一个非空字符串,接着将 words[i] 中的 任一 字符移动到 words[j] 中的 任一 位置上。 如果执行任意…

Latex 插入图片或表格导致页面空白过多

如图所示: Latex 插入图片或表格导致页面空白过多 我们可以采用这个方式来减少空白。 \documentclass{article} \usepackage{graphicx} % 包含图形支持 \usepackage{caption} % 提供更多对caption的控制% 设置标题上方和下方的间距 \setlength{\abovecaptionskip}{…

学习记录:js算法(十二):柱状图中最大的矩形

文章目录 柱状图中最大的矩形我的思路网上思路 总结 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1:上图 输入:…

mac 安装Arthas

mac安装有两种方式 1.第一步安装Arthas 第一种: curl -L https://arthas.aliyun.com/install.sh | sh 第二种jar包形式 curl -O https://arthas.aliyun.com/arthas-boot.jar个人比较推荐第一种因为运行测试成功了 第一种安装后可能会出现一些命令不符合 需…

网安新声 | 从微软“狂躁许可”漏洞事件看安全新挑战与应对策略

网安加社区【网安新声】栏目,汇聚网络安全领域的权威专家与资深学者,紧跟当下热点安全事件、剖析前沿技术动态及政策导向,以专业视野和前瞻洞察,引领行业共同探讨并应对新挑战的策略与可行路径。 近期,微软披露了一个最…

CyberScraper-2077+simple-one-api:使用大模型爬虫

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 swift与Internvl下的多模态大模型分布式微调指南(附代码和数据&#xff…

C语言典型例题50

《C程序设计教程(第四版)——谭浩强》 例题4.2 使用do……while语句循环求1234……100; 代码: //《C程序设计教程(第四版)——谭浩强》 //例题4.2 使用do……while语句循环求1234……100;#incl…

web后端(javaEE)开发——servlet

目录 一、web后端开发概述 二、web后端开发环境搭建 1.安装服务器软件 2.安装JDK 三、创建web后端项目 1.创建项目 2.修改设置 3.*在IDEA中集成Tomcat* 四、Servlet创建和应用 1.概述 2.Servlet程序创建与配置 3.分析Servlet程序结构 一、web后端开发概述 web开发&a…

Flutter ListView 实现不同样式 item

我们在实际开发中会创建显示不同类型内容的列表。以下是使用 Flutter 创建此类结构的方法: 1. 创建包含不同类型项目的数据源。 2. 将数据源转换为小部件列表。 创建包含不同类型项目的数据源 项目类型 要表示列表中不同类型的项目,请为每种类型的项目…

基于STM32开发的智能水箱液位控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化液位监测与控制水泵控制与状态显示Wi-Fi通信与远程监控应用场景 家庭用水系统的液位控制工业水箱的液位管理常见问题及解决方案 常见问题解决方案结论 1. 引言 智能水箱液位控制系…

Python----爬虫

开发一个比价系统来监控和分析电商平台的商品价格,可以帮助商家了解市场动态,避免不必要的价格战。这样的系统通常包括以下几个关键组件: 1. 数据抓取(Web Scraping): - 使用爬虫技术从各大电商平台抓取…

最近最少使用数据结构(LRU)

抛开算法刷题的角度&#xff0c;LRU数据结构可根据访问时间远近自动排序&#xff0c;在有些场景下还是很有用的&#xff0c;如统计用户活跃度&#xff0c;API调用热力图分析&#xff0c;缓存块管理等。下面基于c模板提供一个通用的LRU类&#xff0c;以供参考。 #include <f…

初学Python如何快速入门(内附详细攻略),一文讲清

目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广泛&#xff0c;工资也挺高&#xff0c;未来发展也极好。 Python究竟应该怎么学呢&#xff0c;我自己最初也是从零基础开始学习Python的&#xff0c;给大家分享Python的学习思路和方法。一味的买书看书…

docker私有仓库创建与推送

仓库创建 1、拉取私有仓库镜像 docker pull registry 2.创建私有仓库容器 docker run -di --name registry -p 5000:5000 -v /data/docker_registry:/var/lib/registry registry-d&#xff1a;后台运行容器&#xff1b;–name&#xff1a;为创建的容器命名&#xff1b;-p&a…