鸿蒙系列--动态共享包的依赖与使用

一、前言

        HarmonyOS的共享包相当于Android的Library,在HarmonyOS中,给开发者提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包

区别:

  • 静态共享包中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝
  • 动态共享包中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份

动态共享包解决的问题:

  • 多个使用方引用相同的共享包,导致的APP包大小膨胀问题
  • 多个使用方引用相同的共享包,共享包中的一些状态变量无法共享的问题

两者的使用场景:

  • 仅用于应用内部代码、资源的共享,建议使用动态共享包
  • 作为应用模块的依赖项被引用,就可以选择静态共享包

二、共享包的创建

File -> New -> Module

有两种共享包,一种是一种是动态共享包Shared Library,一种是静态共享包Static Library

选择一种共享包,点击Next

设置共享包的name,点击Finish,即可完成共享包的创建

动态共享包创建完毕之后,其type类型为【shared】,如果你创建的是静态共享包,这里的类型就是【har】

三、动态共享包添加依赖

动态共享包创建完成之后,有两个Module,主Module【entry】和动态共享包【Common】

如何在【entry】中调用【Common】模块中的代码和资源文件等,需要让【entry】关联依赖上【Common】

要使用HSP中的接口,首先需要在使用方的oh-package.json5中配置对它的依赖

1、依赖方式一

在【entry】中的oh-package.json5文件中,在dependencies中引入共享包【Common】

引入格式:

'folder': "file:../folder"

描述:

  • 后面的folder就是创建的共享包名称,比如这里的Common
  • 前面的folder是用来生成的映射目录,可与共享包名称,也可以自行定义

添加了之后需要同步项目,点击【Sync Now】即可,也可以点击提示信息下的【Run 'ohpm install'

同步之后,该模块就会被映射到Module【entry】的oh_modules目录下

2、依赖方式二

也可以使用@xx/xx来添加依赖

引入格式:

"@xx/xx": "file:../Common"   

比如:import { add } from '@ohos/Common'

同步之后会在oh_modules目录下创建ohos>Common

3、依赖方式三

        除了以上手动方式添加依赖之外,也可以使用命令的方式进行实现,命令行中或在IDE Terminal窗口中,目录进入到主模块下,执行ohpm install ../folder命令,folder是你的共享包

apple@lengfeng MyApplication % cd entry
apple@lengfeng entry % ohpm install ../Common

注意:需要提前配置ohpm

命令执行完毕之后,也会自动的在oh-package.json5里添加依赖,并生成映射文件

四、动态共享包调用方式

1.方法调用

在创建的共享包Common中,有一个自动创建一个工具类Calc,里面有一个求和方法add       

 使用的时候需要引入:

import { add } from 'common/src/main/ets/utils/Calc'

//或者第二种依赖方式导包

import { add } from '@ohos/Common'

使用如下:

import { add } from 'common/src/main/ets/utils/Calc'
//或者
//import { add } from '@ohos/Common'
//或者
//import { add } from 'common'@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {var result = add(1, 2)this.message = "result=" + result})}.width('100%')}.height('100%')}
}

案例中是给一个Text增加一个点击事件,然后调用【Common】中的Calc类的add方法,返回一个结果,并显示更新Text

预览是一片空白的,没关系,直接运行到模拟器,或者HarmonyOS手机上查看,没想到报错了

根据报错信息提示:未执行部署多个包,由于增加了一个【Common】共享包,解决方案是

选择上面运行模块,选择Edit Configurations

Deploy Multi Hap标签页,勾选Deploy Multi Hap Packages,然后选择新增的共享包即可,将entry和library模块一起运行

然后就能正常运行了

点击文本,就能看到计算后的结果了

2.类的调用

调用共享包中的工具类

在共享包中定义一个工具类Log.ts,需要用export关键字进行对外暴露

export class Log {static i(msg: string) {console.info(msg)}static e(msg: string) {console.error(msg)}
}

然后在【common】的Index添加导出Log,对外暴露的接口,需要在入口文件index.ets中声明

在【entry】中导入类,就可以直接使用了

