鸿蒙原生开发学习(一)基本介绍

203 阅读6分钟

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的操作方式类似,有安卓开发经验的同学可直接上手。