目录

HarmonyOS系统架构及项目结构浅析

HarmonyOS系统架构及项目结构浅析

语雀知识库地址:

飞书知识库地址:


基本概念

UI框架

HarmonyOS提供了一套UI开发框架,即方舟开发框架( ArkUI 框架)。方舟开发框架可为开发者提供应用UI开发所必需的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等。

方舟开发框架针对不同目的和技术背景的开发者提供了两种开发范式,分别是基于ArkTS的声明式开发范式(简称“ 声明式开发范式 ”)和兼容JS的类Web开发范式(简称“ 类Web开发范式 ”)。以下是两种开发范式的简单对比。

开发范式名称语言生态UI更新方式适用场景适用人群
声明式开发范式ArkTS语言数据驱动更新复杂度较大、团队合作度较高的程序移动系统应用开发人员、系统应用开发人员
类Web开发范式JS语言数据驱动更新界面较为简单的程序应用和卡片Web前端开发人员

应用模型

应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。有了应用模型,开发者可以基于一套统一的模型进行应用开发,使应用开发更简单、高效。

随着系统的演进发展,HarmonyOS先后提供了两种应用模型:

  • FA(Feature Ability)模型: HarmonyOS API 7开始支持的模型,已经不再主推。FA模型开发可见 。
  • Stage模型(推荐): HarmonyOS API 9开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。Stage模型开发可见 。

FA模型和Stage模型的整体架构和设计思想等更多区别,请见 。

Stage 模型

基于Stage模型开发的应用,经编译打包后,其应用程序包结构如下图所示

  • 在开发态,一个应用包含一个或者多个Module,可以在DevEco Studio工程中创建一个或者多个Module。
  • Module是HarmonyOS应用 / 服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。
  • Module分为“ Ability ”和“ Library ”两种类型
    • “Ability”类型的Module对应于编译后的HAP(Harmony Ability Package);
    • “Library”类型的Module对应于 (Harmony Archive),或者 (Harmony Shared Package)。一个Module可以包含一个或多个 组件,如下图所示。
  • https://i-blog.csdnimg.cn/blog_migrate/d789a8bb1a1d4346624d9d75c591cae5.png
  • 这里介绍到的Module默认指的是“ Ability ”类型的Module。
  • 我们通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件,即HAP。HAP是HarmonyOS应用安装的基本单位,包含了编译后的代码、资源、三方库及配置文件。HAP可分为Entry和Feature两种类型。
    • Entry类型的HAP:是应用的主模块,在module.json5配置文件中的type标签配置为“entry”类型。在同一个应用中,同一设备类型只支持一个Entry类型的HAP,通常用于实现应用的入口界面、入口图标、主特性功能等。
    • Feature类型的HAP:是应用的动态特性模块,在module.json5配置文件中的type标签配置为“feature”类型。一个应用程序包可以包含一个或多个Feature类型的HAP,也可以不包含;Feature类型的HAP通常用于实现应用的特性功能,可以配置成按需下载安装,也可以配置成随Entry类型的HAP一起下载安装
  • 每个HarmonyOS应用可以包含多个**.hap 文件,一个应用中的.hap文件合在一起称为一个Bundle,而bundleName就是应用的唯一标识。需要注意的是:在应用上架到应用市场时,需要把应用包含的所有.hap文件(即Bundle)打包为一个 .app**后缀的文件用于上架,这个.app文件称为App Pack(Application Package),其中同时包含了描述App Pack属性的pack.info文件;在云端(服务器)分发和终端设备安装时,都是以HAP为单位进行分发和安装的。
  • 打包后的HAP包结构包括 ets、libs、resources 等文件夹和 resources.index、module.json、pack.info 等文件。
    • ets目录用于存放应用代码编译后的字节码文件。
    • libs目录用于存放库文件。库文件是HarmonyOS应用依赖的第三方代码(.so二进制文件)。
    • resources目录用于存放应用的资源文件(字符串、图片等),便于开发者使用和维护。
    • resources.index是资源索引表,由IDE编译工程时生成。
    • module.json是HAP的配置文件,内容由工程配置中的module.json5和app.json5组成,该文件是HAP中必不可少的文件。IDE会自动生成一部分默认配置,开发者按需修改其中的配置。
    • pack.info是Bundle中用于描述每个HAP属性的文件,例如app中的bundleName和versionCode信息、module中的name、type和abilities等信息,由IDE工具生成Bundle包时自动生成。

https://i-blog.csdnimg.cn/blog_migrate/8fce5caa3374f5e1e546a004d3035eb7.png

FA 模型

基于FA模型开发的应用,其应用程序包结构如下图所示。