import { add,Log } from 'common'@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {var result = add(1, 2)this.message = "result=" + resultLog.i("----------------")})}.width('100%')}.height('100%')}
}

点击Text后打印出日志:

3.组件的调用

组件的调用跟类的调用一致

先export导出,然后import导入

@Component
export struct CommonText {@State message: string = '我是Common模块中的组件'build() {Row() {Column() {Text(this.message).fontSize(20).fontWeight(FontWeight.Bold).fontColor(Color.Red)}.width('100%')}}
}

import { add, Log, CommonText } from 'common'@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {var result = add(1, 2)this.message = "result=" + resultLog.info("----------------")})CommonText()}.width('100%')}.height('100%')}
}

效果图:

4.页面路由跳转

想在【entry】模块中,添加一个按钮跳转至【Common】模块中的CommonIndex页面(路径为:Common/src/main/ets/pages/CommonIndex.ets),那么可以在使用方的代码(entry模块下的Index.ets,路径为:entry/src/main/ets/pages/Index.ets)里这样使用:

import { add, Log, CommonText } from 'common'
import router from '@ohos.router'@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {var result = add(1, 2)this.message = "result=" + resultLog.info("----------------")})CommonText().onClick(() => {router.pushUrl({ url: '@bundle:com.lf.myapplication/Common/ets/pages/CommonIndex' }).then(() => {console.log("push page success");}).catch(err => {console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);})})}.width('100%')}.height('100%')}
}

其中router.pushUrl方法的入参中url的内容为:

'@bundle:com.lf.myapplication/Common/ets/pages/CommonIndex'

内容格式为:

'@bundle:包名(bundleName)/模块名(moduleName)/路径/页面所在的文件名(不加.ets后缀)'

包名的查看路径:

AppScope -> app.json5中可以查看app的信息,包括包名,版本code、name等

效果图:

点击 CommonText()组件跳转到【Common】模块中的CommonIndex页面

5.资源访问

创建资源目录:

选择模块名 > 右击 > New > Resource File

  • 可同时创建资源目录和资源文件,文件默认创建在base目录的对应资源组。如果选择了限定词,则会按照命名规范自动生成限定词和资源组目录,并将文件创建在限定词目录中
  • 图中File name为需要创建的文件名。Resource type为资源组类型,默认是element。Root Element为资源类型。Avaliable qualifiers为供选择的限定词目录,通过右边的小箭头可添加或者删除

创建资源文件

在资源目录(element、media、profile)的右键菜单选择“New > XXX Resource File”,即可创建对应资源组目录的资源文件。例如,在element目录下可新建Element Resource File

资源包内资源访问
  • 对于应用资源,在工程中,通过"$r('app.type.name')"形式引用。其中,app为应用内resources目录中定义的资源;type为资源类型或资源的存放位置,取值包含“color”、“float”、“string”、“plural”、“media”;name为资源命名,由开发者定义资源时确定

  • 对于rawfile目录资源,通过"$rawfile('filename')"形式引用。其中,filename为rawfile目录下文件的相对路径,文件名需要包含后缀,路径开头不可以以"/"开头

  • 对于rawfile目录的descriptor,可通过资源管理的getRawId接口引用,其返回值descriptor.fd为hap包的fd。此时,访问rawfile文件需要结合{fd, offset, length}一起使用

Text($r('app.string.string_hello')).fontColor($r('app.color.color_hello')).fontSize($r('app.float.font_hello'))//引用string.json资源。Text中$r的第一个参数指定string资源,第二个参数用于替换string.json文件中的%s
//"这是原文本,可以拼接一个:%s"
Text($r('app.string.message_arrive', "拼接文本"))// media资源的$r引用
Image($r('app.media.my_background_image'))  // rawfile$r引用rawfile目录下图片
Image($rawfile('test.png'))                 // rawfile$r引用rawfile目录下图片
Image($rawfile('newDir/newTest.png'))       
  • 对于系统资源,可以通过“$r('sys.type.resource_id')”的形式引用。其中,sys为系统资源;type为资源类型,取值包括“color”、“float”、“string”、“media”;resource_id为资源id
