HarmonyOS 应用开发入门
HarmonyOS 应用开发入门
前言
DevEco Studio Release版本为:DevEco Studio 3.1.1。
Compile SDK Release版本为:3.1.0(API 9)。
构建方式为 HVigor,而非 Gradle。
最新版本已不再支持 (”Java、JavaScript” 、“类Web开发范式” 和 “FA 模型” )用于应用开发,因此大部分举例都以 (“ArkTS声明式范式” 和 “Stage 模型”)最新内容为基础。
现有的 UI 框架
HarmonyOS 提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。方舟开发框架可为开发者提供应用UI开发所必需的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等。
方舟开发框架针对不同目的和技术背景的开发者提供了两种开发范式,分别是基于ArkTS的声明式开发范式(简称“声明式开发范式”)和兼容JS的类Web开发范式(简称“类Web开发范式”)。
在目前最新IDE版本中,已不再支持“类Web开发范式”创建应用。
声明式开发范式:采用基于 TypeScript 声明式 UI 语法扩展而来的 ArkTS 语言,从组件、动画和状态管理三个维度提供 UI 绘制能力。
类Web开发范式:采用经典的 HML、CSS、JavaScript 三段式开发方式,即使用 HTML 标签文件搭建布局、使用 CSS 文件描述样式、使用 JavaScript 文件处理逻辑。该范式更符合于Web前端开发者的使用习惯,便于快速将已有的Web应用改造成方舟开发框架应用。
以下是两种开发范式的简单对比:
ArkTS 的概念
ArkTS围绕应用开发在 TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。
ArkTS 是 HarmonyOS 优选的主力应用开发语言(早期版本支持 Java和JS,现已不再支持了)。所以,具备TS语言开发能力的开发者学习起来会更容易。
当前,ArkTS在TS的基础上主要扩展了如下能力:
- **基本语法:**ArkTS定义了声明式UI描述、自定义组件和动态扩展UI元素的能力,再配合ArkUI开发框架中的系统组件及其相关的事件方法、属性方法等共同构成了UI开发的主体。
- **状态管理:**ArkTS提供了多维度的状态管理机制。在UI开发框架中,与UI相关联的数据可以在组件内使用,也可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,还可以在应用全局范围内传递或跨设备传递。另外,从数据的传递形式来看,可分为只读的单向传递和可变更的双向传递。开发者可以灵活的利用这些能力来实现数据和UI的联动。
- **渲染控制:**ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,渲染对应状态下的UI内容。循环渲染可从数据源中迭代获取数据,并在每次迭代过程中创建相应的组件。数据懒加载从数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。
未来,ArkTS会结合应用开发/运行的需求持续演进,逐步提供并行和并发能力增强、系统类型增强、分布式开发范式等更多特性。
HarmonyOS支持的应用模型介绍
HarmonyOS 应用有两种模型,分别是 FA(Feature Ability)模型和Stage模型。通过这两种模型可以构建出以下三种应用 :
FA模型
- ArkTS应用(过时)
- JS应用(最新版IDE已不再支持)
Stage模型
- ArkTS应用(推荐)
应用模型的演进
API 4-8 仅支持FA模型,API 9 后新增 Stage模型,是目前主推且会长期演进的模型,FA 暂时保留但不推荐。
Stage模型的优点
- 为复杂应用而设计
- 支持多设备和多窗口形态
- 平衡应用能力和系统管控成本
对比传统FA模型和Stage模型
传统的FA模型设计更偏向传统原生,Stage模型则提供了更好的扩展能力,和更适用于Harmony生态的使用场景。
IDE工具和开发工程相关介绍
开发工具为:DevEco Studio,基于 IntelliJ IDEA Community 开源版。
在开发态,一个应用工程包含一个或者多个子工程(Module),可以在 DevEco Studio 工程中创建一个或者多个Module。Module是HarmonyOS应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。
工程类型
- Application:也就是本文介绍的需要安装且会在桌面创建图标的应用开发
- Atomic Service:不需要安装的原子服务,不在本文应用开发范畴
子工程类型
- Module 分为 “Ability”(默认)和 “Library(共享库)” 两种类型。
- “Ability” 类型的 Module 对应于编译后的 HAP(Harmony Ability Package);
- “Library” 类型的 Module 对应于静态共享库 HAR(Harmony Archive),或者动态共享库 HSP(Harmony Shared Package)。
创建应用面板
工程目录结构介绍(Stage 模型的 ArkTS 应用)
- 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包的配置信息、应用/服务在具体设备上的配置信息以及应用/服务的全局配置信息。具体的配置文件说明,详见module.json5配置文件。
- build-profile.json5:当前的模块信息、编译信息配置项,包括buildOption、targets配置等。其中targets中可配置当前运行环境,默认为HarmonyOS。
- hvigorfile.ts:模块级编译构建任务脚本,开发者可以自定义相关任务和代码实现。
- oh_modules:用于存放三方库依赖信息。关于原npm工程适配ohpm操作,请参考历史工程迁移。
- build-profile.json5:应用级配置信息,包括签名、产品配置等。
- hvigorfile.ts:应用级编译构建任务脚本。
构建后的应用程序包介绍
HAP的两种类型
通过 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一起下载安装。
Bundle的概念
每个HarmonyOS应用可以包含多个.hap文件,一个应用中的.hap文件合在一起称为一个Bundle,而 bundleName 就是应用的唯一标识(请参见 app.json5 配置文件中的 bundleName 标签)。需要特别说明的是:在应用上架到应用市场时,需要把应用包含的所有.hap文件(即Bundle)打包为一个 .app 后缀的文件用于上架,这个.app文件称为 App Pack(Application Package),其中同时包含了描述App Pack属性的 pack.info 文件;在云端(服务器)分发和终端设备安装时,都是以HAP为单位进行分发和安装的。
多HAP使用规则
- App Pack包不能直接安装到设备上,只是上架应用市场的单元。
- App Pack包中所有HAP的配置文件中的 bundleName 标签必须一致。
- App Pack包中所有HAP的配置文件中的 versionCode 标签必须一致。
- App Pack包中同一设备类型的所有HAP中必须有且只有一个entry类型的HAP,feature类型的HAP可以有一个或者多个,也可以没有。
- App Pack包中的每个HAP必须配置 moduleName 标签,同一设备类型的所有HAP对应的 moduleName 标签必须唯一。
- 同一应用的所有HAP签名证书要保持一致。上架应用市场是以App Pack的形式上架,并对其进行了签名。应用市场分发时会将所有HAP从App Pack中拆分出来,同时对其中的所有HAP进行重签名,这样保证了所有HAP签名证书的一致性。在调试阶段,开发者通过命令行或IDE将HAP安装到设备上时要保证所有HAP签名证书一致,否则会出现安装失败的问题。
程序包内目录结构介绍(Stage 模型的 ArkTS 应用)
打包后的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包时自动生成。
共享库
OpenHarmony 提供了两种共享包,HAR(Harmony Archive)静态共享包,和 HSP(Harmony Shared Package)动态共享包。共享库不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
HAR 与 HSP 都是为了实现代码和资源的共享,都可以包含代码、C++库、资源和配置文件,最大的不同之处在于:
-
HAR 中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝。
-
HSP 中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。
HSP旨在解决HAR存在的几个问题:
- 多个 HAP 引用相同的 HAR,导致的 APP 包大小膨胀问题。
- 多个 HAP 引用相同的 HAR,HAR 中的一些状态变量无法共享的问题。
HSP的一些约束:
- HSP 及其使用方都必须是 Stage 模型。
- HSP 及其使用方都必须使用 esmodule 编译模式。
- HSP 不支持在配置文件中声明 abilities、extensionAbilities 标签。
- HSP 按照使用场景可以分为应用内 HSP 和应用间 HSP,应用间 HSP 暂不支持。
- 应用内 HSP 跟随其宿主应用的 APP 包一起发布,与该宿主应用具有相同的包名和生命周期。
结语
鸿蒙的整个开发套件第一个版本刚发布时比其他平台显得有些粗糙,而且无论是开发形式、API的设计、手机系统的设计和交互都参考了 Android,快速发展的这几年逐步脱离,蜕变得更为个性了。Java 和 JS 都从 Ark 套件里淡出视野了,我记得最开始都还和 Android 一样用 xml 写布局,现在的版本稳定使用 eTS,抛弃命令式拥抱声明式。
最新版本的 DevEco Studio,构建工具 Hvigor 比 Android Studio 的 Gradle 速度快很多,经历几年后对比刚开始的两个版本体验提升明显。个人总结了鸿蒙开发以下几点体验结果:
- 开发工具基于 IntelliJ IDEA Community 开源版,对长期用 JetBrains 家族工具的人无缝衔接好上手,同时也做出了一些差异化的体验
- IDE 内集成了官方的开发教程、文档、QA,代码示例完整可以直接copy运行,可以更方便查找一些文档,比较好的还有可以直接调起工具内的各种功能
- 对代码高亮、提示、自定义折叠处理得很好,但是工程结构感觉还能再优化,配置文件还是稍显繁琐,尤其是多 Module的情况(说到配置文件,JSON内也支持注释和提示很不错,不过会比较依赖工具,换个编辑器浏览文件体验会大打折扣)
- 从开发工具到 SDK、Tools、本地模拟器的整个安装过程很顺很快。新版本的构建工具从 Gradle 换成了 Hvigor 后,新建项目和编译构建速度快得飞起,又想吐槽一下 Android Studio 默认下载一大堆依赖的糟糕体验,当然这个也跟鸿蒙本身起步不久,吸取了经验做好了各种版本和依赖库管理有关
- 低代码工具直接集成进IDE里了,而且可以和代码编辑器切换使用,比传统的拖拽式布局好用
- 文档方面,全本地化中文的文档看起来非常轻松,内容排版也更符合国人的阅读习惯,不过官方的视频课程内容稍微有一点落后,反正不是最新的内容,估计新版本内容正在制作,学习还是建议看开发文档。
相关文章:

