鸿蒙 Stege模型 多模块应用

模块

一个鸿蒙应用可能包含一个或者多个功能模块,在 DevEcoStudio 工程中可以创建对应的一个或多个 Module。Module 又分为 “Ability” 和 “Library”两种类型,“Ability”类型的 Module 对应于编译后的 HAP(Harmony Ability Package);“Library” 类型的 Module 对应于 HAR (Harmony Archive),或者 HSP (Harmony Shared Package)

三类模块

HAP (Harmony Ability Package)HAR (Harmony Archive)HSP (Harmony Shared Package)
功能说明及适用场合分为 entryfeature;应用的功能模块,可以独立安装和运行静态共享包,编译态复用。- 多包(HAP/HSP)引用相同的 HAR 时,会造成多包间代码和资源的重复拷贝,从而导致应用包膨大动态共享包,运行时复用。- 当多包(HAP/HSP)同时引用同一个共享包时,可以避免 HAR 造成的多包间代码和资源的重复拷贝,从而减少小应用包大小
支持在配置文件中声明 UIAbility 组件与 ExtensionAbility 组件
支持在配置文件中声明 pages 页面
支持包含资源文件与.so 文件
支持依赖其他 HAR 文件
支持依赖其他 HSP 文件
支持在设备上独立安装运行

HAP

HAP(Harmony Ability Package)是应用安装和运行的基本单元。HAP 包是由代码、资源、第三方库、配置文件等打包生成的模块包;主要分为两种类型:entry 和 feature:

  1. entry:应用的主模块,作为应用的入口,提供了应用的基础功能;
  2. feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装;

应用程序包可以只包含一个基础的 entry 包,也可以包含一个基础的 entry 包和多个功能性的 feature 包

//module.json5
{"module": {"name": "video","type": "entry","mainElement": "VideoAbility"}
}
//module.json5
{"module": {"name": "mall","type": "feature","mainElement": "MallAbility"}
}

注意:不支持导出 HAP 中的接口和 ArkUI 组件,供其他 HAR/HSP 模块使用!!

HSP

HSP(Harmony Shared Package)是动态共享包,可以包含代码、C++库、资源和配置文件,通过 HSP 可以实现代码和资源的共享。HSP 不支持独立发布,而是跟随其宿主应用的 APP 包一起发布,与宿主应用同进程,具有相同的包名和生命周期。主要使用场景:

  1. 多 HAP 或者 HSP 共用的代码、资源可以使用 HSP,提高代码的可重用性和可维护性;
  2. 按需加载,HSP 包在运行时再按需加载;
  3. 元服务分包及预加载;
//module.json5
{"module": {"name": "mylib01","type": "shared","deviceTypes": ["phone", "tablet"],"deliveryWithInstall": true,"pages": "$profile:main_pages"}
}

HAR

HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。使用场景:

  1. 导出公共 ArkUI 组件或 ts 类/方法供当前应用的其它 HAP 和 HSP 使用;
  2. 作为二方库,发布到 OHPM 私仓,供公司内部其他应用使用;
  3. 作为三方库,发布到 OHPM 中心仓,供其他应用使用;
//module.json5
{"module": {"name": "mylib02","type": "har","deviceTypes": ["default", "tablet"]}
}

注意:HAR 模块默认不提供 pages,也没有 UIAbility

HAP 模块跳转

模块内跳转

在同一个 HAP 中的多个 Page 间跳转:多个页面共用同一个窗口

//模块内多个页面间跳转
router.pushUrl({url: "pages/Details",
});

在同一个 HAP 中的多个 UIAbility 间跳转:每个页面都有独立的窗口

//模块内多个UIAbility间跳转
const want: Want = {deviceId: "", //可选,传空表示本设备bundleName: "cn.baidu.myapp", //必需,应用唯一标识moduleName: "entry", //可选,模块名称abilityName: "ChatAbility", //必需,UIAbility名称
};
let ctx = getContext(this) as common UIAbilityContext
ctx.startAbility(want)
跨 HAP 模块跳转

每个 HAP 上架到应用商店都是可以根据客户端设备情况独立安装的,如果希望跳转到其它模块,必须在当前模块的编译配置中声明“多 Hap 同时部署(Deploy Multi Hap)”

//跨多个HAP模块跳转
let want: Want = {deviceId: "", //传空表示本设备bundleName: "cn.baidu.myapp", //应用唯一标识moduleName: "mall", // *******模块名称*********abilityName: "MallAbility", //UIAbility名称
};let ctx = getContext(this) as common.UIAbilityContext;
ctx.startAbility(want);

跨模块的多个页面也都有各自的运行时窗口

使用 HSP

导出公共页面

HSP 模块中可以创建公共页面,并导出,从而供多个 HAP 来使用

