HarmonyOS 梳理模块关系
刚开始开发的时候总是理不清鸿蒙中的模块类型和关系,今天就来梳理下鸿蒙中的模块类型
Module类型
Module按照使用场景可以分为两种类型:
●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两种类型,编译后会生成共享包。
○Static Library:静态共享库。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。
○Shared Library:动态共享库。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。
说明:
实际上,Shared Library编译后除了会生成一个.hsp文件,还会生成一个.har文件。这个.har文件中包含了HSP对外导出的接口,应用中的其他模块需要通过.har文件来引用HSP的功能。为了表述方便,我们通常认为Shared Library编译后生成HSP
HAR与HSP两种共享包的主要区别体现在:
HAR和HSP在APP包中的形态示意图(此图一目了然)
相同点:HAR与HSP都是为了实现代码和资源的共享,都可以包含代码、C++库、资源和[配置文件
不同点:HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝;而HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。
HAP
HAP(Harmony Ability Package)是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包,其主要分为两种类型:entry和feature。
●entry:应用的主模块,作为应用的入口,提供了应用的基础功能。
●feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装。
应用程序包可以只包含一个基础的entry包,也可以包含一个基础的entry包和多个功能性的feature包。
使用场景
●单HAP场景:如果只包含UIAbility组件,无需使用ExtensionAbility组件,优先采用单HAP(即一个entry包)来实现应用开发。虽然一个HAP中可以包含一个或多个UIAbility组件,为了避免不必要的资源加载,推荐采用“一个UIAbility+多个页面”的方式。
●多HAP场景:如果应用的功能比较复杂,需要使用ExtensionAbility组件,可以采用多HAP(即一个entry包+多个feature包)来实现应用开发,每个HAP中包含一个UIAbility组件或者一个ExtensionAbility组件。在这种场景下,可能会存在多个HAP引用相同的库文件,导致重复打包的问题。
约束限制
●不支持导出接口和ArkUI组件,给其他模块使用。
●多HAP场景下,App Pack包中同一设备类型的所有HAP中必须有且只有一个Entry类型的HAP,Feature类型的HAP可以有一个或者多个,也可以没有。
●多HAP场景下,同一应用中的所有HAP的配置文件中的bundleName、versionCode、versionName、minCompatibleVersionCode、debug、minAPIVersion、targetAPIVersion、apiReleaseType相同,同一设备类型的所有HAP对应的moduleName标签必须唯一。HAP打包生成App Pack包时,会对上述参数配置进行校验。
●多HAP场景下,同一应用的所有HAP、HSP的签名证书要保持一致。上架应用市场是以App Pack形式上架,应用市场分发时会将所有HAP从App Pack中拆分出来,同时对其中的所有HAP进行重签名,这样保证了所有HAP签名证书的一致性。在调试阶段,开发者通过命令行或DevEco Studio将HAP安装到设备上时,要保证所有HAP签名证书一致,否则会出现安装失败的问题。
创建
下面简要介绍如何通过DevEco Studio新建一个HAP模块。
1.创建工程,详见构建第一个ArkTS应用。
2.在工程目录上单击右键,选择New > Module。
3.在弹出的对话框中选择Empty Ability模板,单击Next。
4.在Module配置界面,配置Module name,选择Module Type和Device Type,然后单击Next。
5.在Ability配置界面,配置Ability name,然后单击Finish完成创建。
HAR
HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。
使用场景
●作为二方库,发布到OHPM私仓,供公司内部其他应用使用。
●作为三方库,发布到OHPM中心仓,供其他应用使用。
约束限制
●HAR不支持在设备上单独安装/运行,只能作为应用模块的依赖项被引用。
●HAR不支持在配置文件中声明UIAbility组件与ExtensionAbility组件。
●HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转。
●HAR不支持引用AppScope目录中的资源。在编译构建时,AppScope中的内容不会打包到HAR中,因此会导致HAR资源引用失败。
●HAR可以依赖其他HAR,但不支持循环依赖,也不支持依赖传递。
创建HAR模块
1.鼠标移到工程目录顶部,单击右键,选择New > Module,在工程中添加模块。
2.在Choose Your Ability Template界面中,选择Static Library,并单击Next。
3.在Configure New Module界面中,设置新添加的模块信息,设置完成后,单击Finish完成创建。
○Module name:新增模块的名称。
○Device type:支持的设备类型。
○Enable native:是否创建一个用于调用C++代码的模块。
HSP
HSP(Harmony Shared Package)是动态共享包,可以包含代码、C++库、资源和配置文件,通过HSP可以实现应用内的代码和资源的共享。HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应用同进程,具有相同的包名和生命周期。
说明
仅支持应用内HSP,不支持应用间HSP。
使用场景
●多个HAP/HSP共用的代码和资源放在同一个HSP中,可以提高代码、资源的可重用性和可维护性,同时编译打包时也只保留一份HSP代码和资源,能够有效控制应用包大小。
●HSP在运行时按需加载,有助于提升应用性能。
约束限制
●HSP不支持在设备上单独安装/运行,需要与依赖该HSP的HAP一起安装/运行。HSP的版本号必须与HAP版本号一致。
●HSP不支持在配置文件中声明UIAbility组件与ExtensionAbility组件。
●HSP可以依赖其他HAR或HSP,但不支持循环依赖,也不支持依赖传递。
创建HSP模块
1.通过如下两种方法,在工程中添加新的Module。
○方法1:鼠标移到工程目录顶部,单击鼠标右键,选择New > Module,开始创建新的Module。
○方法2:选中工程目录中任意文件,然后在菜单栏选择File > New > Module,开始创建新的Module。
2.模板类型选择Shared Library,点击Next。
3.在Configure New Module界面中,设置新添加的模块信息,设置完成后,单击Finish完成创建。
○Module name:新增模块的名称,如设置为sharedlibrary。
○Device type:支持的设备类型。
○Enable native:是否创建一个用于调用C++代码的模块。
通过DevEco Studio创建一个HSP模块,详见创建HSP模块,我们以创建一个名为library的HSP模块为例。基本的工程目录结构如下:
library
├── src
│ └── main
│ ├── ets
│ │ └── pages
│ │ └── index.ets
│ ├── resources
│ └── module.json5
├── oh-package.json5
└── index.ets
模块依赖
做安卓开发的同学们一般处理模块与模块之间的关系,我们一般会叫“模块依赖”。鸿蒙的官网文档其实不叫这个,官方的叫法“引用共享包”。其实无所谓啦 ,大家习惯习惯就好
以下就是配置模块的共享几种情况:
●从仓库进行安装、
然后通过如下两种方式设置三方包依赖信息:
○方式一:在Terminal窗口中,切换到需要引入三方包的模块,如entry模块,执行如下命令安装三方包,DevEco Studio会自动在该模块的oh-package.json5中自动添加三方包依赖。
cd path/to/your/project/entryohpm install @ohos/lottie
○方式二:在需要引入三方包的模块的oh-package.json5中设置三方包依赖,配置示例如下:
"dependencies": { "@ohos/lottie": "^2.0.0"}
依赖设置完成后,需要执行ohpm install命令安装依赖包,依赖包会安装到该模块的oh_modules目录下。
ohpm install
从本地文件夹 ( 引用本地模块源码)
引用本地模块源码,如entry模块需要依赖foo模块的源码,有如下两种方式:
○方式一:在Terminal窗口中,切换到需要引入本地模块源码的模块,即entry模块,执行如下命令进行安装,并会在该模块下的oh-package.json5中自动添加依赖。
cd path/to/your/project/entryohpm install path/to/foo
方式二:在需要引入本地模块源码的模块的oh-package.json5中设置源码依赖项,即entry模块的oh-package.json5中,添加如下配置:
"dependencies": { "folder": "file:path/to/foo" // 此处也可以是以当前oh-package.json5所在目录为起点的相对路径}
依赖设置完成后,需要执行ohpm install命令安装依赖包,模块foo的源码会安装在entry模块的oh_modules目录下。
ohpm install
本地压缩包中进行安装.(引用本地HAR/HSP包)
引用本地HAR/HSP包,有如下两种方式:
○方式一:在Terminal窗口中,切换到需要引入本地HAR/HSP包的模块,如entry模块,执行如下命令进行安装,并会在oh-package.json5中自动添加依赖。以HAR/HSP包在工程根目录下为例,配置示例如下(实际配置时请以HAR/HSP包实际目录为准):
引用HAR:
cd path/to/your/project/entryohpm install /path/to/package.har
引用HSP(*.tgz包通过HSP模块在release模式下编译生成):
cd path/to/your/project/entryohpm install path/to/package.tgz
方式二:在需要引入三方包的模块的oh-package.json5中设置本地HAR/HSP包。以HAR/HSP包在工程根目录下为例,配置示例如下(实际配置时请以HAR/HSP包实际目录为准):
●引用HAR:
"dependencies": { "package": "file:path/to/package.har" // 此处也可以是以当前oh-package.json5所在目录为起点的相对路径}
●引用HSP:
"dependencies": { "package": "file:path/to/package.tgz" // 此处也可以是以当前oh-package.json5所在目录为起点的相对路径}
依赖设置完成后,需要执行ohpm install命令安装依赖包,依赖包会安装在该模块的oh_modules目录下。
ohpm install
总结
有很多小伙伴不知道该从哪里开始学习鸿蒙开发技术?也不知道鸿蒙开发的知识点重点掌握的又有哪些?自学时频繁踩坑,导致浪费大量时间。结果还是一知半解。所以有一份实用的鸿蒙(HarmonyOS NEXT)全栈开发资料用来跟着学习是非常有必要的。
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了
最新鸿蒙全栈开发学习线路
鸿蒙HarmonyOS开发教学视频