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

news2024/12/18 5:17:36

目录:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓 文件管理相关功能记录

文件管理细分为图片、视频、音乐、文件四类 目录 权限 静态声明权限 动态检查和声明权限方法 如何开始上述动态申请的流程 提示 图片 获取图片文件的对象列表 展示 删除 视频 获取视频文件的对象列表 获取视频file列表 按日期装载视频文件列表 展示 播放 删除…

CHIMA网络安全攻防大赛经验分享

比赛模式 第一轮:20分钟基础知识赛(50道题) 安全运维,法律法规,linux操作系统等 第二轮:50分钟CTF夺旗(5道题) 题目涵盖 密码学 运用多种工具,如ASCII对照&#xff0c…

QT 国际化(翻译)

QT国际化(Internationalization,简称I18N)是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用,并且可以根据用户的语言和地区提供本地化的使用体验。…

[Java] 使用 VSCode 来开发 Java

目录 前言Java 环境怎么看自己是否已经配置完成?安装 JDK安装 Maven 环境修改 Maven 依赖源 完善 VS Code配置插件配置 Maven配置 Maven Settings配置 Maven 可执行文件地址 前言 由于使用 VSCode 编码已经成为习惯,并且它确实相对其他的 IDE 较为轻量化…

如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案

引言 在数据分析和市场研究领域,Twitter(现在的X)数据一直是重要的信息来源。但是,自从Twitter更改API定价策略后,获取数据的成本大幅提升。本文将介绍一个经济实惠的替代方案。 为什么需要Twitter数据? …

vue3+ant design vue实现日期选择器不展示清除按钮

1、代码&#xff1a;只需设置:allowClear"false"即可 <a-date-pickerv-model:value"value1":disabledDate"disabledDate"change"queryRate":allowClear"false" />const disabledDate (current: Dayjs) > {// 获取…

S2CRNet 图像测评笔记 图像融合

空间分离曲线渲染网络用于高效高分辨率图像协调 开源地址&#xff1a; https://github.com/stefanLeong/S2CRNet 效果图&#xff1a; 左边是输入&#xff0c;最右边是效果&#xff1a;效果不是很理想&#xff0c;色差问题还在 本地代码&#xff1a; S2CRNet-demos-main

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer&#xff08;传输层如何进行分用&#xff09;分用&#xff08;Demultiplexing&#xff09;的定义&#xff1a;TCP/UDP段格式&#xff1a; UDPUDP的特点&#xff1a;UDP Format端口号Trivial File Transfer Protocol…

【Excel】单元格分列

目录 分列&#xff08;新手友好&#xff09; 1. 选中需要分列的单元格后&#xff0c;选择 【数据】选项卡下的【分列】功能。 2. 按照分列向导提示选择适合的分列方式。 3. 分好就是这个样子 智能分列&#xff08;进阶&#xff09; 高级分列 Tips&#xff1a; 新手推荐基…

易语言鼠标轨迹算法(游戏防检测算法)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

.net winform 实现CSS3.0 泼墨画效果

效果图 代码 private unsafe void BlendImages1(Bitmap img1, Bitmap img2) {// 确定两个图像的重叠区域Rectangle rect new Rectangle(0, 0,Math.Min(img1.Width, img2.Width),Math.Min(img1.Height, img2.Height));// 创建输出图像&#xff0c;尺寸为重叠区域大小Bitmap b…

Https身份鉴权(小迪网络安全笔记~

附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;若有错误欢迎指正&#xff01; 5.2 Https&身份鉴权 引子&#xff1a;上一篇主要对Http数据包结构、内容做了介绍&#xff0c;本篇则聊聊Https、身份鉴权等技术。 …

7.OPEN SQL

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 ​编辑 1.OPEN-SQL 简单回顾 R3体系 OEPN-SQL 2.OPEN-SQL 读取数据 2.1Select 语句 select 1条数据 多条数据与into AS别名 2.2INTO 结构体 内表 例子 2.3FROM 选择动态表…

PLC网关,plc远程通信 —— 跨越距离远程控制运维升级

在日新月异的工业4.0时代&#xff0c;智能化、网络化已成为制造业转型升级的关键词。其中&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为工业自动化控制的核心设备&#xff0c;其远程通信技术的突破&#xff0c;正引领着一场前所未有的工业变革。今天&#xff0…

Python-基于Pygame的小游戏(天空之战)(一)

前言:不久前接触了Python的游戏制作的相关第三方库&#xff0c;于是学习了pygame的相关内容&#xff0c;想制作一款基于pygame的小游戏。因为还不太熟悉游戏制作和pygame&#xff0c;部分内容我参考了《Python-从入门到精通》这本书。那么好&#xff0c;话不多说&#xff0c;我…

CV(4)--边缘提取和相机模型

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 边缘提取&#xff08;涉及语义分割&#xff09;&#xff1a; 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分&#xff0c;暗到亮为正 求边缘的幅度&#xff1a;sobel&#xff0c;Canny算子 图像分高频分量和低…

cocos creator 的 widget组件的使用及踩坑

以下的内容基于cocos creator 3.8版本&#xff0c;如有错误&#xff0c;恳请指出。 &#x1f449;官方文档的指引 应用&#xff1a;以上官方指引有非常清晰的使用方式&#xff0c;接下来说明一些注意事项&#xff1a; 1、与canvas搭配的使用&#xff0c;解决多分别率适配问题。…

九个任务调度框架

一、背景介绍 说到定时任务&#xff0c;相信大家都不陌生&#xff0c;在我们实际的工作中&#xff0c;用到定时任务的场景可以说非常的多&#xff0c;例如&#xff1a; 双 11 的 0 点&#xff0c;定时开启秒杀每月1号&#xff0c;财务系统自动拉取每个人的绩效工资&#xff0…

Qt6开发自签名证书的https代理服务器

目标&#xff1a;制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能&#xff0c;但是集成到自己的app内&#xff0c;这样无需修改系统代理设置&#xff0c;使用QWebengineview通过自建的代理服务器&#xff0c;即可实现https包的实时监测、注入等自定义功能…

【深度学习项目】目标检测之YOLO系列详解(一)

介绍 YOLO&#xff08;You Only Look Once&#xff09;是一种实时目标检测算法&#xff0c;由Joseph Redmon等人提出。与传统的基于滑动窗口和区域提案的目标检测方法不同&#xff0c;YOLO将目标检测问题框架化为一个单一的回归问题&#xff0c;直接从图像像素预测边界框和类别…