//mylib01/src/main/ets/pages/Login.ets
@Entry
@Component
export struct Login {build() {Row() {Column() {Text('Library Page')}.width('100%')}.height('100%')}
}
//entry/src/main/ets/pages/Index.ets
router.pushUrl({url: "@bundle:cn.baidu.myapp/mylib01/ets/pages/Login",
});

URL 格式为:
@bundle:包名/模块名/路径/页面所在的文件名(不加.ets 后缀)
且“路径”中没有 src/main (部署态不存在这两个目录)!

注意
必须在 HAP 模块的编译配置中声明“多 Hap 同时部署(Deploy Multi Hap)”,其中勾选 HSP 模块

说明:HSP 模块中是没有 UIAbility 的!只能运行在 HAP 提供的窗口中

导出公共组件

HSP 模块中可以创建公共组件,并导出,从而供多个 HAP 来使用

//mylib01/src/main/ets/components/TitleBar.ets
@Preview
@Component
export struct TitleBar {build() {Row() {Text('Title Bar')}.width('100%').height(45)}
}
//mylib01/Index.ets
export { TitleBar } from "./src/main/ets/components/TitleBar";
//entry/oh-package.json5
{"dependencies": {"mylib01": "file:../mylib01"}
}
//entry/src/main/ets/pages/Index.ets
import { TitleBar } from 'mylib01'@Entry
@Component
struct Index {build() {Column() {TitleBar()}}
}
导出公共对象和方法

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

//mylib01/src/main/ets/util/Calc.ets
export function add(a: number, b: number) {return a + b;
}export function sub(a: number, b: number) {return a - b;
}
//mylib01/Index.ets
export { add, sub } from "./src/main/ets/utils/Calc";
//entry/oh-package.json5
{"dependencies": {"mylib01": "file:../mylib01"}
}
//entry/src/main/ets/pages/Index.ets
import { add } from 'mylib01'build() {Column() {Button('相加').onClick(_ => {add(10, 20)})}
}

使用 HAR

导出 pages 页面

HAR 不支持在配置文件中声明 pages 页面,但是可以包含 pages 页面,并通过命名路由的方式进行跳转

