目录:
(1)创建Ability类型的Module,编译后为HAP文件
[① 创建编译后为HAP,entry类型的模块 waimai(外卖)](#① 创建编译后为HAP,entry类型的模块 waimai(外卖))
[② 创建编译后为HAP,features类型的模块 qixing(qixing)](#② 创建编译后为HAP,features类型的模块 qixing(qixing))
[③ 创建编译后为HAP,features类型的模块 jiudian(jiiudian)扩展功能模块](#③ 创建编译后为HAP,features类型的模块 jiudian(jiiudian)扩展功能模块)
[① 创建Shared Library:动态共享库mylib01。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。](#① 创建Shared Library:动态共享库mylib01。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。)
[② 创建Static Library:静态共享库mylib02。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。](#② 创建Static Library:静态共享库mylib02。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。)
[4-1 模块内跳转:](#4-1 模块内跳转:)
[① 在同一个HAP中的多个Page间跳转:](#① 在同一个HAP中的多个Page间跳转:)
[② 在同一个HAP中的多个UIAbility间跳转:](#② 在同一个HAP中的多个UIAbility间跳转:)
[4-2 跨HAP模块跳转](#4-2 跨HAP模块跳转)
[① HSP模块中可以创建公共页面,并导出,从而供多个HAP来使用:](#① HSP模块中可以创建公共页面,并导出,从而供多个HAP来使用:)
[② HSP模块中可以创建公共组件,并导出,从而供多个HAP来使用:](#② HSP模块中可以创建公共组件,并导出,从而供多个HAP来使用:)
[③ HSP模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用:](#③ HSP模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用:)
[① HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转:](#① HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转:)
[② HAR模块中可以创建公共组件,并导出,从而供多个HAP来使用:](#② HAR模块中可以创建公共组件,并导出,从而供多个HAP来使用:)
[③ 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间跳转:
多个页面公用同一个窗口
TypeScript
//模块内多个页面间跳转
router.pushUrl({
url: 'pages/Details'
})
② 在同一个HAP中的多个UIAbility间跳转:
每个页面都有独立的窗口
TypeScript
//模块内多个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跳转到骑行模块
TypeScript
Button('1、跳转到另一个HAP模块(骑行)中的页面')
.onClick(_=>{
// 不可能使用router跳转到另一个HAP中的界面,因为module.json5中的pages是独立的
// 只能使用startAbility(),启动另一个HAP的窗口加载它的页面
let ctx = getContext() as common.UIAbilityContext
ctx.startAbility({
bundleName:'com.tedu.meituan',
moduleName:'qixing', //想要跳转的模块名
abilityName:'QixingAbility',
// parameters: 启动哪一个页面,如果不写,默认页面
})
})
此时点击可以跳转到,骑行模块的默认加载页面。但是有两个窗口。
2、使用HSP
① HSP模块中可以创建公共页面,并导出,从而供多个HAP来使用:
HSP没有窗口,HAP有窗口,则可以使用URL
在HSP模块mylib01中创建AppCopyright.ets页面
分配路由地址(此处可以不写,但最好写上):
TypeScript
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中添加跳转按钮:
手动添加路由地址:
TypeScript
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