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

2023-11-10

前言

所谓共享包,和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'

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

六、总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 具有相等宽度和高度 TD 的响应式表格

    如何创建每个单元格 TD 具有相同宽度和高度的响应式 HTML 表格 因此 当我调整浏览器窗口的大小或调整表格容器的大小时 表格将调整大小 但每个单元格将具有相同的高度和宽度 基金会不关心这个 当我用固定宽度和高度 以像素为单位 初始化 T
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta
  • Python请求401错误但url在浏览器中打开

    我正在尝试从这个位置提取 json https www nseindia com api option chain indices symbol BANKNIFTY https www nseindia com api option cha
  • python pandas如何在多个条件下过滤字符串

    我有以下数据框 import pandas as pd data 5Star FiveStar five star fiv estar data pd DataFrame data columns columnName 当我尝试用一 种条件
  • 处理延迟对象数组

    自从使用 Deferred我已经遇到过这种情况几次 我有一个值列表 每个值都以某种方式生成一个延迟对象 并且我想在所有延迟对象都解析后执行回调 一个更具体的例子是这样的 var urls foo com bar com baz com qu
  • 使用反射 API 填充 Proto 中的地图字段

    我正在尝试编写一个模块 该模块将获取 Message Builder 和从字段名称到值的映射 并将用值填充构建器 一切正常 直到我遇到地图字段 使用 Proto3 我收到一条特定消息 我知道我可以执行该消息的字段 builder b put
  • 如何将域从 Godaddy 移动到 AWS Route 53

    由于 Godaddy 宕机了几个小时 我和我的客户都非常沮丧 希望将所有内容都更改为 AWS 到目前为止一切都已完成 只有域 blablabla com 丢失 我在尝试从 godaddy 迁移到 Route 53 时遇到了困难 我是否必须从
  • Firebase/Firestore 事务是否会创建内部队列?

    我想知道交易是否 https firebase google com docs firestore manage data transactions https firebase google com docs firestore mana
  • 如何从 stack.navigation 外部的组件使用 navigation.navigate

    我有一个使用 React Native 的应用程序 我正在使用 React navigation 5 2 9 我构建了一个 Stack Navigator 其中有我的屏幕 但我希望页脚组件位于外部 以便它在所有屏幕中呈现 问题是 我无法从页
  • Chrome 中的 addEventListener

    我正在关注 Lynda com 上有关新 DOM 事件模型的教程 这是我正在使用的代码 function addEventHandler oNode sEvt fFunc bCapture if typeof window event un
  • 在私有 guice 模块中公开 Map

    我在 guice 中有一个 PrivateModule 我想从该模块公开一个 Map public class TestInjectionModule extends PrivateModule expose Map class annoa
  • 将 pandas 数据框中的多列更改为日期时间

    我有一个 13 列和 55 000 行的数据框 我正在尝试将其中 5 行转换为日期时间 现在它们返回类型 对象 我需要转换这些数据以进行机器学习 我知道如果我这样做 data birth date pd to datetime data b
  • 如何在 CruiseControl.net 中配置 svn 任务来检测 subversion 外部更改

    我在 subversion 中有一个 net 项目 它持续集成 Cruisecontrol net 我使用Svn源代码控制CCNET任务 net 项目库目录 其中包含配置为 subversion 外部的一组可重用组件 ProjectA li
  • javascript:获取带有单位的CSS prop值[重复]

    这个问题在这里已经有答案了 我的代码是这样的 image 1 position absolute top 3vw 我的尝试 http jsfiddle net z8k6t3fb 1 http jsfiddle net z8k6t3fb 1
  • 非键属性查询

    看起来 dynamodb 的query方法必须包含分区键作为过滤器的一部分 如果不知道分区键如何进行查询 例如 您有一个具有属性的用户表userid设置为分区键 现在我们想通过电话号码查找用户 是否可以在没有分区键的情况下执行查询 使用sc
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla
  • Android Nougat 无法显示某些矢量文件 (Resources$NotFoundException)

    我一直在开发一个包含许多矢量图形的应用程序 最近我开始在 Nougat 上测试它 发现它立即崩溃了 logcat 在加载矢量时显示 Resources NotFoundException 这让人想起带有矢量图形的 Android 早期版本中
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f
  • 调试客户端时使用 Chrome/Firefox

    我正在使用带有 getUserMedia 的相机 但出现了一些需要修复的错误 问题是 Visual Studio 只允许我使用 IE 调试 JavaScript 我的意思是命中断点 而 IE 不支持 getUserMedia 如果您想在 I
  • 如何限制mySQL中的搜索和替换字符串

    我用它来搜索和替换 mySQL 中的字符串 UPDATE products SET prodname REPLACE prodname S S 这些产品包含诸如 TYLENOL TABS 100 S 之类的字符串 我想将其转换为 TYLEN

