多模块应用、发布使用第三方库(持续更新中)
目录:
1、多模块概述(HAP、HSP、HAR)
HAR与HSP两种共享包的主要区别体现在:
2、三类模块:
3、创建项目:项目名:meituan
(1)创建Ability类型的Module,编译后为HAP文件
① 创建编译后为HAP,entry类型的模块 waimai(外卖)
② 创建编译后为HAP,features类型的模块 qixing(qixing)
③ 创建编译后为HAP,features类型的模块 jiudian(jiiudian)扩展功能模块
(2)创建Library类型的Module
② 创建Static Library:静态共享库mylib02。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。
HAP
HSP
HAR
4-1 模块内跳转:
① 在同一个HAP中的多个Page间跳转:
② 在同一个HAP中的多个UIAbility间跳转:
4-2 跨HAP模块跳转
1、从一个HAP跳转到另一个HAP
(1)为HAP模块添加所需要的模块依赖
(2)从外卖模块跨HAP跳转到骑行模块
2、使用HSP
① HSP模块中可以创建公共页面,并导出,从而供多个HAP来使用:
② HSP模块中可以创建公共组件,并导出,从而供多个HAP来使用:
③ HSP模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用:
3、使用HAR
① HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转:
② HAR模块中可以创建公共组件,并导出,从而供多个HAP来使用:
③ HAR模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用
1、多模块概述(HAP、HSP、HAR)
模块分为两大类:Ability(分为Entry/Feature两大类) 和 Library (分为Shared/Static两大类)
严格来讲是分为四类。
不同类型模块编译打包后的类型不同:
① Ability(分为Entry/Feature两大类)-----》编译后后缀名为 .hap
② Library (分为Shared/Static两大类):
Shared ----> 编译后后缀名为 .hsp
Static ----> 编译后后缀名为 .har
注意:编译后没有src/main目录;
.ets --> .js ---> .abc
上架后是.app文件
-
Ability类型的Module: 用于实现应用的功能和特性。每一个Ability类型的Module编译后,会生成一个以.hap为后缀的文件,我们称其为HAP(Harmony Ability Package)包。HAP包可以独立安装和运行,是应用安装的基本单位,一个应用中可以包含一个或多个HAP包,具体包含如下两种类型。
- entry类型的Module:应用的主模块,包含应用的入口界面、入口图标和主功能特性,编译后生成entry类型的HAP。每一个应用分发到同一类型的设备上的应用程序包,只能包含唯一一个entry类型的HAP。
- feature类型的Module:应用的动态特性模块,编译后生成feature类型的HAP。一个应用中可以包含一个或多个feature类型的HAP,也可以不包含。
-
Library类型的Module: 用于实现代码和资源的共享。同一个Library类型的Module可以被其他的Module多次引用,合理地使用该类型的Module,能够降低开发和维护成本。Library类型的Module分为Static和Shared两种类型,编译后会生成共享包。
说明:
实际上,Shared Library编译后除了会生成一个.hsp文件,还会生成一个.har文件。这个.har文件中包含了HSP对外导出的接口,应用中的其他模块需要通过.har文件来引用HSP的功能。为了表述方便,我们通常认为Shared Library编译后生成HSP。
HAR与HSP两种共享包的主要区别体现在:
共享包类型 编译和运行方式 发布和引用方式 HAR HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝。
注意:编译HAR时,建议开启混淆能力,保护代码资产。
HAR除了支持应用内引用,还可以独立打包发布,供其他应用引用。 HSP HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。 HSP一般随应用进行打包,当前支持应用内和集成态HSP。应用内HSP只支持应用内引用,集成态HSP支持发布到ohpm私仓和跨应用引用。 - Static Library:静态共享库。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。
- Shared Library:动态共享库。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。
面试题:静态库与共享库的区别?
静态库:写只写一份,其他Ability类型的module使用时,将其复制一份过去。其他使用的模块都会拷贝一份,会将项目的体积变大。
共享库:只保存一份,谁用,调用就行。可以节省应用的体积。
2、三类模块:
开发者可以根据实际场景所需的能力,选择相应类型的包进行开发。在后续的章节中还会针对如何使用HAP、HAR、HSP分别展开详细介绍。
规格 | HAP (Harmony Ability Package) | HAR (Harmony Archive) | HSP (Harmony Shared Package |
---|---|---|---|
功能使用及适合场合 | 分为entry和feature;应用的功能模块,可以独立安装和运行 | 静态共享包,编译态复用。 - 多包(HAP/HSP)引用相同的HAR时,会造成多包间代码和资源的重复拷贝,从而导致应用包膨大 | 动态共享包,运行时复用。 - 当多包(HAP/HSP)同时引用同一个共享包时,可以避免HAR造成的多包间代码和资源的重复拷贝,从而减小应用包大小 |
支持在配置文件中声明UIAbility组件与ExtensionAbility组件 | √(entry和feature都有界面) | × har供其他模块使用 | × |
支持在配置文件中声明pages页面 | √ | × har的module.json5中没有pages属性 | √ |
支持包含资源文件与.so文件(如NDK,用c++编写) | √ | √ | √ |
支持依赖其他HAR文件 | √ | √ | √ |
支持依赖其他HSP文件 | √ | √ | √ |
支持在设备上独立安装运行 | √ | × 支持应用内共享 或 发布后供其他应用使用 | × 当前仅支持应用内共享 |
注意:HAR 可以在当前项目内使用,也可以单独到处去供其他项目使用,可以发布出去,做成公共的第三方模块,供其他应用使用。而HSP仅支持当前应用使用。
例如:某跳动的某音可以使用头条的HAR
说明
- HAR虽然不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转。
- 由于HSP仅支持应用内共享,如果HAR依赖了HSP,则该HAR文件仅支持应用内共享,不支持发布到二方仓或三方仓供其他应用使用,否则会导致编译失败。
- HAR和HSP均不支持循环依赖,也不支持依赖传递。
3、创建项目:项目名:meituan
(1)创建Ability类型的Module,编译后为HAP文件
① 创建编译后为HAP,entry类型的模块 waimai(外卖)
构建模块
修改外卖页面首页:
② 创建编译后为HAP,features类型的模块 qixing(qixing)
如果不导出,其他模块无法调用它!
全局构建编译后:
修改骑行页面首页:
运行外卖waimai首页:
运行骑行qixing首页
③ 创建编译后为HAP,features类型的模块 jiudian(jiiudian)扩展功能模块
打包,构建
修改酒店模块首页
总结:
以上三个模块都打包为 HAP ,都有独立的页面可以运行!
(2)创建Library类型的Module
① 创建Shared Library:动态共享库mylib01。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。
build构建整个APP
启动mylib01发现不能独立运行,只有HAP才能独立运行
创建一个(Static Library)静态共享库mylib02
② 创建Static Library:静态共享库mylib02。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。
可以供应用本身,也可以发布出去,作为第三方库,供其他所有的应用使用。
build全局构建编译
为了看起来方便,可以修改视图为Ohos视图模型
HAP
HAP(Harmony Ability Package)是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包;
只有HAP可以独立使用
主要分为两种类型:entry和feature:
① entry:应用的主模块,作为应用的入口,提供了应用的基础功能;
② feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装;
注意:应用程序包可以只包含一个基础的entry包,也可以包含一个基础的entry包和多个功能性的feature包
不支持导出HAP中的接口和ArkUI组件,供其他HAR/HSP模块使用!!!
在HAP中创建函数、组件、类只能在当前这个函数中使用,不能导出供HAR/HSP使用。
HAR/HSP可以导出供HAP使用。
HSP
HSP(Harmony Shared Package)是动态共享包,可以包含代码、C++库、资源和配置文件,通过HSP可以实现代码和资源的共享。HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应用同进程,具有相同的包名和生命周期。
主要使用场景:
① 多HAP或者HSP共用的代码、资源可以使用HSP,提高代码的可重用性和可维护性;
② 按需加载,HSP包在运行时再按需加载;
③ 元服务分包及预加载;
HAR
HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。
使用场景:
① 导出公共ArkUI组件或ts类/方法供当前应用的其它HAP和HSP使用;
② 作为二方库,发布到OHPM私仓,供公司内部其他应用使用;
③ 作为三方库,发布到OHPM中心仓,供其他应用使用;
4-1 模块内跳转:
① 在同一个HAP中的多个Page间跳转:
多个页面公用同一个窗口
//模块内多个页面间跳转
router.pushUrl({url: 'pages/Details'
})
② 在同一个HAP中的多个UIAbility间跳转:
每个页面都有独立的窗口
//模块内多个UIAbility间跳转
let want: Want = {deviceId: '', //可选参数,传空表示本设备bundleName: 'cn.tedu.myapp', //必需参数,应用唯一标识moduleName: 'entry', //可选参数,模块名称abilityName: 'ChatAbility', //必须参数,UIAbility名称
}
let ctx = getContext(this) as common UIAbilityContext
ctx.startAbility(want)
4-2 跨HAP模块跳转
1、从一个HAP跳转到另一个HAP
每个HAP上架到应用商店都是可以根据客户端设备情况独立安装的,如果希望跳转到其它模块,必须在当前模块的编译配置中声明“多Hap同时部署(Deploy Multi Hap)”
(1)为HAP模块添加所需要的模块依赖
为外卖waimai模块添加所需依赖:
同理:对骑行qixing模块、酒店jiudian添加依赖
跨模块的多个页面也都有各自的运行时窗口
(2)从外卖模块跨HAP跳转到骑行模块
Button('1、跳转到另一个HAP模块(骑行)中的页面').onClick(_=>{// 不可能使用router跳转到另一个HAP中的界面,因为module.json5中的pages是独立的// 只能使用startAbility(),启动另一个HAP的窗口加载它的页面let ctx = getContext() as common.UIAbilityContextctx.startAbility({bundleName:'com.tedu.meituan',moduleName:'qixing', //想要跳转的模块名abilityName:'QixingAbility',// parameters: 启动哪一个页面,如果不写,默认页面})})
此时点击可以跳转到,骑行模块的默认加载页面。但是有两个窗口。
2、使用HSP
① HSP模块中可以创建公共页面,并导出,从而供多个HAP来使用:
HSP没有窗口,HAP有窗口,则可以使用URL
在HSP模块mylib01中创建AppCopyright.ets页面
分配路由地址(此处可以不写,但最好写上):
Button('2、跳转到另一个HSP模块(mylib01)中的页面').onClick(_=>{// 不能使用startAbility()跳转,因为HSP没有UIAbility// 只能是使用router跳转router.pushUrl({url:'@bundle:com.tedu.meituan/mylib01/ets/pages/AppCopyright'})})
成功跳转到HSP指定的页面,而且只有一个窗口
② HSP模块中可以创建公共组件,并导出,从而供多个HAP来使用:
1、HSP模块mylib01中创建components文件夹,创建TitleBar.ets页面,写组件
2、在HSP模块mylib01最外层导出组件
3、在HAP模块waimai中的最外层Index.ets中添加依赖
4、在HAP模块waimai中index.ets页面中使用来自HSP中的自定义组件
5、显示成功!
③ HSP模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用:
1、在HSP模块mylib01中创建components文件夹,创建TitleBar.ets页面,写公共方法
2、在HSP模块mylib01最外层导出
3、在HAP模块waimai中的最外层Index.ets中添加依赖
4、在HAP模块waimai中index.ets页面中调用来自HSP中的
3、使用HAR
① HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转:
HAR里面没有pages,没有地址
为了看起来清晰修改目录结构
1、在HAR模块mylib02中声明页面
2、在HAR模块mylib02的最外层的Index.ets中导出上述页面(此处可导出也可不导出)
3、在HSP模块waimai的oh-package5中添加依赖
4、在HSP模块waimai中添加跳转按钮:
手动添加路由地址:
Button('4、调用另一个HAR模块(mylib02)中的也买你').onClick(_=>{router.pushNamedRoute({name:'login',params:{}})})
② HAR模块中可以创建公共组件,并导出,从而供多个HAP来使用:
与使用HSP的方式完全一样!
1、在HAR模块mylib02中创建组件
2、在HAR模块mylib02最外层中导出组件
3、在HSP模块中添加依赖
4、在HSP模块中调用HSP的组件
③ HAR模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用
与使用HSP的方式完全一样!
创建方法
在HAP中最外层中导出
在HSP中添加HAR依赖
在HSP中的页面调用HAP的方法
注意:如果HAR导入的多个公共模块中有重名成员,可以用as取别名
第三方库
HAR----mylib02
目前,HSP包只能在应用内被其它模块引用; HAR共享包可以在当前项目中使用,或者打包后发布为二方库/三方库,供其它项目或其他开发者使用。
上架只需要上架HAP
相关文章:

多模块应用、发布使用第三方库(持续更新中)
目录: 1、多模块概述(HAP、HSP、HAR) HAR与HSP两种共享包的主要区别体现在: 2、三类模块: 3、创建项目:项目名:meituan (1)创建Ability类型的Module,编译后为HAP文件…...

An error happened while trying to locate the file on the Hub and we cannot f
An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on. 关于上述comfy ui使用control net预处理器的报错问…...

UE5安装Fab插件
今天才知道原来Fab也有类似Quixel Bridge的插件,于是立马就安装上了,这里分享一下安装方法 在Epic客户端 - 库 - Fab Library 搜索 Fab 即可安装Fab插件 然后重启引擎,在插件面板勾选即可 然后在窗口这就有了 引擎左下角也会多出一个Fab图标…...
Linux C语言操作sqlite3数据库
一、环境配置 1、下载源码:sqlite-autoconf-3470200.tar.gz 2、解压,cd到源码主目录 3、配置参数 ./configure --prefix/usr/local/ 如果是交叉编译环境 ./configure CC/opt/rk3288/gcc-linaro/bin/arm-linux-gnueabihf-gcc --hostarm-linux --pre…...
【人工智能】因果推断与数据分析:用Python探索数据间的因果关系
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 因果推断是数据科学领域的一个重要方向,旨在发现变量间的因果关系,而不仅仅是相关性。本篇文章将从因果推断的理论基础出发,介绍因果关系的定义与建模方法,涵盖因果图(Causal Graph)、d-分离、反事实估计等…...
freeswitch(30秒自动挂断)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景说明: A和B接通通话时候,时间开始计算到达30秒后自动挂断使用方法 进入/usr/local/freeswitch/etc...
大模型呼入机器人有哪些功能特点?(转)
大模型呼入机器人有哪些功能特点?(转) 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 大模型呼入机器人,作为现代通信技术与人工智能深度融合的产物,正逐渐成为企业提升服务…...

网络工程师常用软件之配置对比软件
「24-配置比对软件-汉化WinMerge」 链接:https://pan.quark.cn/s/cef7541d62d1 ################################################################################ 我们经常在项目或者运维中对设备的config进行变更,那么我们如何快速的知道变更了什么…...

Linux之远程登录
一、使用ssh命令登录 winR打开cmd输入命令 # root是命令,192.168.101.200是地址 ssh root192.168.101.200是否要保存密码,就是yes以后可以免密登录,这里就yes了 输入密码,就登录成功了 操作完成之后,输入命令退出 e…...

#渗透测试#漏洞挖掘#红蓝攻防#js分析(上)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...

数智读书笔记系列006 协同进化:人类与机器融合的未来
书名:协同进化:人类与机器融合的未来 作者:[美]爱德华阿什福德李 译者:李杨 出版时间:2022-06-01 ISBN:9787521741476 中信出版集团制作发行 爱德华・阿什福德・李(Edward Ashford Lee)是一位在计算机科学与工程领域颇具影响力的学者&am…...

操作系统(7)处理机调度
前言 操作系统中的处理机调度是一个核心概念,它涉及如何从就绪队列中选择进程并将处理机分配给它以运行,从而实现进程的并发执行。 一、调度的层次 高级调度(作业调度): 调度对象:作业(包含程序…...
folly之侵入式链表
侵入式链表 侵入式链表(Intrusive Linked List)是一种数据结构,它的节点不是通过包含链表节点的对象来实现的(像非侵入式链表那样),而是通过在节点对象中直接包含指向其他节点的指针来实现的。这意味着链表节点对象本身需要被修改以包含指向链表其他部分的指针。 直接上…...
GPT-5 训练遇阻:预期目标难达成与交付延期的深度剖析
# GPT-5 训练遇阻:预期目标难达成与交付延期的深度剖析 近期,GPT-5 的训练进展引发了广泛关注与诸多讨论,令人遗憾的是,其训练并未达到预期目标,且难以在规定时间内交付。这一状况不仅让期待它的人们大感意外…...
C缺陷与陷阱 — 3 深入理解表达式
目录 1 表达式的运算次序 1.1 自增或自减操作符 1.2 函数参数 1.3 函数指针 1.4 函数调用 1.5 嵌套赋值语句 2 函数调用不作为函数参数 3 赋值语句的谨慎使用 1 表达式的运算次序 除了少数操作符(函数调用操作符 ( )、&&、| |、? : 和 ,ÿ…...

Linux常用指令-----中
Linux常用指令----上 Linux常用指令----下 Linux系列 文章目录 Linux系列前言一、man指令(重要)二、cp指令(重要)三、echo指令四、cat指令五、mv指令六、which指令七、alias指令总结 前言 接下来我们介绍的指令是承接上篇&#…...
k8s 部署方式kustomization和helm的区别
Kustomize 和 Helm 是 Kubernetes 中两种流行的配置管理工具,它们都用于管理 Kubernetes 资源,但它们的设计理念、功能和适用场景有所不同。以下是两者的详细对比: 1. 基本概念 Kustomize 功能:原生于 Kubernetes 的工具&#x…...

Alogrithm:骑士走棋盘
1. 说明 骑士旅游(Knights tour)在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,它要如何走完所有的位置? 2. 解法 骑士旅…...

Oracle 与 达梦 数据库 对比
当尝试安装了达梦数据库后,发现达梦真的和Oracle数据库太像了,甚至很多语法都相同。 比如:Oracle登录数据库采用sqlplus,达梦采用disql。 比如查看数据视图:达梦和Oracle都有 v$instance、v$database、dba_users等&a…...

[COLM 2024] V-STaR: Training Verifiers for Self-Taught Reasoners
本文是对 STaR 的改进方法,COLM 是 Conference On Language Models,大模型领域新出的会议,在国际上很知名,不过目前还没有被列入 ccf list(新会议一般不会列入);作者来自高校、微软研究院和 Goo…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...