HarmonyOS NEXT模块管理:从基础到实践
·
一、HarmonyOS NEXT 模块管理概述
HarmonyOS 5 作为华为新一代分布式操作系统,其模块化架构设计为开发者提供了更灵活的应用构建方式。模块是HarmonyOS应用的基本组成单元,每个模块可以独立开发、编译和部署,同时又能与其他模块协同工作。
1.1 模块类型
在HarmonyOS NEXT中,主要包含以下几种模块类型:
- Entry模块:应用的主模块,包含应用的主入口
- Feature模块:动态特性模块,支持按需加载
- HAR模块:静态共享包,多个模块共享代码
- 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模块
- 在DevEco Studio中,选择
File > New > Module - 选择
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模块的共享组件:
- 在
oh-package.json5中添加依赖:
{
"dependencies": {
"common": "file:../har"
}
}
- 在代码中使用共享组件:
// 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模块
- 在DevEco Studio中,选择
File > New > Module - 选择
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))
}
}
}
五、模块管理最佳实践
- 合理划分模块:按功能划分模块,保持高内聚低耦合
- 控制模块大小:单个模块不宜过大,建议控制在2MB以内
- 按需加载:非核心功能使用HSP动态加载
- 版本管理:使用语义化版本控制模块版本
- 依赖管理:明确声明依赖关系,避免循环依赖
六、总结
HarmonyOS 5的模块化管理机制为应用开发提供了极大的灵活性和可扩展性。通过合理使用Entry、Feature、HAR和HSP等模块类型,开发者可以构建出结构清晰、性能优越的分布式应用。模块间通信机制则确保了各模块能够高效协同工作,共同完成复杂的业务功能。
随着HarmonyOS生态的不断发展,模块化管理将成为开发者必须掌握的核心技能之一。希望本文能够帮助开发者快速上手HarmonyOS 5的模块化开发,构建出更优质的HarmonyOS应用。
更多推荐


所有评论(0)