HarmonyOS开发:探索动态共享包的依赖与使用

前言

所谓共享包,和Android中的Library本质是一样的,目的是为了实现代码和资源的共享,在HarmonyOS中,给开发者提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包。

两者的区别是,HAR静态共享包中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝;而HSP动态共享包中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份,如下图所示:

之所以会出现HSP动态共享包,目的主要解决如下问题:

1、多个HAP引用相同的HAR,导致的APP包大小膨胀问题。

2、多个HAP引用相同的HAR,HAR中的一些状态变量无法共享的问题。

如果说,仅用于应用内部代码、资源的共享,建议使用动态共享包,如果想作为应用模块的依赖项被引用,就可以选择静态共享包,在之后得开发中,大家可以根据实际的业务需求进行选择性使用。

本章的内容大致如下:

1、如何创建一个共享包

2、动态共享包(library)手动依赖

3、动态共享包用命令方式依赖

4、动态共享包多种方式调用

5、动态共享包注意事项

6、总结

一、如何创建一个共享包

在当前工程项目名,右键,选择New,然后选择Module即可,这里我在Demo工程里进行创建,具体如何创建工程项目,这里就不赘述了,前边已经讲述过了,毕竟太简单了。

默认的有两种共享包模板,一种是动态共享包,一种是静态共享包,如下图。

设置共享包名字,点击Finish。

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

二、动态共享包(library)手动依赖

经过第一步的操作,我们已经在Demo工程中,创建了一个动态共享包,如下图所示,目前有主Module,entry和动态共享包sharelibrary。

entry如果想要调用sharelibrary中的代码或资源,那么必须让entry关联上sharelibrary,关联方式和Android中类似。

1、依赖方式一

在entry中的oh-package.json5文件中,在dependencies中引入共享包sharelibrary,记住格式:

【"folder": "file:../folder"】,后面的folder就是你自己创建的共享包,至于前边的folder,是用来生成的映射目录,名字可以和共享包名字一致,也可以不一致。

引入之后,进行同步项目,点击Sync Now即可,当然了你可以可以,将鼠标放置在报错处会出现提示,在提示框中点击Run 'ohpm install'。

执行以上功能之后,就会映射到主Module,entry的oh_modules目录下:

2、依赖方式二

除了依赖方式一之外,也可以采取如下的依赖方式,也就是【"@xx/xx": "file:../sharelibrary"】的方式,也是可以的,其原理和依赖方式一的格式一样,区别就是,会在oh_modules目录中创建一个@xx目录。

按照如上方式执行之后,会发现,已在oh_modules中,新建了一个”@ohos目录“,里面是映射的共享包。

三、动态共享包用命令方式依赖

上述,我们通过手动更改oh-package.json5文件完成了共享包的依赖,除了手动之外,我们也可以动过命令的方式进行实现,命令行中或在IDE Terminal窗口中,目录进入到主模块下,执行ohpm install ../folder命令即可,folder是你的共享包,如下图所示:

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

四、动态共享包多种方式调用

1、方法调用

上述创建的共享包sharelibrary中,有一个工具类Calc,里面有一个简单的求和方法add,那么在entry中如何调用sharelibrary中的add方法呢?

其实很是简单,和Android项目一样,引入library之后,你可以调用共享包中的资源或者代码了,比如我们实现调用add方法,如下:

需要注意得是导包,正常情况下,当你打出add方法,会有提示导包,直接确认导包即可,如果没有,可以手动进行导包,导包得路径和你映射的地址基本上是一一对应的,比如,你采用的是@xx/xx的方式,导包就如下:

上面的案例是一个很简单的调用,给文字设置点击事件,直接调用共享包sharelibrary中,工具类Calc中的add方法。

目前貌似一切都没有问题,毕竟方法一切调用正常,我们直接运行至模拟器中查看,当然了,你也可以直接运行至HarmonyOS手机上,结果发现报错了,如下所示:

报错的原因就是,我们未执行部署多个包,毕竟我们在主模块后又创建了一个共享包,解决如下:

选择运行模块,点击Edit Configurations:

选择Deploy Multi Hap标签页,勾选Deploy Multi Hap Packages,选择我们的共享包即可:

再次运行,就可以运行正常了:

我们点击文字之后,就可以再控制台查看到,调用add求和方法之后的值了:

