鸿蒙工程结构简单介绍
鸿蒙提供一套自研的完整UI开发框架ArkUI框架,为开发者提供应用UI开发所必须的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等等。 使用ArkTS语言,声明式开发范式。
通过第一个hello world工程(鸿蒙的学习资料放在最后,有需要的自取)。我们一起来看一下鸿蒙的程序架构。
App架构
新App都是以Stage模型架构进行设计的。 可以尝试构建第一个ArkTS应用 下图是官方提供的Stage模型概念图:
工程结构
工程结构图:
Stage模型的工程主要包含三种文件类型: 1,配置文件 2,ArkTS源码文件 3,资源文件
下面分别针对三种类型文件介绍:
配置文件
AppScope
AppScope目录由DevEco Studio自动生成的配置文件,是应用全局的资源文件。 其中:
- resources文件夹和应用及配置文件 app.json5
- base/element文件夹下主要存放公共的字符串、布局文件,base/media文件夹下存放全局公共的多媒体资源文件,如icon就是存放在该目录下。
- app.json5是应用级配置文件,用于声明应用的全局配置信息,如bundleName、版本信息、应用名称等都是在该文件中进行配置。
oh-package.json5
oh-package.json5分为工程级文件和模块级文件。
- 工程级文件位于工程根目录下,主要用来描述全局配置,如:依赖覆盖(overrides)、依赖关系重写(overrideDependencyMap)和参数化配置(parameterFile)等。
- 模块级文件位于各个模块的根目录下,用来描述包名、版本、入口文件(类型声明文件)和依赖项等信息。
当使用ohpm install一个库时,如 ohpm install @ohos/lottie ,成功install后版本信息会出现在oh-package.json5中,如图:
其中parameterFile为参数化配置文件路径,可将配置信息单独写一个文件。 模块级的HAR包发布到OpenHarmony三方库时,必须包含oh-package.json5文件,以描述当前包基本信息。
build-profile.json5
build-profile.json5也分为工程级和模块级的配置文件,其中buildOption在工程级文件和模块级文件均可配置,其中相同字段以模块级字段为准,不同字段模块级的buildOption配置会继承工程级配置。配置包括:签名、产品品类(可配置多个App)、构建模式(debug、release)、模块信息(本地模块可以直接配置path)等。 配置多目标产物也是在此处进行配置。
oh_modules
oh_modules是工程的依赖包也分工程级和模块级,用于存放工程依赖的源文件。如上install了一个三方库@ohos/lottie,在oh_modules中展示如下:
hvigor脚本文件
hvigor是一个脚本文件,用来完成插件、任务以及生命周期hook的注册。
- hvigorfile.ts每个node下都有一份,是构建的必须文件,在此文件中可以注册插件、任务以及生命周期hook等操作。
- hvigorconfig.ts此文件在整个项目中只有根目录下存在一份,不是构建必须的文件并且默认不存在,如有需要可自行创建,此文件被解析执行的时间比较早,可用于在hvigor生命周期刚开始时操作某些数据。
提供hvigor-config.json5文件,以指定hvigor的版本、构建依赖以及构建行为的配置参数。hvigor是基于任务管理机制实现的一个自动化构建工具,主要提供任务注册编排,工程模型管理、配置管理等核心能力。
sign
签名鸿蒙当中的签名类似iOS,需要账号与设备绑定才能联调。在DevEco Studio,菜单选择“File > Project Structure”,进入“Project Structure”界面。
签名文件信息的读取路径在build-profile.json5当中,可以将签名信息单独存放到一个公共目录中方便读取和修改。
源码文件
app | entry
entry目录由DevEco Studio自动生成,也可以自定义。一般的app而言,该模块是应用的主模块,用于存放源码文件,应用级资源文件、各种配置文件等。从截图中可以看到oh-package.json5、hvigorfile.ts、build-profile.json5等配置文件在模块级同样存在。另外,module.json5是模块级配置文件:
module.json5
module.json5是entry模块级别的配置文件,包含了
- Module的基本配置信息,包含Module名称、类型、描述、支持的设备类型等基本信息
- 应用组件信息,包含UIAbility组件和ExtensionAbility组件的描述信息。
- 应用运行过程中所需的权限信息。
例如module.json5里的type类型的定义,标识当前Module的类型。entry:应用的主模块。feature:应用的动态特性模块。har:静态共享包模块;shared:动态共享包模块。项目里的feature和app目录下的type类型都是entry类型,而feature的library目录下的type类型则是har类型。
EntryAbility.ets
EntryAbility.ets为整个应用程序的入口文件,可在module.json5中进行配置:
因为windowStage和UIAbility是1:1持有的,在创建完windowStage的回调中进行初始化第一个页面:
windowStage和UIAbility声明周期变化如图:
Index.ets
Index为默认的第一个页面,可以在该页面中进行开发应用程序。
feature
feature目录实际上就是将每个功能模块作为一个独立的Mudule进行开发,存放的是各个业务模块。每个feature可以包含代码、资源文件、三方库、配置文件等,每一个Module可以独立编译。为了实现整个app的代码和资源共用,每个feature抽出一层library作为共享包,当前应用时基于静态共享包(har)实现的代码复用。
资源文件
resources目录
应用中开发使用的各类资源文件,需要放入特定子目录中存储管理,也就是resources目录。资源目录如下:
resources
|---base
| |---element
| | |---string.json
| |---media
| | |---icon.png
| |---profile
| | |---test_profile.json
|---en_US // 默认存在的目录,设备语言环境是美式英文时,优先匹配此目录下资源
| |---element
| | |---string.json
| |---media
| | |---icon.png
| |---profile
| | |---test_profile.json
|---zh_CN // 默认存在的目录,设备语言环境是简体中文时,优先匹配此目录下资源
| |---element
| | |---string.json
| |---media
| | |---icon.png
| |---profile
| | |---test_profile.json
|---en_GB-vertical-car-mdpi // 自定义限定词目录示例,由开发者创建
| |---element
| | |---string.json
| |---media
| | |---icon.png
| |---profile
| | |---test_profile.json
|---rawfile // 其他类型文件,原始文件形式保存,不会被集成到resources.index文件中。文件名可自定义。
|---resfile // 其他类型文件,原始文件形式保存,不会被集成到resources.index文件中。文件名可自定义。
main_pages.json
其中的main_pages.json是配置支持路由页面的,该配置是通过module.json5进行配置的。
鸿蒙的差异
ArkTS吸取了很多高级语言当中的概念以及设计的优点,很方便开发者进行开发。
ArkUI是声明式的,通过状态管理的方式监听数据变化。
ArkUI无法继承,不能像iOS和Android一样抽取一些公共能力官方提供了较为全面的组件能力,但想自己定一些能力的话会相对比较难。
鸿蒙中吸取了iOS与Android平台上的优点并改进,比如iOS的签名方式,App的分发等,Android当中的Ability、Window等概念,以及用户的操作习惯如左滑右滑等。
鸿蒙学习相关资源
HarmonyOS第一课https://developer.huawei.com/consumer/cn/teaching-video/
开发者学堂:https://developer.huawei.com/consumer/cn/training/
TS学习:https://wangdoc.com/typescript/
官方文档:https://developer.huawei.com/consumer/cn/doc/
官方论坛:https://developer.huawei.com/consumer/cn/forum/
官方issue:<https://issuereporter.developer.huawei.com/overview>
开发工具下载:https://developer.huawei.com/consumer/cn/deveco-studio/