Text('Hello').fontColor($r('sys.color.ohos_id_color_emphasize')).fontSize($r('sys.float.ohos_id_text_size_headline1')).fontFamily($r('sys.string.ohos_id_text_font_family_medium')).backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))Image($r('sys.media.ohos_app_icon')).border({color: $r('sys.color.ohos_id_color_palette_aux1'),radius: $r('sys.float.ohos_id_corner_radius_button'), width: 2}).margin({top: $r('sys.float.ohos_id_elements_margin_horizontal_m'),bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')}).height(200).width(300)
跨包访问资源

注意:HarmonyOS目前还不支持资源跨包调用

如果确实需要使用共享包中的资源,可以另辟蹊径。

既然资源不能暴露,但是类和方法可以暴露,也就是可以把资源中的属性,通过工具类做一层中转即可

1.定义资源

在【Common】中有一个字符串资源message_arrive,想要在【entry】中使用,如何实现呢?

2.定义工具类

定义一个工具类中转 StringUtil.ets,就可以拿到对应的资源文件了

export class StringUtil {static getArriveMessage(): Resource {return $r('app.string.message_arrive')}
}
3.调用

按照之前的方式导包,然后调用工具类的方法即可

Text(StringUtil.getArriveMessage('可以拼接文本'))

import { add, Log, CommonText, StringUtil } from 'common'
import router from '@ohos.router'@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {var result = add(1, 2)this.message = "result=" + resultLog.info("----------------")})CommonText().onClick(() => {router.pushUrl({ url: '@bundle:com.lf.myapplication/Common/ets/pages/CommonIndex' }).then(() => {console.log("push page success");}).catch(err => {console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);})})Text(StringUtil.getArriveMessage('可以拼接文本'))}.width('100%')}.height('100%')}
}

效果图:

五、跨包使用需要注意点:

  • 要使用HSP中的接口,需要在使用方的oh-package.json5中配置对它的依赖

  • 跨包使用的接口都需要添加export。对外暴露的接口,需要在入口文件index.ets中声明,同一个类的多个方法,可以写在一起,用,隔开

  • 新增的共享包需要跨包调用,需要在Edit Configurations中添加新增的共享包

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

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

相关文章

Python从入门到网络爬虫(函数详解)

前言 函数是变成语言中最常见的语法,函数的本质就是功能的封装。使用函数可以大大提高编程效率与程序的可读性。函数是能够实现特定功能的计算机代码而已,他是一种特定的代码组结构。 函数的作用 1.提升代码的重复利用率,避免重复开发相同代…

js——json对象相互转化——js基础积累

