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'
如果无法运行,报如下错误,请返回第四小节中的方法调用小节,查看完整的解决方式。
六、总结
还是那句话,如果说,仅用于应用内部代码、资源的共享,建议使用动态共享包,如果想作为应用模块的依赖项被引用,就可以选择静态共享包。
相关文章:

HarmonyOS开发:探索动态共享包的依赖与使用
前言 所谓共享包,和Android中的Library本质是一样的,目的是为了实现代码和资源的共享,在HarmonyOS中,给开发者提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(H…...
【力扣】45.跳跃游戏 II <贪心>
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处:0 < j < nums[i] ;i j < n 返回到…...

J. Med. Chem 2022|TocoDecoy+: 针对机器学习打分函数训练和测试的无隐藏偏差的数据集构建新方法
原文标题:TocoDecoy: A New Approach to Design Unbiased Datasets for Training and Benchmarking Machine-Learning Scoring Functions 论文链接:https://pubs.acs.org/doi/10.1021/acs.jmedchem.2c00460 论文代码:GitHub - 5AGE-zhang/T…...

.net core 上传文件大小限制
微软官网文档中给的解释是.net core 默认上传文件大小限制是30M,所以即便你项目里没有限制,这里也有个默认限制。 官网链接地址 总结了一下解决办法: 1.首先项目里添加一个web.config自定义配置文件 在配置文件中加上这段配置 <!--//…...

Windows安装单节点Zookeeper
刚学习Dubbo,在Centos7中docker安装的zookeeper3.7.1。然后在启动provider时一直报错,用尽办法也没有解决。然后zookeeper相关的知识虽然以前学习过,但是已经忘记的差不多了。现在学习dubbo只能先降低版本使用了,之后再复习zookee…...
C++ gendrate Gauss noise
手动生成 Marsaglia和Bray在1964年提出,C版本如下: mu是均值,sigma是方差,X服从N(0,1)分布 高斯噪声为加性噪声,在原图的基础上加上噪声即为加噪后的图象。 double generateGaussianNoise(double mu, double sigma) {static double V1, V2, S;static int phase 0;double X;d…...
centos环境下idea开发问题集锦
1、端口不能访问,可能是访问的协议问题或者防火墙拦截为问题导致。 1.1 centos环境下idea直接拉起部署,查看端口信息如下,命令为 [rootlocalhost ~]# lsof -i:8088 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java …...

C++-list实现相关细节和问题
前言:C中的最后一个容器就是list,list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指…...

hadoop学习:mapreduce的wordcount时候,继承mapper没有对应的mapreduce的包
踩坑描述:在学习 hadoop 的时候使用hadoop 下的 mapreduce,却发现没有 mapreduce。 第一反应就是去看看 maven 的路径对不对 settings——》搜索框搜索 maven 检查一下 Maven 路径对不对 OK 这里是对的 那么是不是依赖下载失败导致 mapreduce 没下下…...

windows10上搭建caffe以及踩到的坑
对动作捕捉的几篇论文感兴趣,想复现一下,需要caffe环境就折腾了下!转模型需要python 2.7环境,我顺便也弄了!!! 1. 环境 Windows10 RTX2080TI 11G Anaconda Python2.7 visual studio 2013 cuda…...

大数据Flink(七十):SQL 动态表 连续查询
文章目录 SQL 动态表 & 连续查询 一、SQL 应用于流处理的思路...

「MySQL-04」Linux环境下使用C/C++连接并操纵MySQL
目录 一、准备mysql库:Connector/C 1. 查看是否有mysql相关的库和头文件 2. 安装devel(开发库) 3.到官网下载开发包,并上传到Linux 3.0 须知 3.1 到官网下载开发包 3.2 上传安装包至Linux 二、mysql库:Connector/C 的使用 1. 创建并初始化mys…...
【力扣】两数相除(c/c++)
目录 题目 注意: 示例 1: 示例 2: 提示: 题目解析 题目思路 代码思路 数据处理 注意 减法函数 第一次使用的函数 问题 第二次改良后的代码 处理i的值并且返回 总代码 力扣的代码 注意 题目 给你两个整数,被除数 dividend 和…...

《Kubernetes部署篇:Ubuntu20.04基于二进制安装安装kubeadm、kubelet和kubectl》
一、背景 由于客户网络处于专网环境下, 使用kubeadm工具安装K8S集群,由于无法连通互联网,所有无法使用apt工具安装kubeadm、kubelet、kubectl,当然你也可以使用apt-get工具在一台能够连通互联网环境的服务器上下载kubeadm、kubele…...

go学习part21 Redis
300_尚硅谷_Redis的基本介绍和原理示意_哔哩哔哩_bilibili Redis 命令 | 菜鸟教程 (runoob.com) 1.基本介绍 2.基本操作 Redis的基本使用: 说明:Redis安装好后,默认有16个数据库,初始默认使用0号库,编号是0...15 1.添加key-val [set] 2.查看当前redi…...

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比
时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测; 2.单变量时间序列数…...

Unity3D下如何采集camera场景数据并推送RTMP服务?
Unity3D使用场景 Unity3D是非常流行的游戏开发引擎,可以创建各种类型的3D和2D游戏或其他互动应用程序。常见使用场景如下: 游戏开发:Unity3D是一个广泛用于游戏开发的环境,适用于创建各种类型的游戏,包括动作游戏、角…...

黑客可利用 Windows 容器隔离框架绕过端点安全系统
新的研究结果表明,攻击者可以利用一种隐匿的恶意软件检测规避技术,并通过操纵 Windows 容器隔离框架来绕过端点安全的解决方案。 Deep Instinct安全研究员丹尼尔-阿维诺姆(Daniel Avinoam)在本月初举行的DEF CON安全大会上公布了…...
STM32注入通道
什么是注入通道? 注入通道是ADC的一种采样方式,主要用于在规则通道转换期间并行处理快速变化信号的采样。注入通道的转换可以在规则通道转换时强行插入,相当于一个“中断通道”。当有注入通道需要转换时,规则通道的转换会停止,优先执行注入通道的转换,当注入通道的转换执…...

WebVR — 网络虚拟现实
推荐:使用 NSDT编辑器 快速搭建3D应用场景 虚拟现实设备 随着Oculus Rift和许多其他生产设备即将上市,未来看起来很光明——我们已经有足够的技术来使VR体验“足够好”,可以玩游戏。有许多设备可供选择:像Oculus Rift或HTC Vive这…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...