【HarmonyOS 5应用架构详解】深入理解应用程序包与多Module设计机制

news2025/6/3 3:09:39

在这里插入图片描述

⭐本期内容:【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文件。系统接收到这个文件后,会进行以下处理步骤:

  1. 解析APP包的结构和元数据。
  2. 提取其中包含的所有HAP包。
  3. 验证每个HAP包的完整性和签名。
  4. 将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实现资源共享。三者协同运作,共同构建出灵活高效、易于维护的应用架构。

若存疑问,欢迎随时交流探讨!
在这里插入图片描述

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

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

相关文章

【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树作为索引…

【备忘】php命令行异步执行超长时间任务

环境说明: 操作系统:windows10 IDE:phpstorm 开发语言:php7.4 框架:thinkphp5.1 测试环境:linuxwindows均测试通过。 初级方法: function longRunningTask() {$root_path Tools::get_ro…

在 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 ^ _ ^大家好&#xf…

篇章六 数据结构——链表(二)

目录 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的…

吴恩达MCP课程(3):mcp_chatbot

原课程代码是用Anthropic写的,下面代码是用OpenAI改写的,模型则用阿里巴巴的模型做测试 .env 文件为: OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OPENAI_API_BASEhttps://dashscope.aliyuncs.com/compatible-mode…

【清晰教程】查看和修改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标准的最新版本,带来了许多令人瞩目的改进和新特性。从新的范围和元组功能到对字符和字符串转义表示的优化,再到 …

鲲鹏Arm+麒麟V10 K8s 离线部署教程

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

PGSQL结合linux cron定期执行vacuum_full_analyze命令

‌VACUUM FULL ANALYZE 详解‌ 一、核心功能 ‌空间回收与重组‌ 完全重写表数据文件,将碎片化的存储空间合并并返还操作系统(普通 VACUUM 仅标记空间可重用)。彻底清理死元组(已删除或更新的旧数据行),解…

C#定时器深度对比:System.Timers.Timer vs System.Threading.Timer性能实测与选型指南

本文通过真实基准测试揭秘两种常用定时器的性能差异,助你做出最佳选择 一、C#定时器全景概览 在C#生态中,不同定时器适用于不同场景。以下是主流定时器的核心特性对比: 定时器类型命名空间适用场景触发线程精度内存开销依赖框架System.Wind…

解决8080端口被占问题

文章目录 1. 提出问题2. 解决问题2.1 查看占用8080端口的进程2.2 杀死占用8080端口的进程2.3 测试问题是否已解决3. 实战小结1. 提出问题 运行Spring Boot项目,报错8080端口被占 2. 解决问题 2.1 查看占用8080端口的进程 执行命令:netstat -ano | findstr :8080 2.2 杀死占用…

介绍一种LDPC码译码器

介绍比特翻转译码原理以及LDPC码译码器的设计。 1 译码理论 比特翻转(BF)译码算法是硬判决算法的一种。 主要译码思想是:当有一个校验矩阵出错时,BF 算法认为在这个校验矩阵中一定至少存在一个位置的码字信息是错误的&#xff1…

3DMAX+Photoshop教程:将树木和人物添加到户外建筑场景中的方法

在本教程中,我将向您展示如何制作室外场景。我不会详细解释每一个细节,而是想快速概述一下我的方法。 在本教程中,我使用了一个相对简单的3D模型,并向您展示了在一些高质量纹理的帮助下可以做什么。此外,我将向您展示…