js——json对象相互转化——js基础积累 需求场景解决步骤1:定义一个变量接收此字段,方便处理解决步骤2: { 外面的双引号要去掉解决步骤3:使用正则去除参数中的\\解决步骤4:如果此参数必须以{开头,以}结尾解…

一文快速了解超声功率放大器基础知识

超声功率放大器是一种电子设备,用于放大超声信号的能量。它在多个领域中发挥重要作用,包括医疗、工业、科学研究等。超声功率放大器通过将输入信号的能量放大到所需的级别,以便更好地驱动其他设备或实现特定的应用。下面就给大家介绍一下超声…

C++ 多态向上转型详解

文章目录 1 . 前言2 . 多态3 . 向上转型4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 此篇博文详解C的多态向上转型平台 : Qt 2 . 多态 【Q】什么是多态? 【A】解释如下 : 通俗来说,就是多种形态,具体…

2024,这将是量子计算的真正挑战

2023年,一项项量子计算纪录被打破。 谷歌量子AI团队证明了将多个量子比特分组合成为一个逻辑量子比特的纠错方法可以提供更低的容错率。以往的纠错研究随着比特数的增加,错误率会提高,都是“越纠越错”,而这次谷歌首次实现了“越纠…

【springboot+mybatis实现CURD模版项目-Jesus】

springbootmybatis实现CURD模版项目-Jesus STEP 1 项目创建 1.1 新建Spring Initializr项目   1.2 选择需要的依赖 springboot有2.7.2直接选272STEP 2 配置更改 2.1更改maven配置   2.2 检查项目配置jdk、sdk、jre版本一致   2.3 检查pom文件,Maven-Reload pr…

grep笔记240103

常用选项:: -i:忽略大小写进行匹配。 -v:反向匹配,只打印不匹配的行。 -n:显示匹配行的行号。 -r:递归查找子目录中的文件。 -l:只打印匹配的文件名。 -c:只打印匹配的行…

11-2 RHEL8配置YUM软件仓库及安装拼音输入法

配置本地YUM源 一、虚拟机关机>>虚拟机设置>>CD/DVD,关联ISO镜像文件,勾选“启动时连接”,点确定 二、开启虚拟机, 使用root用户登录。用df -h 命令可以看到光驱已经正常连接了。如果看不到/dev/sr0,需…

探索 Vue 实例方法的魅力:提升 Vue 开发技能(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

铁塔基站数字化管理监测解决方案

截至2023年10月,我国5G基站总数达321.5万个,占全国通信基站总数的28.1%。然而,随着5G基站数量的快速增长,基站的能耗问题也逐渐日益凸显,基站的用电给运营商带来了巨大的电费开支压力,降低5G基站的能耗成为…

CCF录用率怎么看?如何挑选合适的会议

写在前面 写此文是因为有同学问我如何确定自己能投稿的会议。首先,不建议直接用他人汇总好的数据(截稿时间和录用率),如果遇到更新不及时的很有可能耽误自己的工作。 平常,我都会自己收集预计投稿时间的会议信息&…

6张思维导图,js基础(基本概念,操作符,语句,Date,函数,数组,字符串)

一,js基本概念 二 ,js操作符 三,js基本语句 四,Date 常基本用方法汇总 五,数组基本及常用方法汇总 六,字符串基本及常用方法汇总 满满的都是干货。 附送250套精选项目源码 源码截图 源码获取:…

Ansible、Saltstack、Puppet自动化运维工具介绍

本文主要是分享介绍三款主流批量操控工具Ansible、Saltstack、Puppet主要对比区别,以及Ansible和saltstack的基础安装和使用示例,如果觉得本文对你有帮助,欢迎点赞、收藏、评论! There are many things that can not be broken&am…

【Java干货教程】Stream流详解

一、Stream流的简介 1.1、Stream流的概述 Stream是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式。 Stream流是从支持数据处理操作的…

npm发布js工具包

一、创建项目 1、在github上创建一个项目,然后拉取至本地,进入项目目录2、执行 npm init 生成json文件3、创建 src/index.ts 入口文件和 src/isObject.ts 工具方法 src/index.ts export { default as isObject } from ./isObject src/isObject.ts /…

[C#]yolov8-onnx在winform部署手势识别模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

专题一:递推与递归

递归 例题 递归实现指数型枚举 从 1∼n这 n个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。 对于没有选任何数的方案&#xff0c…

抖店申请流程是什么?

我是电商珠珠 想要入驻抖店的人很多,但是知道流程的新手却没有几个。 从开店资料到入驻流程,我来具体的跟大家讲一讲。 第一个,新手开店资质 1、营业执照 营业执照是入驻门槛之一,营业执照类型分为两类,一类为企业…

鸿蒙4.0开发实战(ArkTS)-闹钟制作

闹钟功能要求 展示指针表盘或数字时间。添加、修改和删除闹钟。展示闹钟列表,并可打开和关闭单个闹钟。闹钟到设定的时间后弹出提醒。将闹钟的定时数据保存到轻量级数据库。 闹钟主界面 闹钟界面包括当前时间、闹钟列表、添加闹钟子组件,具体包括以下…

共享企业文件数据信息:实用方法与技巧分享

在当下快节奏的企业办公生活中,如何有效且高效的进行企业文件数据信息共享,保持企业竞争力,是许多企业团队面临的问题。 诚然,社交媒体工具的出现可以缓解企业信息共享协作的痛点。然而,多平台工具的交叉使用又使企业…