【HarmonyOS 5应用架构详解】深入理解应用程序包与多Module设计机制
⭐本期内容:【HarmonyOS 5应用架构详解】深入理解应用程序包与多Module设计机制
🏆系列专栏:鸿蒙HarmonyOS:探索未来智能生态新纪元
文章目录
- 前言
- 应用与应用程序包
- 应用程序的基本概念
- 应用程序包的类型
- 标识机制
- 应用安装流程
- 应用的多Module设计机制
- 多Module设计的核心理念
- 多Module设计的优势
- 多Module应用结构
- Module类型
- Entry Module(入口模块)
- Feature Module(功能模块)
- Shared Module(共享模块)
- 总结
前言
HarmonyOS 5的应用程序包不仅仅是简单的代码集合,而是一个完整的软件分发和部署单元
,包含了应用运行所需的所有元素。应用程序包的核心价值在于其模块化的组织方式,这种方式不仅提高了开发效率,还为分布式场景下的应用部署提供了强大的支持。通过精心设计的包结构,HarmonyOS能够实现按需加载、动态更新以及跨设备协同等高级功能
。
应用与应用程序包
应用程序的基本概念
“应用”(Application)是指提供给用户的一组功能集合,用户可以通过应用获取服务和体验。每个应用都有其独特的业务逻辑和用户界面,为用户提供特定的功能和服务。而"应用程序包"则是应用的部署和分发单元,是应用在设备上安装和运行的基础。
应用程序包的类型
HarmonyOS的应用程序包主要有两种类型:
HAP(Harmony Ability Package)
是模块级的部署单元
,包含特定模块的代码、资源和配置。每个HAP包都是一个独立的功能单元,可以包含一个或多个Ability,以及相关的资源文件和配置信息。APP(Application Package)
是应用级的分发单元
,由一个或多个HAP文件组成。当用户从应用市场下载应用时,实际下载的就是APP包,系统会自动解析并安装其中包含的所有HAP包。
标识机制
每个HAP包都由唯一的Bundle Name(应用包名)
和Module Name(模块名)
共同标识。
Bundle Name
在整个系统中唯一标识
一个应用,遵循反向域名命名规范,确保全局唯一性。Module Name
则在应用内部唯一标识
一个模块,使得同一应用的不同模块可以被准确区分和管理。
// 在app.json5中定义应用级配置
{"app": {"bundleName": "com.example.myapplication","vendor": "example","versionCode": 1000000,"versionName": "1.0.0","icon": "$media:layered_image","label": "$string:app_name","minAPIVersion": 12,"targetAPIVersion": 12}
}
应用安装流程
当用户从应用市场下载一个HarmonyOS应用时,实际上下载的是一个.app文件
。系统接收到这个文件后,会进行以下处理步骤:
- 解析APP包的结构和元数据。
- 提取其中包含的所有HAP包。
- 验证每个HAP包的完整性和签名。
- 将HAP包安装到设备的相应位置并注册到系统中。
完整项目结构
一个标准的HarmonyOS应用项目具有清晰的目录结构,每个目录都有其特定的用途和功能:
MyHarmonyApp/
├── AppScope/ // 应用级作用域
│ ├── app.json5 // 应用级配置文件
│ └── resources/ // 应用级资源
│ ├── base/ // 基础资源
│ │ ├── element/ // 基础元素资源
│ │ │ └── string.json // 字符串资源
│ │ ├── media/ // 媒体资源
│ │ │ └── app_icon.png// 应用图标
│ │ └── profile/ // 配置文件
│ └── en_US/ // 英文资源
├── entry/ // 入口模块
│ ├── src/ // 源代码目录
│ │ ├── main/ // 主要代码
│ │ │ ├── ets/ // ArkTS代码
│ │ │ │ ├── entryability/
│ │ │ │ │ └── EntryAbility.ets // 入口Ability
│ │ │ │ ├── entrybackupability/
│ │ │ │ │ └── EntryBackupAbility.ets // 备份Ability
│ │ │ │ └── pages/ // 页面代码
│ │ │ │ └── Index.ets // 首页
│ │ │ ├── resources/ // 模块资源
│ │ │ │ ├── base/ // 基础资源
│ │ │ │ │ ├── element/
│ │ │ │ │ │ ├── color.json // 颜色资源
│ │ │ │ │ │ └── string.json// 字符串资源
│ │ │ │ │ ├── media/ // 媒体资源
│ │ │ │ │ │ ├── layered_image.json
│ │ │ │ │ │ └── startIcon.png
│ │ │ │ │ └── profile/
│ │ │ │ │ ├── main_pages.json // 页面配置
│ │ │ │ │ └── backup_config.json // 备份配置
│ │ │ │ └── en_US/ // 英文资源
│ │ │ └── module.json5 // 模块配置文件
│ │ └── ohosTest/ // 测试代码
│ ├── build-profile.json5 // 构建配置
│ └── hvigorfile.ts // 构建脚本
├── build-profile.json5 // 应用构建配置
└── hvigorfile.ts // 应用构建脚本
应用的多Module设计机制
多Module设计的核心理念
HarmonyOS 5采用多Module设计机制
,允许开发者将应用程序分解为多个功能模块。
多Module设计的优势
功能解耦:
多Module设计的首要优势。通过将不同功能分离到不同模块中,可以有效减少代码之间的耦合度。按需加载:
用户只需下载和安装必要的模块,大大节省了设备的存储空间。对于功能丰富的大型应用,用户可以根据自己的需求选择安装特定的功能模块,避免了不必要的资源浪费。团队协作:
不同的开发团队可以并行开发不同的模块,每个团队专注于自己负责的功能领域,减少了团队之间的依赖和冲突,显著提高了整体的开发效率。可维护性:
当需要修复bug或添加新功能时,开发者可以快速定位到相关模块,进行精确的修改。适应分布式场景:
不同模块可以更容易地适配和部署到不同类型的设备上。
多Module应用结构
模块化设计的完整架构:
MyHarmonyApp/
├── AppScope/ // 应用级作用域
│ └── resources/ // 全局资源文件
│ ├── base/ // 基础资源
│ │ ├── element/ // 全局元素资源
│ │ ├── media/ // 全局媒体资源
│ │ └── profile/ // 全局配置文件
│ └── rawfile/ // 原始文件资源
├── entry/ // 入口模块
│ ├── src/
│ │ ├── main/
│ │ │ ├── ets/ // ArkTS代码
│ │ │ │ ├── entryability/
│ │ │ │ ├── pages/ // 页面代码
│ │ │ │ └── common/ // 通用代码
│ │ │ ├── resources/ // 模块资源
│ │ │ └── module.json5 // 模块配置
│ │ └── ohosTest/ // 测试代码
│ ├── build-profile.json5 // 构建配置
│ └── hvigorfile.ts // 构建脚本
├── feature_module/ // 功能模块
│ ├── src/
│ │ ├── main/
│ │ │ ├── ets/
│ │ │ ├── resources/
│ │ │ └── module.json5
│ │ └── ohosTest/
│ ├── build-profile.json5
│ └── hvigorfile.ts
├── common_library/ // 公共库模块
│ ├── src/
│ │ ├── main/
│ │ │ ├── ets/
│ │ │ │ ├── utils/ // 工具类
│ │ │ │ ├── constants/ // 常量定义
│ │ │ │ └── components/// 公共组件
│ │ │ └── resources/
│ │ └── ohosTest/
│ ├── build-profile.json5
│ └── hvigorfile.ts
├── build-profile.json5 // 应用构建配置
├── hvigorfile.ts // 应用构建脚本
└── oh-package.json5 // 依赖管理文件
Module类型
Entry Module(入口模块)
Entry Module
是应用的主要入口点
,承担着应用启动和主要业务流程的重要职责。它包含应用的主界面和核心业务逻辑
,是用户与应用交互的主要入口。
为了确保应用启动的唯一性和一致性,一个应用必须且只能有一个Entry Module。
{"module": {"name": "entry","type": "entry","srcEntry": "./ets/entryability/EntryAbility.ets","mainElement": "EntryAbility","description": "$string:module_desc","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:icon","label": "$string:EntryAbility_label","startWindowIcon": "$media:icon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}]}
}
Feature Module(功能模块)
Feature Module
提供特定功能的独立模块
,可以被Entry Module或其他Feature Module调用。一个应用可以包含零个或多个
Feature Module,这种设计使应用可以根据业务需求灵活组织功能模块。
Feature Module具有高度的独立性,可以包含自己的UI界面、业务逻辑和资源文件。
{"module": {"name": "payment","type": "feature","srcEntry": "./ets/paymentability/PaymentAbility.ets","description": "$string:payment_module_desc","abilities": [{"name": "PaymentAbility","srcEntry": "./ets/paymentability/PaymentAbility.ets","description": "$string:PaymentAbility_desc","icon": "$media:payment_icon","label": "$string:payment_name","exported": false,"skills": [{"entities": ["entity.system.default"],"actions": ["action.system.payment"]}]}],"extensionAbilities": [{"name": "PaymentExtension","srcEntry": "./ets/paymentextension/PaymentExtension.ets","type": "service","description": "$string:PaymentExtension_desc"}]}
}
Shared Module(共享模块)
Shared Module
是一种特殊类型
的模块,专门用于包含可以被多个模块共享
的代码和资源。它不会直接作为应用的可执行部分安装到设备上,而是作为其他Module的依赖
被引用和使用。
Shared Module的主要价值在于代码复用和资源共享。
将通用的工具类、组件、常量定义等放在Shared Module中,可以避免代码重复,提高开发效率,同时也便于统一维护和更新这些共享资源。
{"module": {"name": "common","type": "shared","srcEntry": "./index.ets","description": "$string:common_module_desc"}
}
对应的index.ets
文件通常会导出模块的公共接口:
// index.ets - Shared Module的入口文件
export { Logger } from './src/main/ets/utils/Logger'
export { HttpUtil } from './src/main/ets/utils/HttpUtil'
export { Constants } from './src/main/ets/constants/Constants'
export { CommonButton } from './src/main/ets/components/CommonButton'
export { DateUtil } from './src/main/ets/utils/DateUtil'
模块间依赖关系
在多Module应用中,模块间的依赖关系需要在oh-package.json5
文件中明确声明:
{"dependencies": {"common": "file:../common"}
}
总结
模块化系统中,各类模块各司其职:Entry Module担任应用入口,Feature Module封装独立功能,Shared Module实现资源共享。三者协同运作,共同构建出灵活高效、易于维护的应用架构。
若存疑问,欢迎随时交流探讨!
相关文章:

【HarmonyOS 5应用架构详解】深入理解应用程序包与多Module设计机制
⭐本期内容:【HarmonyOS 5应用架构详解】深入理解应用程序包与多Module设计机制 🏆系列专栏:鸿蒙HarmonyOS:探索未来智能生态新纪元 文章目录 前言应用与应用程序包应用程序的基本概念应用程序包的类型标识机制应用安装流程 应用的…...

【Oracle】DCL语言
个人主页:Guiat 归属专栏:Oracle 文章目录 1. DCL概述1.1 什么是DCL?1.2 DCL的核心功能 2. 用户管理2.1 创建用户2.2 修改用户2.3 删除用户2.4 用户信息查询 3. 权限管理3.1 系统权限3.1.1 授予系统权限3.1.2 撤销系统权限 3.2 对象权限3.2.1…...

MySQL强化关键_017_索引
目 录 一、概述 二、索引 1.主键索引 2.唯一索引 3.查看索引 4.添加索引 (1)建表时添加 (2)建表后添加 5.删除索引 三、树 1.二叉树 2.红黑树 3.B树 4.B树 (1)为什么 MySQL 选择B树作为索引…...
stm32——SPI协议
stm32——SPI协议 STM32的SPI(Serial Peripheral Interface,串行外设接口)协议是一种高速、全双工、同步的串行通信协议,广泛评估微控制器与各种外设(如传感器、器件、显示器、模块等)之间的数据传输。STM3…...
Linux 下如何查看进程的资源限制信息?
简介 Linux 上的 cat /proc/$pid/limits 命令提供有关特定进程的资源限制的信息,其中 $pid 是相关进程的进程 ID (pid)。该文件是 /proc 文件系统的一部分,该文件系统是一个虚拟文件系统,提供有关进程和系统资源的信息…...

【备忘】php命令行异步执行超长时间任务
环境说明: 操作系统:windows10 IDE:phpstorm 开发语言:php7.4 框架:thinkphp5.1 测试环境:linuxwindows均测试通过。 初级方法: function longRunningTask() {$root_path Tools::get_ro…...
对于ARM开发各种手册的分类
手册名称全称主要内容适用范围是不是讲SysTick?Cortex-M3 Technical Reference Manual (TRM)Cortex-M3 Technical Reference Manual描述 Cortex-M3内核架构,如寄存器模型、总线接口、指令集、异常模型只适合 Cortex-M3 内核,不含外设❌ 没有C…...
java开发中#和$的区别
在Spring框架中,$ 和 # 是两种不同的表达式前缀,用于从不同的来源获取值或执行计算。下面详细解释它们的区别和用法: 一、$ 占位符(Property Placeholder) 1. 作用 从配置文件(如 application.propertie…...

在 RK3588 上通过 VSCode 远程开发配置指南
在 RK3588 上通过 VSCode 远程开发配置指南 RK3588 设备本身不具备可视化编程环境,但可以通过 VSCode 的 Remote - SSH 插件 实现远程代码编写与调试。以下是完整的配置流程。 一、连接 RK3588 1. 安装 Debian 系统 先在 RK3588 上安装 Debian 操作系统。 2. 安…...

OpenHarmony标准系统-HDF框架之音频驱动开发
文章目录 引言OpenHarmony音频概述OpenHarmony音频框图HDF音频驱动框架概述HDF音频驱动框图HDF音频驱动框架分析之音频设备驱动HDF音频驱动框架分析之supportlibs实现HDF音频驱动框架分析之hdi-passthrough实现HDF音频驱动框架分析之hdi-bindev实现HDF音频驱动加载过程HDF音频驱…...

HTML Day03
Day03 0. 引言1. CSS1.1 CSS的3种使用方法1.2 内联样式1.3 内部样式表1.4 外部CSS文件 2. 图像3. 表格3.1单元格间距和单元格边框 4. 列表4.1 有序表格的不同类型4.2 不同类型的无序表格4.3 嵌套列表 5. 区块6. 布局6.1 div布局6.2 表格布局 0. 引言 HELLO ^ _ ^大家好…...

篇章六 数据结构——链表(二)
目录 1. LinkedList的模拟实现 1.1 双向链表结构图编辑 1.2 三个简单方法的实现 1.3 头插法 1.4 尾插法 1.5 中间插入 1.6 删除 key 1.7 删除所有key 1.8 clear 2.LinkedList的使用 2.1 什么是LinkedList 5.2 LinkedList的使用 1.LinkedList的构造 2. LinkedList的…...
Python60日基础学习打卡Day39
昨天我们介绍了图像数据的格式以及模型定义的过程,发现和之前结构化数据的略有不同,主要差异体现在2处 模型定义的时候需要展平图像由于数据过大,需要将数据集进行分批次处理,这往往涉及到了dataset和dataloader来规范代码的组织…...

吴恩达MCP课程(3):mcp_chatbot
原课程代码是用Anthropic写的,下面代码是用OpenAI改写的,模型则用阿里巴巴的模型做测试 .env 文件为: OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OPENAI_API_BASEhttps://dashscope.aliyuncs.com/compatible-mode…...
MySQL访问控制与账号管理:原理、技术与最佳实践
MySQL的安全体系建立在精细的访问控制和账号管理机制上。本文基于MySQL 9.3官方文档,深入解析其核心原理、关键技术、实用技巧和行业最佳实践。 一、访问控制核心原理:双重验证机制 连接验证 (Connection Verification) 客户端发起连接时,MyS…...
AWS 创建VPC 并且添加权限控制
AWS 创建VPC 并且添加权限控制 以下是完整的从0到1在AWS中创建VPC并配置权限的步骤(包含网络配置、安全组权限和实例访问): 1. 创建VPC 步骤: 登录AWS控制台 访问 AWS VPC控制台,点击 创建VPC。 配置基础信息 名称…...
langchain学习 01
dotenv库:可以从.env文件中加载配置信息。 from dotenv import load_dotenv # 加载函数,之后调用这个函数,即可获取配置环境.env里面的内容: deep_seek_api_key<api_key>getpass库:从终端输入password性质的内…...

【清晰教程】查看和修改Git配置情况
目录 查看安装版本 查看特定配置 查看全局配置 查看本地仓库配置 设置或修改配置 查看安装版本 打开命令行工具,通过version命令检查Git版本号。 git --version 如果显示出 Git 的版本号,说明 Git 已经成功安装。 查看特定配置 如果想要查看特定…...

JAVA 常用 API 正则表达式
1 正则表达式作用 作用一:校验字符串是否满足规则作用二:在一段文本中查找满足要求的内容 2 正则表达式规则 2.1 字符类 package com.bjpowernode.test14;public class RegexDemo1 {public static void main(String[] args) {//public boolean matche…...

光电设计大赛智能车激光对抗方案分享:低成本高效备赛攻略
一、赛题核心难点与备赛痛点解析 全国大学生光电设计竞赛的 “智能车激光对抗” 赛题,要求参赛队伍设计具备激光对抗功能的智能小车,需实现光电避障、目标识别、轨迹规划及激光精准打击等核心功能。从历年参赛情况看,选手普遍面临三大挑战&a…...

Python实现P-PSO优化算法优化BP神经网络回归模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代,回归分析作为预测和建模的重要工具,在科学研究和工业应用中占据着重要…...

Microsoft的在word中选择文档中的所有表格进行字体和格式的调整时的解决方案
找到宏 创建 并粘贴 使用 Sub 全选所有表格() Dim t As Table an MsgBox("即将选择选区内所有表格,若无选区,则选择全文表格。", vbYesNo, "reboot提醒您!") If an - 6 Then Exit Sub Set rg IIf(Selection.Type wdSelectionIP, …...

C++23:关键特性与最新进展深度解析
文章目录 范围的新功能与增强元组的优化与新特性字符与字符串的转义表示优化std::thread::id的改进与扩展栈踪迹的格式化支持结论 C23作为C标准的最新版本,带来了许多令人瞩目的改进和新特性。从新的范围和元组功能到对字符和字符串转义表示的优化,再到 …...
Rust并发编程实践指南
Rust并发编程实践指南 一、Rust并发编程哲学 mindmaproot((Rust并发))Ownership System▶ 移动语义▶ 借用规则Type Safety▶ Send Trait▶ Sync TraitZero-Cost Abstraction▶ 无运行时开销▶ 编译期检查Fearless Concurrency▶ 数据竞争预防▶ 死锁检测工具二、核心并发模型…...
Kubernetes资源申请沾满但是实际的资源占用并不多,是怎么回事?
Kubernetes资源申请沾满但是实际的资源占用并不多是Kubernetes资源管理中的一个常见误解。 K8s资源管理机制 资源请求(Requests) vs 实际使用量 从你的截图可以看到: K8s节点资源状态(第一张图): CPU请求量:13795…...

鲲鹏Arm+麒麟V10 K8s 离线部署教程
针对鲲鹏 CPU 麒麟 V10 的离线环境,手把手教你从环境准备到应用上线,所有依赖包提前打包好,步骤写成傻瓜式操作指南。 一、环境规划# 准备至少两台机器。 架构OS作用Arm64任意,Mac 也可以下载离线包Arm64麒麟 V10单机部署 K8s…...

PGSQL结合linux cron定期执行vacuum_full_analyze命令
VACUUM FULL ANALYZE 详解 一、核心功能 空间回收与重组 完全重写表数据文件,将碎片化的存储空间合并并返还操作系统(普通 VACUUM 仅标记空间可重用)。彻底清理死元组(已删除或更新的旧数据行),解…...
php 中使用MQTT
MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。 本文主要介绍如何在 PHP项目中使用composer require php-m…...

C#定时器深度对比:System.Timers.Timer vs System.Threading.Timer性能实测与选型指南
本文通过真实基准测试揭秘两种常用定时器的性能差异,助你做出最佳选择 一、C#定时器全景概览 在C#生态中,不同定时器适用于不同场景。以下是主流定时器的核心特性对比: 定时器类型命名空间适用场景触发线程精度内存开销依赖框架System.Wind…...
go的select多路复用
传统的方法在遍历管道时,如果不关闭会阻塞而导致 deadlock ,在实际开发中,可能我们不好确定什么关闭该管道。使用select来获取channel里面的数据的时候不需要关闭channel 你也许会写出如下代码使用遍历的方式来实现: for { //…...