一、HarmonyOS NEXT 模块管理概述

HarmonyOS 5 作为华为新一代分布式操作系统,其模块化架构设计为开发者提供了更灵活的应用构建方式。模块是HarmonyOS应用的基本组成单元,每个模块可以独立开发、编译和部署,同时又能与其他模块协同工作。

1.1 模块类型

在HarmonyOS NEXT中,主要包含以下几种模块类型:

  1. Entry模块:应用的主模块,包含应用的主入口
  2. Feature模块:动态特性模块,支持按需加载
  3. HAR模块:静态共享包,多个模块共享代码
  4. HSP模块:动态共享包,运行时动态加载

1.2 模块配置文件

每个HarmonyOS模块都包含一个module.json5配置文件,用于定义模块的基本信息和能力:

{
  "module": {
    "name": "entry",
    "type": "entry",
    "srcEntry": "./ets/EntryAbility",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/EntryAbility",
        "label": "$string:EntryAbility_label",
        "icon": "$media:icon",
        "description": "$string:EntryAbility_desc",
        "startWindowIcon": "$media:icon",
        "startWindowBackground": "$color:start_window_background",
        "visible": true,
        "skills": [
          {
            "actions": [
              "action.system.home"
            ],
            "entities": [
              "entity.system.home"
            ]
          }
        ]
      }
    ]
  }
}

二、HAR模块开发实践

HAR(Harmony Archive)是HarmonyOS的静态共享包,允许多个模块共享ArkUI组件、资源和相关代码。

2.1 创建HAR模块

  1. 在DevEco Studio中,选择File > New > Module
  2. 选择Static Library模板创建HAR模块

2.2 开发共享组件

下面是一个简单的共享按钮组件示例:

// har/src/main/ets/components/CommonButton.ets
@Component
export struct CommonButton {
  @State label: string = 'Button'
  @Prop onClick: () => void = () => {}

  build() {
    Button(this.label)
      .width(150)
      .height(50)
      .fontSize(16)
      .fontWeight(FontWeight.Bold)
      .backgroundColor('#007DFF')
      .borderRadius(25)
      .onClick(() => {
        this.onClick()
      })
  }
}

2.3 导出共享组件

在HAR模块的入口文件中导出共享组件:

// har/src/main/ets/index.ets
export { CommonButton } from './components/CommonButton'

2.4 使用HAR模块

在其他模块中使用HAR模块的共享组件:

  1. oh-package.json5中添加依赖:
{
  "dependencies": {
    "common": "file:../har"
  }
}
  1. 在代码中使用共享组件:
// entry/src/main/ets/pages/Index.ets
import { CommonButton } from 'common'

@Entry
@Component
struct Index {
  build() {
    Column() {
      CommonButton({
        label: 'Click Me',
        onClick: this.onButtonClick
      })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }

  onButtonClick() {
    console.log('Button clicked!')
  }
}

三、HSP模块开发实践

HSP(Harmony Shared Package)是HarmonyOS的动态共享包,支持运行时动态加载,适合大型应用的按需加载场景。

3.1 创建HSP模块

  1. 在DevEco Studio中,选择File > New > Module
  2. 选择Shared Library模板创建HSP模块

3.2 开发动态功能

// hsp/src/main/ets/features/AdvancedFeature.ets
export function showAdvancedFeature(context: common.UIAbilityContext) {
  // 创建并显示动态功能界面
  let windowStage = context.getWindowStage()
  windowStage.loadContent('pages/AdvancedPage', (err) => {
    if (err) {
      console.error('Failed to load content. Cause: ' + JSON.stringify(err))
      return
    }
    console.log('Advanced feature loaded successfully')
  })
}

3.3 配置HSP模块

module.json5中配置HSP模块:

{
  "module": {
    "name": "hsp",
    "type": "shared",
    "srcEntry": "./ets/AdvancedFeature",
    "description": "$string:module_desc",
    "deviceTypes": [
      "phone",
      "tablet"
    ]
  }
}

3.4 动态加载HSP模块

在主模块中动态加载HSP功能:

// entry/src/main/ets/pages/Index.ets
import { CommonButton } from 'common'
import abilityAccessCtrl from '@ohos.abilityAccessCtrl'

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      
      CommonButton({
        label: 'Load Advanced Feature',
        onClick: this.loadAdvancedFeature
      })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }

  async loadAdvancedFeature() {
    try {
      // 检查权限
      let atManager = abilityAccessCtrl.createAtManager()
      await atManager.requestPermissionsFromUser(
        ['ohos.permission.GET_BUNDLE_INFO']
      )
      
      // 动态加载HSP模块
      let feature = await import('hsp')
      feature.showAdvancedFeature(this.context)
    } catch (err) {
      console.error('Failed to load advanced feature: ' + JSON.stringify(err))
    }
  }
}

