Skip to main content

多module机制

在鸿蒙(HarmonyOS/OpenHarmony)开发中,多Module设计机制是将应用代码按功能或职责拆分为多个独立的Module(模块),通过工程化配置实现代码隔离、复用和团队协作的开发模式。与多bundle机制(侧重部署和跨应用协同)不同,多Module更聚焦于开发阶段的代码组织,是单一应用内部的模块化拆分方案。

一、基本概念:什么是“Module”?

在鸿蒙开发工程中,Module 是代码和资源的组织单元,对应工程目录中的一个子模块,包含特定功能的代码、页面、资源及配置。其核心作用是:

  • 隔离不同功能的代码(如UI模块、网络模块、工具类模块),降低耦合度;
  • 支持代码复用(如多个应用共用同一个网络请求Module);
  • 便于团队按模块分工开发,提升协作效率。

一个鸿蒙应用工程通常包含一个主Module(Entry Module)和多个功能Module(Feature Module/Library Module)。

二、多Module的类型及作用

鸿蒙开发工具(DevEco Studio)中,Module主要分为以下类型,适用于不同场景:

类型作用特点产物形式典型场景
Entry Module应用主入口,承载核心功能有且仅有一个,包含主Ability和启动配置可打包为HAP(应用包)应用首页、核心业务流程
Feature Module提供扩展功能,依赖Entry或其他Feature可独立开发,需被主Module引用才能运行可打包为独立HAP或合并到主HAP登录模块、支付模块、设置模块
Library Module提供通用工具或基础能力纯代码/资源库,无独立运行能力,被其他Module依赖编译为静态库(.a)或HAR(鸿蒙归档包)网络请求工具、数据解析工具、自定义组件库

三、多Module的核心机制

1. 依赖管理

多Module通过依赖关系协同工作,依赖方式分为本地依赖远程依赖

  • 本地依赖:工程内的Module依赖其他Module(如Entry Module依赖Feature Module或Library Module)。

    • 配置方式:在Module的build.gradle中通过implementation project(':moduleName')声明依赖。
    • 示例:
      // Entry Module的build.gradle
      dependencies {
      implementation project(':feature_payment') // 依赖支付Feature Module
      implementation project(':library_network') // 依赖网络工具Library Module
      }
  • 远程依赖:依赖远程仓库中的HAR包(类似Android的AAR),适用于复用第三方库或团队共享组件。

    • 配置方式:在build.gradle中声明仓库地址和依赖坐标。
    • 示例:
      // 声明远程仓库(如Maven)
      repositories {
      maven {
      url 'https://maven.example.com/harmonyos'
      }
      }

      // 依赖远程Library Module的HAR包
      dependencies {
      implementation 'com.example:network-utils:1.0.0'
      }

2. 资源与配置共享

多Module之间可通过以下方式共享资源(图片、字符串、样式等)或配置:

  • Library Module导出资源:在main/resources目录下存放通用资源,被依赖后可直接引用(如$r('app.string.common_text'))。
  • 全局配置继承:主Module的config.json(或module.json5)可定义全局配置,Feature Module可继承或覆盖部分配置(如权限、生命周期)。
  • 资源冲突处理:若多个Module存在同名资源,默认以依赖链中优先级高的Module(如Entry Module)为准,或通过resourceManager指定来源。

3. 编译与打包机制

多Module工程的编译和打包由构建工具(HAP打包工具)自动处理,核心规则:

  • Entry Module 会将依赖的Feature Module和Library Module的代码、资源合并(或按需打包为独立HAP),生成可安装的应用包。
  • Library Module 编译为HAR包后,被其他Module依赖时,其代码会被嵌入到依赖方的HAP中,不单独部署。
  • 支持按需打包:通过配置build.gradle中的hapOptions,指定哪些Feature Module打包为独立HAP(供动态加载),哪些合并到主HAP。

4. 模块间通信

同一应用内的多Module之间通信方式简单直接,无需跨应用权限校验,常见方式:

  • 直接调用:Module间通过公开的类、方法直接交互(如Library Module提供网络工具类,Entry Module直接实例化调用)。
  • 事件总线:通过鸿蒙的EventHub或第三方事件库(如EventBus)实现模块解耦通信(如登录模块发送“登录成功”事件,首页模块监听并更新UI)。
  • Ability交互:若Feature Module包含Ability,Entry Module可通过startAbility启动其页面(同应用内无需跨bundle权限)。

四、多Module与多bundle的区别

多Module和多bundle都用于模块化设计,但核心差异在于作用阶段粒度

维度多Module多bundle
作用阶段开发阶段(代码组织、团队协作)部署与运行阶段(跨应用协同、按需部署)
独立性依赖主Module,无法独立部署运行可独立部署(如Service bundle)
产物合并为应用内的HAP或HAR独立的bundle包(含自身配置和签名)
通信成本直接调用或简单事件通信需通过跨bundle接口(如RPC、公共事件)
典型场景单一应用的功能拆分(如登录、支付模块)跨应用协同(如调用系统服务、第三方插件)

五、最佳实践

  1. 按功能边界拆分:将独立功能(如登录、购物车)拆分为Feature Module,通用工具(如网络、存储)拆分为Library Module。
  2. 控制依赖层级:避免Module间形成循环依赖(如A依赖B,B依赖A),建议通过“单向依赖链”(Entry → Feature → Library)组织。
  3. 资源命名规范:为避免Module间资源冲突,建议按模块前缀命名(如login_btn_bgpay_dialog_title)。
  4. 动态功能Module:将非核心功能(如会员中心)配置为可动态加载的Feature Module,减少主应用体积。

总结

多Module设计机制是鸿蒙应用开发中代码组织和团队协作的核心方案,通过合理拆分模块、管理依赖和共享资源,可显著提升大型应用的开发效率和可维护性。其与多bundle机制配合使用(开发时多Module,部署时多bundle),能更好地满足鸿蒙分布式应用的模块化、可扩展需求。