HarmonyOS应用开发实战:小事记 - module.json5 配置深度解析:Ability 声明、skills 隐式匹配与 extensionAbilities
前言在 HarmonyOS 的 Stage 模型中module.json5是每个 HAP 模块的核心配置文件它决定了应用的入口、能力开放范围、设备兼容性和扩展能力注册方式。与传统的AndroidManifest.xml或 iOS 的Info.plist不同HarmonyOS 的配置体系采用了双层结构AppScope 级 Module 级使得多模块工程的管理更加灵活。本文以 小事记xiaoshiji_ohos_app 的module.json5为基础深入解析每个配置字段的含义、skills隐式匹配机制和extensionAbilities的注册流程。本文参考 HarmonyOS 官方文档application-configuration-file-stage.md 和 application-models.md。一、双层配置体系概览1.1 AppScope 层与 Module 层的职责划分HarmonyOS 工程采用双层配置结构层级配置文件路径作用域配置内容App 层app.json5AppScope/app.json5整个应用bundleName、versionCode、vendor、应用图标Module 层module.json5entry/src/main/module.json5单个 HAP 模块abilities、extensionAbilities、deviceTypes、pages小事记的app.json5配置如下{ app: { bundleName: com.xiaoshiji.app, // 应用包名全局唯一 vendor: xiaoshiji, // 供应商名称 versionCode: 1000000, // 版本号整数 versionName: 1.0.0, // 版本名称字符串 icon: $media:layered_image, // 应用图标资源引用 label: $string:app_name // 应用名称资源引用 } }关键字段说明bundleName— 应用的唯一标识符遵循反向域名规则一旦发布不可更改versionCode— 用于版本比较的整数每次更新必须递增versionName— 展示给用户的版本名称遵循语义化版本规范$media:layered_image— 资源引用语法$media前缀指向resources/base/media/目录下的资源文件1.2 资源引用语法HarmonyOS 使用$前缀引用资源文件支持多种资源类型引用语法资源类型对应目录示例$string:xxx字符串资源resources/base/element/string.json$string:app_name$color:xxx颜色资源resources/base/element/color.json$color:start_window_background$media:xxx媒体资源resources/base/media/$media:startIcon$profile:xxx配置资源resources/base/profile/$profile:main_pages$float:xxx浮点数资源resources/base/element/float.json$float:corner_radius提示使用资源引用而非硬编码值的最大好处是多语言和多设备适配——系统会根据设备语言和屏幕密度自动选择对应限定符下的资源文件。二、module 根字段详解2.1 基础标识字段{ module: { name: entry, // 模块名称工程内唯一 type: entry, // 模块类型entry / feature / har / hsp description: $string:module_desc, mainElement: EntryAbility, // 模块的主入口 Ability deviceTypes: [phone], // 支持的设备类型 deliveryWithInstall: true, // 是否随安装包一起交付 installationFree: false, // 是否支持免安装 pages: $profile:main_pages // 页面路由配置 } }type字段的四种取值类型说明使用场景是否可独立运行entry应用主入口模块应用的主 HAP✅feature功能特性模块按需加载的功能模块✅har静态共享包代码和资源静态打包多模块引用❌hsp动态共享包运行时共享多个 entry/feature 共用❌deviceTypes可选值phone— 手机tablet— 平板car— 车机tv— 智慧屏wearable— 穿戴设备2in1— 二合一设备2.2 页面配置$profile:main_pagespages字段引用了resources/base/profile/main_pages.json文件其中定义了模块的所有页面路由// resources/base/profile/main_pages.json { src: [ pages/Index, pages/HomePage, pages/RecordPage, pages/EventDetailPage, pages/StatisticsPage, pages/SearchPage, pages/TimelineViewPage, pages/CalendarViewPage, pages/CalendarImportPage, pages/SettingsPage, pages/DataBackupPage, pages/TagManagementPage, pages/WitnessListPage, pages/RelatedPeoplePage, pages/AutoGeneratePage, pages/MemoryVideoPage ] }每个页面路径对应ets/pages/目录下的一个.ets文件。页面路径的注册遵循以下规则路径以pages/开头不含文件扩展名路径必须与ets/pages/下的文件一一对应Entry装饰的组件通过import router引用时url参数与这些路径一致// Index.ets — 使用 pages 中的注册路径跳转 import router from ohos.router; Entry Component struct Index { aboutToAppear(): void { router.replaceUrl({ url: pages/HomePage }); // 与 main_pages.json 中的注册路径一致 } }三、abilities 配置深度解析3.1 EntryAbility 的完整配置{ abilities: [ { name: EntryAbility, // Ability 名称模块内唯一 srcEntry: ./ets/entryability/EntryAbility.ets, // 入口文件路径 description: $string:EntryAbility_desc, // 描述 icon: $media:layered_image, // 图标 label: $string:EntryAbility_label, // 标签 startWindowIcon: $media:startIcon, // 启动窗口图标 startWindowBackground: $color:start_window_background, // 启动窗口背景色 exported: true, // 是否允许外部应用启动 skills: [...] // 隐式匹配规则 } ] }3.2 启动窗口的视觉优化startWindowIcon和startWindowBackground共同决定了用户点击应用图标后到看到首页之前的视觉过渡startWindowIcon— 启动时显示的图标通常使用应用图标startWindowBackground— 启动窗口的背景色建议与应用首页背景色一致// 正确的颜色资源引用 // resources/base/element/color.json { color: [ { name: start_window_background, value: #F8F9FA // 与 HomePage 的背景色一致消除视觉跳跃 } ] }提示启动窗口的显示时间由系统控制无法通过代码缩短。优化体验的关键是让启动窗口背景色与首页背景色一致避免出现白屏闪烁。3.3 exported 字段的权限控制exported字段决定了其他应用是否能够启动当前 Abilityexported 值含义使用场景true允许外部应用唤醒主入口 Ability需要被桌面启动false仅本应用内可调用备份 Ability、内部页面// 外部应用尝试启动本应用的 EntryAbility let want { bundleName: com.xiaoshiji.app, abilityName: EntryAbility }; // 如果 exported: false该调用会失败返回错误码 this.context.startAbility(want, (err) { if (err.code) { console.error(无法启动目标 Ability); } });四、skills 隐式匹配机制4.1 匹配规则skills数组定义了 Ability 能够响应的隐式 Want匹配规则。当系统或其他应用发送一个隐式 Want 时会根据skills中的配置进行匹配{ skills: [ { entities: [entity.system.home], // 实体类别 actions: [ohos.want.action.home] // 操作类型 } ] }匹配规则Want 的action必须与 skills 中至少一个actions匹配Want 的entities必须包含 skills 中所有entitiesskills 中定义的 entities 是“必须包含“的关系如果 skills 未定义entities则匹配时不检查 entities4.2 桌面图标的启动匹配当用户在桌面点击应用图标时系统发送的隐式 Want 为{ action: ohos.want.action.home, entities: [entity.system.home] }这个 Want 匹配到EntryAbility的 skills 配置从而启动应用。如果skills配置错误桌面图标将无法启动应用。4.3 多种匹配模式的配置一个 Ability 可以配置多个skills数组元素每个元素代表一组匹配规则{ skills: [ { // 规则一桌面图标启动 entities: [entity.system.home], actions: [ohos.want.action.home] }, { // 规则二处理分享 entities: [entity.system.share], actions: [ ohos.want.action.sendData, ohos.want.action.sendMultipleData ], uris: [ { scheme: https, host: *.xiaoshiji.com, path: /share/* } ] } ] }uris匹配规则字段说明示例schemeURI 协议https、file、contenthost主机名*.xiaoshiji.com支持通配符port端口号8080path精确路径/share/eventpathStartWith路径前缀/share/pathPattern路径正则/share/[0-9]typeMIME 类型text/plain、image/*4.4 隐式匹配与显式启动的对比对比维度隐式启动显式启动指定方式actionentitiesuribundleNameabilityName匹配过程系统遍历所有应用的 skills直接定位目标 Ability灵活性高解耦调用方和被调用方低需要知道目标的具体信息安全性低任何匹配的应用都可以响应高精确指定目标性能稍慢需要系统匹配快直接启动五、extensionAbilities 配置5.1 备份扩展 Ability 的注册小事记中注册了一个BackupExtensionAbility用于数据备份和恢复{ extensionAbilities: [ { name: EntryBackupAbility, srcEntry: ./ets/entrybackupability/EntryBackupAbility.ets, type: backup, // 扩展类型 exported: false, // 不对外暴露 metadata: [ { name: ohos.extension.backup, // 系统约定的元数据名称 resource: $profile:backup_config // 备份配置文件 } ] } ] }5.2 ExtensionAbility 的类型体系type值说明基类backup数据备份恢复BackupExtensionAbilityservice后台服务ServiceExtensionAbilityform卡片WidgetFormExtensionAbilityworkScheduler延迟任务调度WorkSchedulerExtensionAbilityinputMethod输入法InputMethodExtensionAbilityaccessibility无障碍服务AccessibilityExtensionAbilityfileShare文件共享FileShareExtensionAbilitywindow窗口扩展WindowExtensionAbility5.3 metadata 配置metadata数组用于向系统传递扩展的配置信息每个 metadata 包含name和resource两个字段{ metadata: [ { name: ohos.extension.backup, resource: $profile:backup_config // 引用 profile 目录下的配置文件 } ] }backup_config.json文件定义了备份的具体规则// resources/base/profile/backup_config.json { allowToBackup: true, includes: [ data/storage/el2/database/, data/storage/el2/base/preferences/ ], excludes: [ data/storage/el2/base/cache/ ] }六、多模块配置实战6.1 多 Module 工程的配置结构当应用扩展为多模块时每个模块有独立的module.json5AppScope/app.json5 ← 应用级配置全局唯一 entry/src/main/module.json5 ← 主模块 feature1/src/main/module.json5 ← 功能模块 1 feature2/src/main/module.json5 ← 功能模块 26.2 跨模块 Ability 的启动// 在主模块中启动 feature 模块的 Ability let want { bundleName: com.xiaoshiji.app, moduleName: feature_share, // 指定模块名称 abilityName: ShareAbility }; this.context.startAbility(want);6.3 使用 createModuleContext 访问其他模块的资源import { application } from kit.AbilityKit; // 获取 feature 模块的 Context application.createModuleContext(this.context, feature_share) .then((moduleContext) { // 读取该模块的字符串资源 let desc moduleContext.resourceManager.getStringSync( $r(app.string.feature_desc).id ); console.log(模块描述: ${desc}); });七、配置文件的常见错误排查7.1 页面路径注册错误// ❌ 错误页面路径遗漏或拼写错误 { pages: $profile:main_pages } // main_pages.json 中缺少 pages/HomePage 的注册 // 运行时 router.pushUrl({ url: pages/HomePage }) 会返回错误码 200007 // ✅ 正确确保所有页面都在 main_pages.json 中注册 { src: [ pages/Index, pages/HomePage, // ... ] }7.2 skills 配置错误导致桌面图标无法启动// ❌ 错误缺少 actions 或 entities 配置 { skills: [ { // 缺少 ohos.want.action.home entities: [entity.system.home] } ] } // ✅ 正确 { skills: [ { entities: [entity.system.home], actions: [ohos.want.action.home] } ] }7.3 资源引用路径错误// ❌ 错误资源文件不存在 startWindowBackground: $color:nonexistent_color // ✅ 正确确保资源文件在 element/color.json 中定义 { color: [ { name: start_window_background, value: #F8F9FA } ] }八、配置文件的版本演进8.1 API 版本与配置项变化API 版本配置变化说明API 9引入module.json5替代 FA 模型的config.jsonAPI 10新增installationFree支持免安装应用API 11新增deliveryWithInstall支持按需交付API 12Kit 化导入路径kit.AbilityKit替代ohos.ability.xxxAPI 14新增multiApp配置支持多应用共享进程九、配置文件自动生成工具9.1 使用 DevEco Studio 的配置可视化DevEco Studio 提供了module.json5的图形化编辑界面可以通过Open Editor按钮在可视化视图中编辑配置在项目管理器中双击module.json5点击编辑器右上角的Open Editor在可视化界面中填写配置项保存后自动生成module.json5文件9.2 使用 hvigor 的自定义配置在build-profile.json5中可以通过buildOption配置编译时的 module.json5 覆盖{ app: { products: [ { name: default, targetSdkVersion: 6.0.2(22), compatibleSdkVersion: 6.0.2(22), runtimeOS: HarmonyOS, buildOption: { strictMode: { caseSensitiveCheck: true, useNormalizedOHMUrl: true } } } ] } }总结本文从xiaoshiji_ohos_app项目的module.json5出发深入解析了 HarmonyOS Stage 模型的双层配置体系。核心要点如下双层配置app.json5负责应用级信息module.json5负责模块级配置两者配合使用Ability 声明通过abilities数组注册 UIAbility每个 Ability 可独立配置启动窗口、图标和导出权限skills 隐式匹配通过actionsentitiesuris的组合规则实现灵活的组件间通信extensionAbilities通过备份、服务、卡片等多种扩展类型为应用增添后台能力资源引用使用$string/$color/$media/$profile等前缀引用资源文件实现多设备适配下一篇文章将深入解析备份扩展 Ability 的注册机制与 onBackup/onRestore 生命周期详细讲解BackupExtensionAbility的完整实现流程。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源小事记项目源码xiaoshiji_ohos_app官方文档 - 配置文件application-configuration-file-stage.md官方文档 - 应用模型application-models.md官方文档 - 包结构application-package-structure-stage.md官方文档 - 配置文件概述application-configuration-file-overview-stage.md官方文档 - 启动选项application-startup-options.md官方文档 - 应用包开发application-package-dev.md开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

运维转大模型:从上线前检查开始讲

运维转大模型:从上线前检查开始讲

聊《运维转大模型,真正值钱的为什么不是会调 API?》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值…

2026/10/28 5:31:50 阅读更多 →
Kimi和qwen都有的混合注意力在海光 DCU 上如何运行:跟着一个 token 走一遍

Kimi和qwen都有的混合注意力在海光 DCU 上如何运行:跟着一个 token 走一遍

本文的实验对象是 Qwen3.5-27B,运行在一张海光 DCU 上:ISA 为 gfx936,具有 80 CU、64 GiB HBM 和 wave64 执行模型;推理框架为 赛事版 vLLM,基于 v0.18.1 修改。最近 Kimi K3 发布,2.8 万亿参数&#xff0c…

2026/10/28 18:05:22 阅读更多 →
RoboPOJOGenerator深度解析:支持GSON、Jackson、Lombok等8种框架的完整教程

RoboPOJOGenerator深度解析:支持GSON、Jackson、Lombok等8种框架的完整教程

RoboPOJOGenerator深度解析:支持GSON、Jackson、Lombok等8种框架的完整教程 【免费下载链接】RoboPOJOGenerator IntelliJ IDEA and Android Studio plugin 项目地址: https://gitcode.com/gh_mirrors/ro/RoboPOJOGenerator RoboPOJOGenerator是一款功能强大…

2026/10/28 18:05:30 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/28 23:48:14 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/28 7:28:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/28 9:02:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/28 22:10:30 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/28 9:00:54 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/28 7:29:02 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 16:58:40 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 9:01:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 19:25:09 阅读更多 →