HarmonyOS 项目中如何拆分共用层与形态模型

在 HarmonyOS(尤其是 HarmonyOS NEXT)应用开发中,“共用层”与“形态模型” 是实现“一次开发,多端部署”(一多能力)的关键工程实践。

官方和社区(包括华为开发者社区、CSDN、掘金等)普遍推荐采用 三层工程架构 来清晰拆分代码,使核心业务逻辑最大化复用,同时针对不同设备形态(手机、平板、折叠屏、PC、大屏、手表等)进行差异化适配。

下面是目前最主流、最推荐的拆分方式和实践指南。

三层工程架构(官方推荐 & 社区共识)

HarmonyOS 应用工程通常拆分成以下三层模块,从底层到上层依赖关系严格单向:

  1. 共用层 / 公共能力层(Common / Shared)
  • 定位:存放与设备形态完全无关的核心能力、业务无关的基础设施
  • 典型内容
    • 网络请求框架(HttpClient、Retrofit 风格封装)
    • 数据管理(数据库、KV存储、数据模型、Repository)
    • 工具类(日期、字符串、加密、日志、权限工具)
    • 通用组件(自定义控件、弹窗基类、Loading 状态管理)
    • 状态管理(全局 Store、事件总线)
    • 业务无关的常量、枚举、接口定义
    • 第三方库的二次封装(如果需要统一处理)
  • 依赖关系:无上层依赖,只被其他层依赖
  • 模块类型:通常是 LibraryShared 类型的 HAP / HSP
  • 关键原则“零形态感知” — 不能出现任何与屏幕尺寸、折叠、分屏、多窗口相关的代码
  1. 特性层 / 基础特性层(Feature / Business)
  • 定位:存放可复用的业务能力,实现核心功能逻辑,但尽量保持形态中立或弱形态感知
  • 典型内容
    • 页面/组件的业务逻辑(ViewModel、Controller)
    • 数据转换、业务规则、UseCase
    • 特定功能的完整模块(如登录、搜索、详情、列表、支付流程)
    • 可复用的 UI 组件组合(但不涉及具体布局)
  • 依赖关系:依赖共用层,可被产品层(不同形态)依赖
  • 模块类型:通常是 Feature 类型的 HAP
  • 关键原则高内聚、低耦合,尽量让业务逻辑不关心设备形态,只关心“做什么”
  1. 产品定制层 / 形态适配层(Product / Entry / Shape)
  • 定位:针对具体设备形态做差异化适配、UI 布局、交互、资源
  • 典型内容
    • 不同形态的入口模块(Entry 类型 HAP)
    • 响应式布局(Column、Row、Grid、媒体查询、断点布局)
    • 形态专属组件(分屏布局、多窗口、折叠屏适配、大屏导航)
    • 设备专属资源(drawable-480dpi、drawable-600dpi、布局变体)
    • 交互适配(手势、键盘、遥控器、触控笔)
    • 窗口模式(全屏、分屏、悬浮、自由窗)
  • 依赖关系:依赖共用层 + 特性层,不被其他层依赖
  • 模块类型:通常是多个 EntryFeature 模块,按形态拆分(如 phone、tablet、pc、foldable、watch)
  • 关键原则形态差异化隔离 — 只在这里写“怎么在当前设备上呈现和交互”

典型工程目录结构示例(HarmonyOS NEXT / Stage 模型)

MyApp (工程根目录)
├── common (共用层 - Library / Shared)
│   ├── src/main/ets
│   │   ├── network/          # 网络层
│   │   ├── repository/       # 数据仓库
│   │   ├── model/            # 数据模型
│   │   ├── utils/            # 工具类
│   │   └── components/       # 通用组件(不含布局)
│   └── ohos.build-profile.json5
├── features (特性层 - 多个 Feature 模块)
│   ├── feature-login/
│   ├── feature-home/
│   ├── feature-detail/
│   └── ... (按业务域拆分)
├── products (产品/形态层 - 多个 Entry)
│   ├── entry-phone/          # 手机形态入口
│   ├── entry-tablet/         # 平板形态
│   ├── entry-foldable/       # 折叠屏
│   ├── entry-pc/             # PC 大屏
│   └── entry-watch/          # 手表(如果支持)
└── build-profile.json5       # 整体构建配置

关键实践建议(避免常见坑)

  1. 共用层最严格的边界
  • 绝对不能出现 windowdisplaybreakpointfoldState 等形态相关 API
  • 不能 import 任何 UI 布局相关的类(Column、Row、Grid 等除非是纯逻辑组件)
  • 推荐:共用层只提供接口 + 数据模型 + 纯逻辑实现
  1. 形态层如何适配
  • 使用 响应式布局@ohos.displaymedia querybreakpointrelativeContainer
  • 使用 多窗口 APIwindowManagersystemBarfreeform
  • 资源限定符:resources/rawfile/phone/resources/rawfile/tablet/
  • 不同形态的路由表、导航栏、Tab 栏在这里定制
  1. 依赖管理
  • common → features → products(单向依赖)
  • 禁止反向依赖、循环依赖
  • 使用 HSP(静态共享包)或 HAR(Harmony Archive)共享 common 层
  1. 构建与打包
  • build-profile.json5 中配置多 Entry
  • 可以为不同形态生成不同 HAP(手机 HAP、平板 HAP)
  • 支持 按需部署(一个工程打多个形态的 App Pack,上架后云端分发)

官方 & 社区参考

  • 华为开发者联盟:一次开发,多端部署 文档中多次提到“三层工程架构”
  • 社区最佳实践(CSDN、掘金、知乎):绝大多数高赞文章都推荐 Common → Feature → Product 三层拆分
  • 典型案例:华为自研应用(如“玩机技巧”)就是采用这种分层,代码复用率提升 40% 左右

总结一句话:

共用层 解决“能做什么”(业务能力、数据、工具),形态模型 解决“在当前设备上怎么呈现和交互”(布局、导航、窗口、资源)。

通过三层拆分,你可以最大化复用核心代码,同时保持不同形态的灵活性和可维护性。

如果你有具体的业务模块或某个形态的适配痛点(比如折叠屏分屏、PC 多窗口、Watch 圆形屏),可以告诉我,我可以给出更细的拆分示例或代码结构建议。

文章已创建 4357

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部