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

目录:

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

相关推荐
草莓熊Lotso8 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
恋猫de小郭8 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
一只大侠的侠12 小时前
Flutter开源鸿蒙跨平台训练营 Day 10特惠推荐数据的获取与渲染
flutter·开源·harmonyos
寻星探路13 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅14 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606115 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了15 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅15 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅16 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
七夜zippoe16 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann