当前位置: 首页 > news >正文

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 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处&#xff1a;0 < j < nums[i] &#xff1b;i j < n 返回到…...

J. Med. Chem 2022|TocoDecoy+: 针对机器学习打分函数训练和测试的无隐藏偏差的数据集构建新方法

原文标题&#xff1a;TocoDecoy: A New Approach to Design Unbiased Datasets for Training and Benchmarking Machine-Learning Scoring Functions 论文链接&#xff1a;https://pubs.acs.org/doi/10.1021/acs.jmedchem.2c00460 论文代码&#xff1a;GitHub - 5AGE-zhang/T…...

.net core 上传文件大小限制

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

Windows安装单节点Zookeeper

刚学习Dubbo&#xff0c;在Centos7中docker安装的zookeeper3.7.1。然后在启动provider时一直报错&#xff0c;用尽办法也没有解决。然后zookeeper相关的知识虽然以前学习过&#xff0c;但是已经忘记的差不多了。现在学习dubbo只能先降低版本使用了&#xff0c;之后再复习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、端口不能访问&#xff0c;可能是访问的协议问题或者防火墙拦截为问题导致。 1.1 centos环境下idea直接拉起部署&#xff0c;查看端口信息如下&#xff0c;命令为 [rootlocalhost ~]# lsof -i:8088 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java …...

C++-list实现相关细节和问题

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

hadoop学习:mapreduce的wordcount时候,继承mapper没有对应的mapreduce的包

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

windows10上搭建caffe以及踩到的坑

对动作捕捉的几篇论文感兴趣&#xff0c;想复现一下&#xff0c;需要caffe环境就折腾了下&#xff01;转模型需要python 2.7环境&#xff0c;我顺便也弄了&#xff01;&#xff01;&#xff01; 1. 环境 Windows10 RTX2080TI 11G Anaconda Python2.7 visual studio 2013 cuda…...

大数据Flink(七十):SQL 动态表 连续查询

文章目录 SQL 动态表 & 连续查询 一、​​​​​​​SQL 应用于流处理的思路...

「MySQL-04」Linux环境下使用C/C++连接并操纵MySQL

目录 一、准备mysql库&#xff1a;Connector/C 1. 查看是否有mysql相关的库和头文件 2. 安装devel(开发库) 3.到官网下载开发包&#xff0c;并上传到Linux 3.0 须知 3.1 到官网下载开发包 3.2 上传安装包至Linux 二、mysql库&#xff1a;Connector/C 的使用 1. 创建并初始化mys…...

【力扣】两数相除(c/c++)

目录 题目 注意&#xff1a; 示例 1: 示例 2: 提示&#xff1a; 题目解析 题目思路 代码思路 数据处理 注意 减法函数 第一次使用的函数 问题 第二次改良后的代码 处理i的值并且返回 总代码 力扣的代码 注意 题目 给你两个整数&#xff0c;被除数 dividend 和…...

《Kubernetes部署篇:Ubuntu20.04基于二进制安装安装kubeadm、kubelet和kubectl》

一、背景 由于客户网络处于专网环境下&#xff0c; 使用kubeadm工具安装K8S集群&#xff0c;由于无法连通互联网&#xff0c;所有无法使用apt工具安装kubeadm、kubelet、kubectl&#xff0c;当然你也可以使用apt-get工具在一台能够连通互联网环境的服务器上下载kubeadm、kubele…...

go学习part21 Redis

300_尚硅谷_Redis的基本介绍和原理示意_哔哩哔哩_bilibili Redis 命令 | 菜鸟教程 (runoob.com) 1.基本介绍 2.基本操作 Redis的基本使用: 说明:Redis安装好后&#xff0c;默认有16个数据库&#xff0c;初始默认使用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时间序列预测&#xff1b; 2.单变量时间序列数…...

Unity3D下如何采集camera场景数据并推送RTMP服务?

Unity3D使用场景 Unity3D是非常流行的游戏开发引擎&#xff0c;可以创建各种类型的3D和2D游戏或其他互动应用程序。常见使用场景如下&#xff1a; 游戏开发&#xff1a;Unity3D是一个广泛用于游戏开发的环境&#xff0c;适用于创建各种类型的游戏&#xff0c;包括动作游戏、角…...

黑客可利用 Windows 容器隔离框架绕过端点安全系统

新的研究结果表明&#xff0c;攻击者可以利用一种隐匿的恶意软件检测规避技术&#xff0c;并通过操纵 Windows 容器隔离框架来绕过端点安全的解决方案。 Deep Instinct安全研究员丹尼尔-阿维诺姆&#xff08;Daniel Avinoam&#xff09;在本月初举行的DEF CON安全大会上公布了…...

STM32注入通道

什么是注入通道? 注入通道是ADC的一种采样方式,主要用于在规则通道转换期间并行处理快速变化信号的采样。注入通道的转换可以在规则通道转换时强行插入,相当于一个“中断通道”。当有注入通道需要转换时,规则通道的转换会停止,优先执行注入通道的转换,当注入通道的转换执…...

WebVR — 网络虚拟现实

推荐&#xff1a;使用 NSDT编辑器 快速搭建3D应用场景 虚拟现实设备 随着Oculus Rift和许多其他生产设备即将上市&#xff0c;未来看起来很光明——我们已经有足够的技术来使VR体验“足够好”&#xff0c;可以玩游戏。有许多设备可供选择&#xff1a;像Oculus Rift或HTC Vive这…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...