2、类的调用

上面的案例是如何调用共享包中的方法,那么共享包如果有一个工具类,我们该如何调用呢?

定义要外露的工具类,这里我简单的创建了一个日志工具类,记住需要用export关键字进行对外暴露。

使用和上述的方法流程一致,由于设置的是静态的方法,直接调用即可:

3、组件的调用

组件的调用和类的调用是一致的,如下,我定义了一个简单的文本组件,记住使用export关键字,进行对外暴露。

@Component
export struct TextWidget {@State message: string = '我是一个测试的文本'build() {Text(this.message).fontSize(20).fontWeight(FontWeight.Bold)}
}

使用方式如下,就可以把TextWidget作为一个组件进行调用。

import { add, Log ,TextWidget} from "sharelibrary"@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {TextWidget()Text($r('app.string.app_name')).fontSize(20).fontWeight(FontWeight.Bold).onClick(() => {var number = add(100, 100)Log.log("求和", ""+number)})}.width('100%')}.height('100%')}
}

4、跳转共享包内的页面

目前共享包中已经有了一个页面Index,为了便于区别,我们把里面的展示内容改为:“Hello sharelibrary”

在entry模块中,我们就可以如下进行跳转,url格式为:'@bundle:包名/模块名/路径/页面所在的文件名(不加.ets后缀)',具体跳转如下:

 router.pushUrl({url: '@bundle:com.example.demo/sharelibrary/ets/pages/Index'}).then(() => {console.log("push page success");}).catch(err => {console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);})

具体效果如下:

5、如何使用共享包中的资源

既然作为一个共享包,要给到其他模块共用,除了代码上复用之外,剩下的就是资源了,查了很多资料和文档,怎么把resources暴露出去,这可难住了,可以很负责任的告诉大家,HarmonyOS目前还不支持,这一点和Android中Library还是有很大的区别,那怎么实现呢?

实现起来也是非常的简单,既然资源不能暴露,类和方法是可以暴露的啊,也就是大家可以把资源中的属性,通过工具类做一层中转即可。

1、定义资源

在共享包中我定义了一个很简单的字符串资源,当然了你也可以定义其他类型的资源,比如数字,图片,音视频等等。

2、定义工具类

工具类需要注意,结尾是ets类型,这是为了可以拿到Resource。

3、调用

导包后直接调用即可。

五、动态共享包注意事项

对外暴露的接口,需要在共享包入口文件index.ets中声明,否则,其他模块无法调用,都是固定的模式,比如上述的add方法,和自定义的组件等,切记!!!

同一个类中的,如果多个方法,可以复用,比如:

export { Log, add, minus } from './utils/test'

如果无法运行,报如下错误,请返回第四小节中的方法调用小节,查看完整的解决方式。

六、总结

还是那句话,如果说,仅用于应用内部代码、资源的共享,建议使用动态共享包,如果想作为应用模块的依赖项被引用,就可以选择静态共享包

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

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

相关文章

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号,显示成绩】 7、统计。【…

MySQL中日期、时间直接相减的坑

前言 在牛客网上写一道 SQL 题时,需要计算两个日期之间相隔的秒数,我在写的时候直接将两个日期进行相减,得出来的值却不是相差的秒数。 情景再现 我在 MySQL 中进行了测试,得出的结论是:如果日期类型直接相减&#…

“亚马逊云科技创业加速器”首期聚焦AI,促进入营企业业务发展

生成式AI技术飞速发展,颠覆着人们的生活,正在掀起新一轮的科技革命。在生成式AI的浪潮中,亚马逊云科技旨在为中国的优秀初创企业提供全方位支持,助其抢占先机。 在6月底举办的亚马逊云科技中国峰会上,亚马逊云科技联合…

com.squareup.okhttp3:okhttp 组件安全漏洞及健康度分析

组件简介 维护者square组织许可证类型Apache License 2.0首次发布2016 年 1 月 2 日最新发布时间2023 年 4 月 23 日GitHub Star44403GitHub Fork9197依赖包5,582依赖存储库77,217 com.squareup.okhttp3:okhttp 一个开源的 HTTP 客户端库,可以用于 Android 和 Jav…

CocosCreator3.8研究笔记(三)CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目,来演示CocosCreator 的项目结构。 等待创建完成后,会得到以下项目工程: 一、assets文件夹 assets文件夹:为资源目录,用来存储所有的本地资源,如各种图片,脚本…

