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

目录:

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

① 创建Shared Library:动态共享库mylib01。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。

② 创建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除了支持应用内引用,还可以独立打包发布,供其他应用引用。
    HSPHSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。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.UIAbilityContext
          ctx.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫基础之HTTP基本原理

URL和URI 我们先了解一下 URI和 URL。URI的全称为 Uniform Resource ldentifer,即统一资源标志符;URL的全称为 Universal Resource Locator,即统一资源定位符。它们是什么意思呢?举例来说,https:/github.com/favicon.ico 既是一个 URI,也是…

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置,包括节点间的通信、客户端访问、安全设置等关键步骤。我…

【一本通】PowerStrings

【一本通】PowerStrings C 代码C语言代码 💐The Begin💐点点关注,收藏不迷路💐 求每个字符串的最短循环子串,输出循环次数。 输入 输入数据为多组数据,读取到"."字符时结束。每组数据仅有一行&…

Unity 沿圆周创建Sphere

思路 取圆上任意一点连接圆心即为半径,以此半径为斜边作直角三角形。当已知圆心位置与半径长度时,即可得该点与圆心在直角三角形两直角边方向上的位置偏移,从而得出该点的位置。 实现 核心代码 offsetX radius * Mathf.Cos(angle * Mathf…

华为无线AC、AP模式与上线解析(Huawei Wireless AC, AP Mode and Online Analysis)

华为无线AC、AP模式与上线解析 为了实现fit 瘦AP的集中式管理,我们需要统一把局域网内的所有AP上线到AC,由AC做集中式管理部署。这里我们需要理解CAPWAP协议,该协议分为两种报文:1、管理报文 2、数据报文。管理报文实际在抓包过程…

软考高级架构 - 10.5 软件架构演化评估方法

10.4 软件架构演化原则总结 本节提出了18条架构演化的核心原则,并为每条原则设计了简单而有效的度量方法,用于从系统整体层面提供实用信息,帮助评估和指导架构演化。 演化成本控制:成本小于重新开发成本,经济高效。进…

鸿蒙NEXT开发案例:颜文字搜索器

【引言】 本文将介绍一个名为“颜文字搜索器”的开发案例,该应用是基于鸿蒙NEXT平台构建的,旨在帮助用户快速查找和使用各种风格的表情符号。通过本案例的学习,读者可以了解如何在鸿蒙平台上进行数据处理、UI设计以及交互逻辑的实现。 【环…

【报错记录】Ubuntu22.04解决开机卡在 /dev/sda5 : clean , *files , *blocks

一个愿意伫立在巨人肩膀上的农民...... 一、错误现象 本人的电脑安装Windows10和Ubuntu22.04双系统,一次训练中电脑死机无法开机,重启之后便出现如下错误,在网上寻找过很多方法均无效,在root下禁用了samba服务,也无济…

关于睡懒觉

我们经常听到一个词:睡懒觉。 我认为,睡懒觉这个词,是错误的。 人,是需要睡眠的,睡不够,就不会醒。睡够了,自然会醒,也不想继续睡。不信你试试,睡够了,你…

数据地图怎么做?推荐这款数据可视化地图生成器

在数字化与信息化高速发展的今天,企业迎来了前所未有的发展机遇,规模迅速扩张,市场版图不断延伸。然而,伴随着这种快速的发展,一个不容忽视的问题逐渐浮出水面——如何精准高效地掌握分布在各地的分公司、业务点乃至整…

访问者模式的理解和实践

在软件开发过程中,设计模式为我们提供了解决常见问题的最佳实践。访问者模式(Visitor Pattern)是行为设计模式之一,它将数据操作与数据结构分离,使得在不修改数据结构的前提下,能够定义作用于这些元素的新的…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢?1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承?2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

Burp与小程序梦中情缘

前言 在日常渗透工作中,有时需要对微信小程序进行抓包渗透,通过抓包,我们可以捕获小程序与服务器之间的通信数据,分析这些数据可以帮助我们发现潜在的安全漏洞,本文通过讲述三个方法在PC端来对小程序抓包渗透 文章目…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理 flyfish 输入 输出 [‘第一张图片是一幅中国山水画,描绘了一座山峰和周围的树木。第二张图片是一张现代照片,展示了一座山峰和周围的自然景观,包括水体和植被。’] fro…

R语言学习笔记-1

1. 基础操作和函数 清空环境:rm(list ls()) 用于清空当前的R环境。 打印输出:print("Hello, world") 用于输出文本到控制台。 查看已安装包和加载包: search():查看当前加载的包。install.packages("package_na…

基本分页存储管理

一、实验目的 目的:熟悉并掌握基本分页存储管理的思想及其实现方法,熟悉并掌握基本分页存储管理的分配和回收方式。 任务:模拟实现基本分页存储管理方式下内存空间的分配和回收。 二、实验内容 1、实验内容 内存空间的初始化——可以由用户输…

如何将CSDN的文章保存为PDF?

目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车(Enter)如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…

ur机器人ros-urdf

新建工作空间 mkdir -p ~/catkin_ws/src cd catkin_ws_ur5/src git clone -b melodic-devel https://github.com/ros-industrial/universal_robot.git cd .. rosdep update rosdep install --rosdistro melodic --ignore-src --from-paths src catkin_make source ~/catkin_ws…

A6688 JSP+MYSQL+LW+二手物品网上交易系统

二手物品网上交易系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 摘 要 随着社会经济快速发展,互联网推动了电子商务业的迅速崛起。越来越多的人们喜欢在线进行商品的交易,尤其是对于二手物品的处理&#xff0…

深度学习day4|用pytorch实现猴痘病识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 🍺要求: 训练过程中保存效果最好的模型参数。 加载最佳模型参数识别本地的一张图片。 调整网络结构使测试集accuracy到达88%&#x…