HarmonyOS 应用开发入门
HarmonyOS 应用开发入门 前言 DevEco Studio Release版本为:DevEco Studio 3.1.1。 Compile SDK Release版本为:3.1.0(API 9)。 构建方式为 HVigor,而非 Gradle。 最新版本已不再支持 (”Java、JavaScrip…...

【机器学习300问】9、梯度下降是用来干嘛的?
当你和我一样对自己问出这个问题后,分析一下!其实我首先得知道梯度下降是什么,也就它的定义。其次我得了解它具体用在什么地方,也就是使用场景。最后才是这个问题,梯度下降有什么用?怎么用? 所以…...

第13章 1 进程和线程
文章目录 程序和进程的概念 p173函数式创建子进程Process类常用的属性和方法1 p175Process类中常用的属性和方法2 p176继承式创建子进程 p177进程池的使用 p178并发和并行 p179进程之间数据是否共享 p180队列的基本使用 p180使用队列实现进程之间的通信 p182函数式创建线程 p18…...

什么是中间件?
文章目录 为什么需要中间件?中间件生态漫谈数据库中间件读写分离分库分表引进数据库中间件MyCat 服务端代理模式ShardingJDBC 客户端代理模式 总结 IT 系统从单体应用逐渐向分布式架构演变,高并发、高可用、高性能、分布式等话题变得异常火热,…...

汽车售后服务客户满意度调查报告
本文由群狼调研(长沙旅行社满意度调查)出品,欢迎转载,请注明出处。汽车售后服务客户满意度调查报告通常包括以下内容: 1.调研概况:介绍调研的目的、背景和范围,包括调研的时间、地点和样本规模等…...

初始RabbitMQ(入门篇)
消息队列(MQ) 本质上就是一个队列,一个先进先出的队列,队列中存放的内容是message(消息),是一种跨进程的通信机制,用于上下游传递消息, 为什么使用MQ: 削峰填谷: MQ可以很好的做一个缓冲机制,例如在一个系统中有A和B两个应用,A是接收用户的请求的,然后A调用B进行处理. 这时…...

JVM:Java类加载机制
Java类加载机制的全过程: 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始, 这是为了支持Java…...

要经历痛苦,才能在赚钱路上觉醒!
新手赚钱,一个秘诀就够了! 黎明前的黑暗实际是最漫长的,就如同开发进度99%到100%这个过程尤其漫长。赚钱的路上起初就是黑暗,不断地摸索最终才能走出迷雾,真正的迎接朝阳。如果有一段路程,十来公里的路线&a…...

LeetCode 第381场周赛个人题解
目录 100191. 输入单词需要的最少按键次数 I 原题链接 题目描述 思路分析 AC代码 100188. 按距离统计房屋对数目 I 原题链接 题目描述 思路分析 AC代码 100192. 输入单词需要的最少按键次数 II 原题链接 题目描述 思路分析 AC代码 100213. 按距离统计房屋对数目…...

数据结构之二叉树的性质与存储结构
数据结构之二叉树的性质与存储结构 1、二叉树的性质2、二叉树的存储结构 数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,…...

机器视觉检测设备在连接器外观缺陷检测中的应用
作为传输电流或信号连接两个有源器件的器件,连接器被广泛应用于各个行业,从手机、平板、电脑,到冰箱、空调、洗衣机,再到汽车、国防、航空,处处是它的所在。每个电子产品少了连接器将无法运作,因此…...

ChatGPT vs 文心一言(AI助手全面比较)
随着人工智能的不断发展,ChatGPT(OpenAI)和文心一言都代表了当前先进的自然语言处理技术。它们在智能回复、语言准确性和知识库丰富度等方面都有各自的优势。在下面的比较中,我们将从多个角度探讨这两个AI助手,帮助你更…...

MSPM0L1306例程学习-UART部分(2)
MSPM0L1306例程学习系列 1.背景介绍 写在前边的话: 这个系列比较简单,主要是围绕TI官网给出的SDK例程进行讲解和注释。并没有针对模块的具体使用方法进行描述。所有的例程均来自MSPM0 SDK的安装包,具体可到官网下载并安装: https://www.ti…...

Baichuan2百川模型部署的bug汇总
1.4bit的量化版本最好不要在Windows系统中运行,大概原因报错原因是bitsandbytes不支持window,bitsandbytes-windows目前仅支持8bit量化。 2. 报错原因是机器没有足够的内存和显存,offload_folder设置一个文件夹来保存那些离线加载到硬盘的权…...

ChatGPT 如何解决 “Something went wrong. lf this issue persists ….” 错误
Something went wrong. If this issue persists please contact us through our help center at help.openai.com. ChatGPT经常用着用着就出现 “Something went wrong” 错误,不管是普通账号还是Plus账号,不管是切换到哪个节点,没聊两次就报…...

怎么移除WordPress后台工具栏的查看站点子菜单?如何改为一级菜单?
默认情况下,我们在WordPress后台想要访问前端网站,需要将鼠标移动到左上角的站点名称,然后点击下拉菜单中的“查看站点”才行,而且还不是新窗口打开。那么有没有办法将这个“查看站点”子菜单变成一级菜单并显示在顶部管理工具栏中…...

WEB-前端 表格标签-合并单元格
目录 合并单元方式 : 跨行合并 : 跨列合并 : 目标单元格 : 跨行的话 跨列的话 合并的步骤 : 跨行合并 : 跨列合并 : 特殊情况下,可以把多个单元格合并为一个单元格,我们呢先…...

[计算机网络]基本概念
目录 1.ip地址和端口号 1.1IP地址 1.2端口号 2.认识协议 2.1概念: 2.2知名协议的默认端口 3.五元组 4.协议分层 4.1分层的作用 4.2OSI七层模型 4.3TCP/IP五层(四层)模型 编辑4.4网络设备对应的分层: 编辑以下为跨…...

Flutter 综述
Flutter 综述 1 介绍1.1 概述1.2 重要节点1.3 移动开发中三种跨平台框架技术对比1.4 flutter 技术栈1.5 IDE1.6 Dart 语言1.7 应用1.8 框架 2 Flutter的主要组成部分3 资料书籍 《Flutter实战第二版》Dart 语言官网Flutter中文开发者社区flutter 官网 4 搭建Flutter开发环境参考…...

Pixels:重新定义游戏体验的区块链农场游戏
数据源:Pixels Dashboard 作者:lesleyfootprint.network 最近,Pixels 通过从 Polygon 转移到 Sky Mavis 旗下的 Ronin 网络,完成了一次战略性的转变。 Pixels 每日交易量 Pixels 在 Ronin 网络上的受欢迎程度急剧上升…...

【JavaEE】文件操作 —— IO
文件操作 —— IO 1. 文件的属性 文件内容文件大小文件路径文件名称 2. 文件的管理 采用树形结构进行管理。 3. 文件路径 分为两种:相对、绝对路径。 相对路径:相对于当前位置的路径,以“./xxx.xxx”为标志绝对路径:以从盘符…...

推荐新版AI智能聊天系统网站源码ChatGPT NineAi
Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代…...

学生公寓智能控电系统的重要性
学生公寓智能控电系统石家庄光大远通电气有限公司学生宿舍内漏电,超负荷用电,违规用电等现象一直是困扰后勤管理的普遍问题。随着学生日常生活方式以及生活用品的改变,电脑以及各种电器逐渐的普及,导致用电量与日俱增,…...

使用Scrapy 爬取“http://tuijian.hao123.com/”网页中左上角“娱乐”、“体育”、“财经”、“科技”、历史等名称和URL
一、网页信息 二、检查网页,找出目标内容 三、根据网页格式写正常爬虫代码 from bs4 import BeautifulSoup import requestsheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/53…...

2018年认证杯SPSSPRO杯数学建模D题(第二阶段)投篮的最佳出手点全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 D题 投篮的最佳出手点 原题再现: 影响投篮命中率的因素不仅仅有出手角度、球感、出手速度,还有出手点的选择。规范的投篮动作包含两膝微屈、重心落在两脚掌上、下肢蹬地发力、身体随之向前上方伸展、同时抬肘向投篮方向…...

软件资源管理下载系统全新带勋章功能 + Uniapp前端
测试环境:php7.1。ng1.2,MySQL 5.6 常见问题: 配置好登录后转圈圈,检查环境及伪静态以及后台创建好应用 上传图片不了,检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图,在前端uitl文件…...

高性能前端UI库 SolidJS | 超棒 NPM 库
SolidJS是一个声明式的、高效的、编译时优化的JavaScript库,用于构建用户界面。它的核心特点是让你能够编写的代码既接近原生JavaScript,又能够享受到现代响应式框架提供的便利。 SolidJS的设计哲学强调了性能与简洁性。它不使用虚拟DOM(Vir…...

聊聊PowerJob的AliOssService
序 本文主要研究一下PowerJob的AliOssService DFsService tech/powerjob/server/extension/dfs/DFsService.java public interface DFsService {/*** 存储文件* param storeRequest 存储请求* throws IOException 异常*/void store(StoreRequest storeRequest) throws IOEx…...

【VRTK】【Unity】【PICO】PICO项目打包后闪退的根本原因
【背景】 一开始打包运行好好的PICO项目,中途用Preview模式开发了一阵后,再次打包就闪退了。 【分析】 项目设置没有动过,那么可能是Preview开发过程中引入的包导致的问题。 【答案】 千万不要在PICO项目中导入Oculus包。我原本想用一些…...

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(21)
接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(20) 2.4 PCI总线的配置 PCI总线定义了两类配置请求,一个是Type 00h配置请求,另一个是Type 01h配置请求。PCI总线使用这些配置请求…...