FA模型与Stage模型不同之处在于HAP内部文件存放位置不同,FA模型将所有的资源文件、库文件和代码文件都放在assets文件夹中,在文件夹内部进一步区分。

  • config.json是应用配置文件,IDE会自动生成一部分模块代码,开发者按需修改其中的配置。详细字段请参见应用配置文件。
  • assets是HAP所有的资源文件、库文件和代码文件的集合,内部可以分为entry和js文件夹。entry文件夹中存放的是resources目录和resources.index文件。
  • resources目录用于存放应用的资源文件(字符串、图片等),便于开发者使用和维护。
  • resources.index是资源索引表,由IDE调用SDK工具生成。
  • js文件夹中存放的是编译后的代码文件。
  • pack.info是Bundle中用于描述每个HAP属性的文件,例如app中的bundleName和versionCode信息、module中的name、type和abilities等信息,由IDE工具生成Bundle包时自动生成。

https://i-blog.csdnimg.cn/blog_migrate/a69552c86101458e159edf716cc809a5.png

HarmonyOS项目结构

一个 HarmonyOS 项目的目录结构如下

https://i-blog.csdnimg.cn/blog_migrate/8703b3e48686147de3c446c256e024ba.png

其中详细如下:

  • AppScope中存放应用全局所需要的资源文件。
  • entry是应用的主模块,存放HarmonyOS应用的代码、资源等。
  • oh_modules是工程的依赖包,存放工程依赖的源文件。
  • build-profile.json5是工程级配置信息,包括签名、产品配置等。
  • hvigorfile.ts是工程级编译构建任务脚本,hvigor是基于任务管理机制实现的一款全新的自动化构建工具,主要提供任务注册编排,工程模型管理、配置管理等核心能力。
  • oh-package.json5是工程级依赖配置文件,用于记录引入包的配置信息。

在AppScope,其中有resources文件夹和配置文件app.json5。AppScope>resources>base中包含element和media两个文件夹,

  • 其中element文件夹主要存放公共的字符串、布局文件等资源。
  • media存放全局公共的多媒体资源文件。

https://i-blog.csdnimg.cn/blog_migrate/2ef9cade002fa28a705d4e3bff2d077c.png

模块级目录

https://i-blog.csdnimg.cn/blog_migrate/d250fbc4f16e4330d68986a4e82d08e6.png

entry>src 目录中主要包含总的 main 文件夹,单元测试目录 ohosTest ,以及模块级的配置文件。

  • main文件夹中,ets文件夹用于存放ets代码,resources文件存放模块内的多媒体及布局文件等,module.json5文件为模块的配置文件。
  • ohosTest是单元测试目录。
  • build-profile.json5是模块级配置信息,包括编译构建配置项。
  • hvigorfile.ts文件是模块级构建脚本。
  • oh-package.json5是模块级依赖配置信息文件。

进入 src>main>ets 目录中,其分为 entryability 、**pages **两个文件夹。

  • entryability存放ability文件,用于当前ability应用逻辑和生命周期管理。
  • pages存放UI界面相关代码文件,初始会生成一个Index页面。

https://i-blog.csdnimg.cn/blog_migrate/8a7061ca56351ec6da4904ac1a6ad7b0.png

resources 目录下存放模块公共的多媒体、字符串及布局文件等资源,分别存放在element、media文件夹中。

https://i-blog.csdnimg.cn/blog_migrate/0a930ff41134ddcb8b37c28277a967be.png

app.json5

AppScope>app.json5 是应用的全局的配置文件,用于存放应用公共的配置信息。

https://i-blog.csdnimg.cn/blog_migrate/c68fa16543804d169a8ec374fecc54f7.png

其中配置信息如下:

  • bundleName是包名。
  • vendor是应用程序供应商。
  • versionCode是用于区分应用版本。
  • versionName是版本号。
  • icon对应于应用的显示图标。
  • label是应用名。

module.json5

entry>src>main>module.json5是模块的配置文件,包含当前模块的配置信息。

https://i-blog.csdnimg.cn/blog_migrate/4047c94795eb085e6e3238a3b48541ef.png

其中module对应的是模块的配置信息,一个模块对应一个打包后的hap包,hap包全称是HarmonyOS Ability Package,其中包含了ability、第三方库、资源和配置文件。

module.json5默认配置属性及描述

https://i-blog.csdnimg.cn/blog_migrate/2ed5be9baa0ad56bceb71311d250d2da.png

main_pages.json

**src/main/resources/base/profile/main_pages.json **文件保存的是页面page的路径配置信息,所有需要进行路由跳转的page页面都要在这里进行配置。

https://i-blog.csdnimg.cn/blog_migrate/18a4ea5d7102aa996796869ef3ff0d9f.png