四、模块间通信

HarmonyOS 5提供了多种模块间通信机制,包括:

4.1 使用EventHub通信

// 发送方模块
import common from '@ohos.app.ability.common'

function sendMessage(context: common.UIAbilityContext) {
  context.eventHub.emit('moduleEvent', { data: 'Hello from Module A' })
}

// 接收方模块
import common from '@ohos.app.ability.common'

function setupReceiver(context: common.UIAbilityContext) {
  context.eventHub.on('moduleEvent', (data) => {
    console.log('Received message: ' + JSON.stringify(data))
  })
}

4.2 使用Caller/Callee通信

定义Callee接口:

// callee/src/main/ets/services/CalcService.ets
import rpc from '@ohos.rpc'

class CalcServiceStub extends rpc.RemoteObject {
  constructor(des: string) {
    super(des)
  }

  onRemoteRequest(code: number, data: rpc.MessageParcel, reply: rpc.MessageParcel, option: rpc.MessageOption) {
    if (code === 1) {
      let num1 = data.readInt()
      let num2 = data.readInt()
      reply.writeInt(num1 + num2)
    }
    return true
  }
}

export default {
  onConnect() {
    return new CalcServiceStub('CalcService')
  }
}

Caller端调用:

// caller/src/main/ets/pages/Index.ets
import rpc from '@ohos.rpc'

@Entry
@Component
struct Index {
  @State result: number = 0

  build() {
    Column() {
      Text('Result: ' + this.result)
        .fontSize(30)
      
      Button('Calculate')
        .onClick(() => {
          this.calculate()
        })
    }
  }

  async calculate() {
    try {
      let ability = await FeatureAbility.callAbility({
        bundleName: 'com.example.callee',
        abilityName: 'CalcService'
      })
      
      let option = new rpc.MessageOption()
      let data = rpc.MessageParcel.create()
      let reply = rpc.MessageParcel.create()
      
      data.writeInt(10)
      data.writeInt(20)
      
      await ability.call(1, data, reply, option)
      this.result = reply.readInt()
    } catch (err) {
      console.error('Calculation failed: ' + JSON.stringify(err))
    }
  }
}

五、模块管理最佳实践

  1. 合理划分模块:按功能划分模块,保持高内聚低耦合
  2. 控制模块大小:单个模块不宜过大,建议控制在2MB以内
  3. 按需加载:非核心功能使用HSP动态加载
  4. 版本管理:使用语义化版本控制模块版本
  5. 依赖管理:明确声明依赖关系,避免循环依赖

六、总结

HarmonyOS 5的模块化管理机制为应用开发提供了极大的灵活性和可扩展性。通过合理使用Entry、Feature、HAR和HSP等模块类型,开发者可以构建出结构清晰、性能优越的分布式应用。模块间通信机制则确保了各模块能够高效协同工作,共同完成复杂的业务功能。

随着HarmonyOS生态的不断发展,模块化管理将成为开发者必须掌握的核心技能之一。希望本文能够帮助开发者快速上手HarmonyOS 5的模块化开发,构建出更优质的HarmonyOS应用。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