随机推荐

  • Java微信APP支付-支付结果通知

    上一章讲了微信APP支付统一下单接口的开发 这一章我们讲支付结果通知接口的开发 这一接口是微信异步调用我们的接口 告之我们支付已经成功了 然后我们补录门店 电商订单 更新APP订单支付信息等业务逻辑 官方的API地址 https pay w
  • linux内核中socket读取和接收的缓冲区大小

    linux内核中socket读取和接收的缓冲区大小 1 socket内核缓冲区大小可用getsockopt获取 2 socket内核缓冲区大小可用setsockopt设置 缓冲区的大小为设置的值的2倍 具体设置代码入下 3 socket缓冲
  • 整数奇偶排序

    整数奇偶排序 问题描述 蒜术师给了你一个 10 个整数的序列 要求对其重新排序 排序要求 奇数在前 偶数在后 奇数按从大到小排序 偶数按从小到大排序 输入格式 输入一行 包含 10 10 个整数 彼此以一个空格分开 每个整数的范围是大于等于
  • Linux入坑教程

    服务器安装所需环境 Linux 一 安装基础环境 1 1 JDK 1 2 Mysql 1 3 FastDFS 1 4 Redis 1 5 GIT 1 6 Node 二 Basic commands 基础命令 2 1 查询命令 2 1 1 查
  • 僵尸进程~

    僵尸进程 1 僵尸进程概述 什么是僵尸进程 在Linux系统中 任何一个子进程在调用exit 函数结束运行后 内核会释放该进程的所有资源 包括占用的内存和打开的文件等 同时 也会留下一个叫做僵尸进程 Zombie 的数据结构 Zombie中
  • HIDL详解-Android10.0 HwBinder通信原理(二)

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • sentinel搭建与使用

    下载 https github com alibaba Sentinel releases 启动 脚本 java jar Dserver port 9013 Dsentinel dashboard auth username sentine
  • ERROR in ./src/main.jsModule build failed (from ./node_modules/babel-loader/lib/index.js):Error: e

    ERROR in src main js Module build failed from node modules babel loader lib index js Error error 0308010C digital envelo
  • mysql数据库连接

    一 自带的客户端命令行 直接输入密码即可连接 二 使用口令连接 1 切换目录 输入cd C web mysql 8 0 11 winx64 bin 2 登录 输入mysql u root p 3 输入密码 root 数据库密码 连接成功
  • 【Docker】ubuntu20.04 X86机器搭建NVIDIA ARM64 TX2的Docker镜像

    文章目录 1 设置ubuntu为清华源 1 1 备份源文件 1 2 替换清华源 1 3 更新清华源 2 Ubuntu Docker 安装 3 安装qemu 4 安装Nvidia TX2 Docker镜像 5 如何使用TX2容器 6 参考资料
  • ubuntu下载使用mtcnn和facenet并运行demo

    首先搭建好环境 ubuntu18 04 python3 6 5 tensorflow1 8 0 opencv3 4 3 pip install tqdm为了显示进度条 主要在这两个网站上学习 github上有很多教程和样例 以一般选择星星最
  • Windows使用ssh登入远程服务器(包含mac版)

    windows 首先Windows是没有ssh这个命令的 所以我们先要使Windows可以使用ssh命令 下载openssh for Winodws http linux linuxidc com index php folder MjAx
  • SpringBoot工程使用logback-spring.xml

    在SpringBoot工程中 推荐使用logback spring xml来替换logback xml 原因是SpringBoot加载logback xml是在application yml之前 所以在yml里面的信息不会被logback
  • Python疫情数据可视化分析+数据预测(pandas+pyecharts+statsmodels+matplotlib+sql)

    1 MySQL数据库获取数据 此处的原始数据表是全国各省的实时数据集 现在只获取江苏省份的数据 engine create engine mysq conn 具体内容以自己上就可以为准 select data select from tab
  • C++---类成员变量定义为引用

    摘要 类成员变量是可以定义为引用类型的 但是我们需要注意一下用法 note1 在类中定义引用变量 必须要在初始化列表中初始化该成员变量 const 类型数据成员也必须在初始化列表中进行初始化 include
  • synchronized (成员变量) 和 synchronized (静态成员变量)

    synchronized 成员变量 和 synchronized 静态成员变量 在同步方面有不同的效果 在 Java 中 每个对象都有一个 内置锁 或 对象锁 也称为 monitor 对象 它可以用来同步代码块或方法 使用 synchron
  • 彻底理解数字图像处理中的卷积-以Sobel算子为例

    链接 原文出处 作者 FreeBlues 概述 卷积在信号处理领域有极其广泛的应用 也有严格的物理和数学定义 本文只讨论卷积在数字图像处理中的应用 在数字图像处理中 有一种基本的处理方法 线性滤波 待处理的平面数字图像可被看做一个大矩阵 图
  • 理想的程序员

    http blog jobbole com 84747 我算是靠坑蒙拐骗进了程序员的门 然后一路狂奔 26岁之前几乎没有任何写代码的经验 研究生毕业却意外选择了一家不可能提供培训的初创公司 在每日担忧公司倒闭 害怕被炒鱿鱼以及同事冷落白眼的
  • 偶写的第一个CUDA程序——向量加法

    这个CUDA工程包括了三个文件 一个是makefile 一个是vector add cu 用于联系主机端与设备端 最后是vector add kernel cu 这个就是设备端要执行的真正的CUDA程序 首先看看makefile Add s
  • HarmonyOS开发:探索动态共享包的依赖与使用

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