//mylib02/src/main/ets/pages/MyPage.ets
@Entry({ routeName: 'myPage' })
@Component
export struct MyPage {build() {Row() {Text('My Page')}.width('100%').height('100%')}
}
//mylib02/Index.ets
//命名路由页面无需导出
//entry/oh-package.json5
{"dependencies": {"mylib02": "file:../mylib02"}
}
//entry/src/main/ets/pages/Index.ets
import('mylib02/src/main/ets/pages/MyPage')@Entry
@Component
struct Index {build() {Button('跳转到HAR中的页面').onClick(_ => {router.pushNamedRoute({name: 'myPage', //页面名称params: {}      //自定义的路由参数})})}
}
导出公共组件

HAR 模块中可以创建公共组件,并导出,从而供多个 HAP 来使用

//mylib02/src/main/ets/components/TitleBar.ets
@Preview
@Component
export struct TitleBar {build() {Row() {Text('Title Bar')}.width('100%').height(45)}
}
//mylib02/Index.ets
export { TitleBar } from "./src/main/ets/components/TitleBar";
//entry/oh-package.json5
{"dependencies": {"mylib02": "file:../mylib02"}
}
//entry/src/main/ets/pages/Index.ets
import { TitleBar } from 'mylib02'@Entry
@Component
struct Index {build() {Column() {TitleBar()}}
}
导出公共对象和方法

HAR 模块中可以创建公共对象和方法,并导出,从而供多个 HAP 来使用

//mylib02/src/main/ets/util/Calc.ets
export function add(a: number, b: number) {return a + b;
}export function sub(a: number, b: number) {return a - b;
}
//mylib02/Index.ets
export { add, sub } from "./src/main/ets/utils/Calc";
//entry/oh-package.json5
{"dependencies": {"mylib02": "file:../mylib02"}
}
//entry/src/main/ets/pages/Index.ets
import { add } from 'mylib02'build() {Column() {Button('相加').onClick(_ => {add(10, 20)})}
}

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

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

相关文章

领域LLM九讲——第4讲 构建可测评、可优化的端到端商业AI Agent 系统

领域LLM九讲——第4讲 构建可测评、可优化的端到端商业AI Agent 系统 以 OpenAI Cookbook 的《receipt_inspection》示例为基础,探讨如何设计一个可测试、可优化的端到端 AI Agent 系统。整体流程分为三个阶段: (1) 端到端 Agent 构建(基线测…

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…

Linux线程与进程关系及底层实现

在操作系统中,线程切换相比进程切换更轻量级的关键原因之一是 缓存(Cache)的有效性,尤其是对 CPU 缓存(如 L1/L2/L3)和 TLB(Translation Lookaside Buffer)的影响。以下从缓存角度详…

【论文阅读30】Bi-LSTM(2024)

用于精确实时滑坡检测的双向LSTM模型:以印度梅加拉亚邦毛永格里姆为例的研究 IEEE Internet of Things Journal(简称 IoT‑J)是一份 IEEE 自 2014 年起双月刊发表的国际顶级学术期刊,专注于物联网各领域的研究。 作者&#xff1a…

Java编程之原型模式

原型模式的定义 原型模式(Prototype Pattern)是一种创建型设计模式,通过复制已有对象来创建新对象,而非通过常规的手段的new关键字来实例化。适用于对象创建成本较高或需要动态配置的场景。 例如,在一个游戏开发中&am…

RAG质量评估

当完成了一个RAG系统的开发工作以后,还需要对该系统的性能进行评估。如何对RAG系统的性能进行评估呢?仔细分析RAG系统的产出成果,主要涉及以下几点: (1)检索器组件 检索的相关文档 context, (…

LLMs基础学习(八)强化学习专题(1)

LLMs基础学习(八)强化学习专题(1) 文章目录 LLMs基础学习(八)强化学习专题(1)学习资料资源强化学习是什么强化学习一句话精准定义 强化学习与其他学习类型的对比强化学习 vs 监督学习…

19-Oracle 23 ai Database Sharding-知识准备

小伙伴是不是经常遇见大规模集群和数量的时候,业务就提出要对数据进行sharding。 Oracle 和其他数据库(如 MySQL、PostgreSQL、MongoDB 等) 为什么要进行分片(sharding),分片的原因是什么,实现…

分类与逻辑回归 - 一个完整的guide

线性回归和逻辑回归其实比你想象的更相似 😃 它们都是所谓的参数模型。让我们先看看什么是参数模型,以及它们与非参数模型的区别。 线性回归 vs 逻辑回归 线性回归:用于回归问题的线性参数模型。逻辑回归:用于分类问题的线性参数…

英语写作中“每一个”each individual、every individual、every single的用法

一、Individual :个体,相对于团体,例如: Individual competition (个人比赛),相对于team competition (团体比赛) Individual users (个人用户)…

由于 z(x,y) 的变化导致的影响(那部分被分给了链式项)

✅ 本质问题:为什么链式法则中 ∂ F ∂ x \frac{\partial F}{\partial x} ∂x∂F​ 不考虑 z z ( x , y ) zz(x,y) zz(x,y)? 🔍 一、关键是:偏导数的定义是什么? 我们从最根本的定义开始: ∂ F ( x , y…

python打卡day44@浙大疏锦行

知识点回顾: 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战:resnet18 作业: 尝试在cifar10对比如下其他的预训练模型,观察差异,尽可能和他人选择的不同尝试通过ctrl进入resnet的…

十一(3) 类,加深对拷贝构造函数的理解

class ClassName { public: // 拷贝构造函数:参数是同类型对象的引用(通常为 const 引用) ClassName(const ClassName& other) { // 复制 other 的成员变量到当前对象 } }; 参数要求:必须是同类型对象的引用&#xff0…

网页后端开发(基础1--maven)

maven的作用: Maven是一款管理和构建Java项目的工具。 1.依赖管理: 方便快捷的管理项目依赖的资源(jar包) 不用手动下载jar包,只需要中maven中引用,maven会查找本地仓库。若本地仓库没有,会直…

认识电子元器件---高低边驱动

目录 一、基本概念 二、关键参数对比 三、工作原理 (1)高边驱动 (2)低边驱动 四、典型的应用场景 五、如何选择 一、基本概念 可以理解成:高低边驱动是MOS/IGBT的一种应用方式 高低边驱动是电路拓扑概念&#…

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …

C/CPP 结构体、联合体、位段内存计算 指南

C/CPP 结构体、联合体、位段内存计算 指南 在C语言中,结构体、联合体和位段是对数据的高级抽象,它们可以让程序员以更易于理解的方式来操作复杂的数据结构。然而,这些结构在内存中的布局可能并不如它们的语法结构那样直观,特别是当…

ASR(语音识别)语音/字幕标注 通过via(via_subtitle_annotator)

文章目录 1 VIA 官网资料2 语音/字幕标注3 键盘快捷键常规当一个时间片段被选中时图像或视频帧中的空间区域 1 VIA 官网资料 VIA官网:https://www.robots.ox.ac.uk/~vgg/software/via/ VIA官网标注示例:https://www.robots.ox.ac.uk/~vgg/software/via/…

mq安装新版-3.13.7的安装

一、下载包,上传到服务器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安装 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置环境变量,直接就安装了。 erl…

高通平台PCIE EP模式log丢失问题

高通平台PCIE EP模式log丢失问题 1 问题背景2 问题分析2.1 对比USB2.1.1 Logtool优化2.1.2 Device mhi与fs对比2.2 优化方案2.2.1 Diag系统优化2.2.2 Host mhi优化3 最终成果1 问题背景 高通5G模组如SDX55\SDX62\SDX65\SDX72\SDX75等支持pcie ep模式。会通过pcie与host(如MT7…