【机器学习】人工智能概述(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【算法笔记】二维的哈希与迭代转换;Runtime Error 的解决思路

https://vjudge.net/problem/UVA-11019 如何对一个二维数组进行哈希 对于一个一维数组A(1*M),哈希的方式是: s e e d M − 1 ∗ A [ 0 ] s e e d M − 2 ∗ A [ 1 ] s e e d M − 3 ∗ A [ 2 ] . . . s e e d 0 ∗ A [ M − 1 ] seed^{M-1}*A[0] …

Python安装与Pycharm配置

Python与Pycharm安装 用了一年的Python最近被一个问题难倒了,pip安装一直不能用,报错说被另一个程序使用。被逼到只能重新安装python了,正好记录一下这个过程,写这篇笔记。(突然想到可能是配Arcgis的python接口&#…

微信小程序修改vant组件样式

1 背景 在使用vant组件开发微信小程序的时候,想更改vant组件内部样式,达到自己想要的目的(van-grid组件改成宫格背景色为透明,默认为白色),官网没有示例,通过以下几步修改成功。 2 步骤 2.1 …

【USRP】调制解调系列7:GMSK、MSK、基于labview的实现

MSK 在数字调制中,最小频移键控(Minimum-Shift Keying,缩写:MSK)是一种连续相位的频移键控方式,在1950年代末和1960年代产生。与偏移四相相移键控(OQPSK)类似,MSK同样将…

记录一下自己对linux分区挂载的理解

一直狠模糊,分两个区,一个挂载/, 一个挂载/home 两者是什么关系 实测 先看挂载的内容 然后umount /home后创建一个新文件 再挂载回去 发现旧分区又回来了,说明路径只是个抽象的概念,分区挂载,互相之间数据是不影响…

基于 Zookeeper 实现服务注册和服务发现

文章目录 前言声明前置知识服务注册和发现Zookeeper 工作原理实现过程注册中心服务注册服务发现 总结 前言 无论是采用SOA还是微服务架构,都需要使用服务注册和服务发现组件。我刚开始接触 Dubbo 时一直对服务注册/发现以及 Zookeeper 的作用感到困惑,现…

【Elsevier旗下】中科院1区TOP,影响因子9分+,23天录用!极速见刊!

极速见刊推荐 中科院 1区(TOP) 出版社:Elsevier 影响因子:IF(2022)9.0-10.0 期刊分区:JCR1区,中科院1区(TOP) 检索情况:SCIE 在检&#xff…

微服务之架构演变

随着互联网的发展,网站应用规模不断扩大,网站架构随之不断演变,演变历史大致分为单体应用架构-垂直应用架构-分布式架构-SOA架构-微服务架构-云原生架构 架构演变 单体应用架构 以前网站流量小,只需要一个应用就可以把所有功能…

模拟实现list

目录 list的实现结构节点的实现迭代器的实现第一个模板参数T第二个模板参数Ref第三个模板参数Ptr 实现list中的接口函数插入和删除赋值重载和拷贝构造析构函数 总结 list的实现结构 STL库中的list的结构是双向循环链表,所以我们这里也实现一个双向循环链表 我们这…

中介者模式

1、场景 假如没有总经理。下面三个部门:财务部、市场部、研发部。财务部要发工资,让大家核对公司需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部跟各个部门打交道。 虽然只有三个…

无涯教程-JavaScript - DVAR函数

描述 DVAR函数使用与指定条件相匹配的列表或数据库的列中的数字,根据样本估算总体的方差。 语法 DVAR (database, field, criteria)争论 Argument描述Required/Optionaldatabase 组成列表或数据库的单元格范围。 数据库是相关数据的列表,其中相关信息的行是记录,数据的列是…

大数据课程K17——Spark的协同过滤法

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的协同过滤概念; 一、协同过滤概念 1. 概念 协同过滤是一种借助众包智慧的途径。它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度。其内在思想是相似度的定义…

服务器放在香港好用吗?

​  相较于国内服务器,将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案,因此更无备案时限,购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…

【python】—— 函数详解

前言: 本期,我们将要讲解的是有关python中函数的相关知识!!! 目录 (一)函数是什么 (二)语法格式 (三)函数参数 (四)函…