多模块应用、发布使用第三方库(持续更新中)

目录:

1、多模块概述(HAP、HSP、HAR)

HAR与HSP两种共享包的主要区别体现在:

2、三类模块:

3、创建项目:项目名:meituan

(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)扩展功能模块)

(2)创建Library类型的Module

[① 创建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)。)

HAP

HSP

HAR

[4-1 模块内跳转:](#4-1 模块内跳转:)

[① 在同一个HAP中的多个Page间跳转:](#① 在同一个HAP中的多个Page间跳转:)

[② 在同一个HAP中的多个UIAbility间跳转:](#② 在同一个HAP中的多个UIAbility间跳转:)

[4-2 跨HAP模块跳转](#4-2 跨HAP模块跳转)

1、从一个HAP跳转到另一个HAP

(1)为HAP模块添加所需要的模块依赖

(2)从外卖模块跨HAP跳转到骑行模块

2、使用HSP

[① HSP模块中可以创建公共页面,并导出,从而供多个HAP来使用:](#① HSP模块中可以创建公共页面,并导出,从而供多个HAP来使用:)

[② HSP模块中可以创建公共组件,并导出,从而供多个HAP来使用:](#② HSP模块中可以创建公共组件,并导出,从而供多个HAP来使用:)

[③ HSP模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用:](#③ HSP模块中可以创建公共对象和方法,并导出,从而供多个HAP来使用:)

3、使用HAR

[① 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、三类模块:

开发者可以根据实际场景所需的能力,选择相应类型的包进行开发。在后续的章节中还会针对如何使用HAPHARHSP分别展开详细介绍。

规格 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

相关推荐
Kristen Stewart25 分钟前
Deveco Studio首次编译项目初始化失败
harmonyos
神明木佑33 分钟前
什么是全局对象和全局变量
前端·javascript·html
神一样的老师1 小时前
【鸿睿创智开发板试用】移植OpenCV 4到OpenHarmony 4.1
人工智能·opencv·计算机视觉·鸿蒙·openharmony
陌上花开缓缓归以1 小时前
linux panic 空指针使用举例
linux·运维·服务器
丶Darling.1 小时前
Linux高性能服务器编程中的TCP带外数据梳理总结
linux·服务器·tcp/ip
EQUINOX11 小时前
三、传输层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
网络·计算机网络
drebander1 小时前
手撕 HttpClient:自己实现简单的 HTTP 请求工具
java·网络
冰红茶兑滴水1 小时前
HTTP 协议
linux·网络·c++·网络协议·http
安迪范德1 小时前
netty 实现http
网络·网络协议·http
web安全工具库2 小时前
探索 Python 中的字典:序列解包与复杂数据结构
前端·数据库·python