UI框架
HarmonyOS 的UI开发框架叫ArkUI框架(方舟开发框架),ArkUI提供了两套开发范式,分别是基于ArkTS的声明式开发范式(简称“声明式开发范式”)和兼容JS的类Web开发范式(简称“类Web开发范式”)。
| 开发范式名称 | 语言生态 | UI更新方式 | 适用场景 | 适用人群 |
|---|---|---|---|---|
| 声明式开发范式 | ArkTS语言 | 数据驱动更新 | 复杂度较大、团队合作度较高的程序 | 移动系统应用开发人员、系统应用开发人员 |
| 类Web开发范式 | JS语言 | 数据驱动更新 | 界面较为简单的程序应用和卡片 | Web前端开发人员 |
推荐采用声明式开发范式来构建UI,主要基于以下几点考虑:
- 开发效率: 声明式开发范式更接近自然语义的编程方式,开发者可以直观地描述UI,无需关心如何实现UI绘制和渲染,开发高效简洁。(参考SwiftUI, Compose开发效率可以提升30%)
- 应用性能: 如下图所示,两种开发范式的UI后端引擎和语言运行时是共用的,但是相比类Web开发范式,声明式开发范式无需JS框架进行页面DOM管理,渲染更新链路更为精简,占用内存更少,应用性能更佳。
- 发展趋势:声明式开发范式后续会作为主推的开发范式持续演进,为开发者提供更丰富、更强大的能力。
- 学习成本:iOS的SwiftUI, Android的Compose, Flutter都是声明式UI, 有移动端开发经验的可以更快的适应。
应用模型
HarmonyOS先后提供了两种应用模型:
- FA(Feature Ability)模型: HarmonyOS API 7开始支持的模型,已经不再主推。
- Stage模型: HarmonyOS API 9开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。
文件目录
-
AppScope > app.json5:应用的全局配置信息。
-
entry:HarmonyOS工程模块,编译构建生成一个HAP包。
- src > main > ets:用于存放ArkTS源码。
- src > main > ets > entryability:应用/服务的入口。
- src > main > ets > pages:应用/服务包含的页面。
- src > main > resources:用于存放应用/服务所用到的资源文件,如图形、多媒体、字符串、布局文件等。
- src > main > module.json5:Stage模型模块配置文件。主要包含HAP包的配置信息、应用/服务在具体设备上的配置信息以及应用/服务的全局配置信息。
- build-profile.json5:当前的模块信息、编译信息配置项,包括buildOption、targets配置等。其中targets中可配置当前运行环境,默认为HarmonyOS。
- hvigorfile.ts:模块级编译构建任务脚本,开发者可以自定义相关任务和代码实现。
-
oh_modules:用于存放三方库依赖信息。
-
build-profile.json5:应用级配置信息,包括签名、产品配置等。
-
hvigorfile.ts:应用级编译构建任务脚本。
配置文件(Stage模型)
app.json5(应用的全局配置信息)
- 应用的全局配置信息,包含应用的包名、开发厂商、版本号等基本信息。
- 特定设备类型的配置信息。
{
"app": {
"bundleName": "com.application.myapplication", //标识应用的Bundle名称,用于标识应用的唯一性。
"vendor": "example",//标识对应用开发厂商的描述。
"versionCode": 1000000,//标识应用的版本号
"versionName": "1.0.0",//标识应用版本号的文字描述
"icon": "$media:app_icon",//应用的图标
"label": "$string:app_name",//应用名称
"description": "$string:description_application",//应用的描述信息
"minAPIVersion": 9,//应用运行需要的SDK的API最小版本
"targetAPIVersion": 9,//应用运行需要的API目标版本
"apiReleaseType": "Release",//应用运行需要的API目标版本的类型
"debug": false,//标识应用是否可调试
}
}
具体请参考:app.json5配置文件
module.json5(Module的基本配置信息)
- Module的基本配置信息,例如Module名称、类型、描述、支持的设备类型等基本信息。
- 应用组件信息,包含UIAbility组件和ExtensionAbility组件的描述信息。
- 应用运行过程中所需的权限信息。
{
"module": {
"name": "entry",//当前Module的名称
"type": "entry",//当前Module的类型, entry:应用的主模块。feature:应用的动态特性模块。
"description": "$string:module_desc",
"mainElement": "EntryAbility",//当前Module的入口UIAbility名称或者ExtensionAbility名称
"deviceTypes": [
"default",
"tablet"
],//当前Module可以运行在哪类设备上, tablet, car, wearable, phone,tv等
"deliveryWithInstall": true,//表示该Module对应的HAP是否跟随应用一起安装
"installationFree": false,//当前Module是否支持免安装特性
"pages": "$profile:main_pages",//当前Module的profile资源,用于列举每个页面信息
"virtualMachine": "ark",//当前Module运行的目标虚拟机类型
"metadata": [
{
"name": "string",//该标签标识数据项的键名称,
"value": "string",//该标签标识数据项的值,
"resource": "$profile:distributionFilter_config"//该标签标识定义用户自定义数据格式,标签值为标识该数据的资源的索引值。
}
],//当前Module的自定义元信息,
"abilities": [//当前Module中UIAbility的配置信息
{
"name": "EntryAbility",//当前UIAbility组件的名称
"srcEntry": "./ets/entryability/EntryAbility.ts",//该标签标识入口UIAbility的代码路径,
"description": "$string:EntryAbility_desc",
"icon": "$media:icon",//标识当前UIAbility组件的图标
"label": "$string:EntryAbility_label",//标识当前UIAbility组件对用户显示的名称
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"exported": true,//标识当前UIAbility组件是否可以被其他应用调用。
"launchType": "singleton", //标识当前UIAbility组件的启动模式
}
],
"requestPermissions": [//当前应用运行时需向系统申请的权限集合
{
"name": "ohos.abilitydemo.permission.PROVIDER",
"reason": "$string:reason",
"usedScene": {
"abilities": [
"FormAbility"
],
"when": "inuse"
}
}
]
}
}
具体请参考:module.json5配置文件
资源分类
resources目录包括三大类目录,一类为base目录,一类为限定词目录,还有一类为rawfile目录。stage模型多工程情况下共有的资源文件放到AppScope下的resources目录。
base目录默认存在,而限定词目录需要开发者自行创建。应用使用某资源时,系统会根据当前设备状态优先从相匹配的限定词目录中寻找该资源。只有当resources目录中没有与设备状态匹配的限定词目录,或者在限定词目录中找不到该资源时,才会去base目录中查找。rawfile是原始文件目录,不会根据设备状态去匹配不同的资源。
资源目录示例:
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文件中。文件名可自定义。
资源组目录
base目录与限定词目录下面可以创建资源组目录(包括element、media、profile),用于存放特定类型的资源文件。
| 资源组目录 | 目录说明 | 资源文件 |
|---|---|---|
| element | 表示元素资源,以下每一类数据都采用相应的JSON文件来表征(目录下只支持文件类型)。- boolean,布尔型- color,颜色- float,浮点型- intarray,整型数组- integer,整型- pattern,样式- plural,复数形式- strarray,字符串数组- string,字符串 | element目录中的文件名称建议与下面的文件名保持一致。每个文件中只能包含同一类型的数据。- boolean.json- color.json- float.json- intarray.json- integer.json- pattern.json- plural.json- strarray.json- string.json |
| media | 表示媒体资源,包括图片、音频、视频等非文本格式的文件(目录下只支持文件类型)。 | 文件名可自定义,例如:icon.png。 |
| profile | 表示自定义配置文件,其文件内容可通过包管理接口获取(目录下只支持文件类型)。 | 文件名可自定义,例如:test_profile.json。 |
开发工具
HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造,为运行在HarmonyOS和OpenHarmony系统上的应用和服务(以下简称应用/服务)提供一站式的开发平台。
和Android Studio的操作方式类似,有安卓开发经验的同学可直接上手。