跳到主要内容

第一章:开发环境搭建

本章配套代码:code/Chapter1 对应技术栈:DevEco Studio 2026 + API 26 + HarmonyOS 7.0 + 状态管理(第一章 V1 入门,第二章起 V2)

1.1 学习目标

  • 了解 HarmonyOS 应用开发的基本概念与生态
  • 掌握 DevEco Studio 2026 的安装、配置与工程结构
  • 创建并运行第一个 HarmonyOS 应用
  • 熟悉 DevEco Studio 常用快捷键与实时模板配置
  • 完成经典页面跳转案例(两页面 + router 跳转/返回,官网入门写法)
  • 认识声明式 UI 的基本形态(第一章 V1 入门,第二章起 V2)

1.2 HarmonyOS 概述

HarmonyOS 是华为自主研发的面向万物互联时代的全场景分布式操作系统,可运行于手机、平板、手表、智慧屏、车机等多种设备。

┌─────────────────────────────────────────┐
│ HarmonyOS 生态 │
│ 手机 平板 手表 智慧屏 车机 … │
│ ┌───────────────────────────────────┐ │
│ │ 一次开发,多端部署(One-for-All) │ │
│ │ 分布式能力(数据/任务/设备协同) │ │
│ │ 声明式UI(ArkUI + ArkTS) │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘

核心特性:

特性说明应用场景
一次开发,多端部署一套代码适配多种设备手机/平板/折叠屏
分布式能力设备间数据与任务协同多设备数据同步、跨端流转
声明式UI数据驱动界面更新ArkUI 声明式开发范式
V2状态管理新一代状态管理机制组件状态、全局状态、深度观测

1.3 开发工具链

DevEco Studio 是 HarmonyOS 应用开发的官方 IDE,基于 IntelliJ IDEA 定制,提供:

  • 代码编辑、智能提示、实时预览
  • 编译、打包、签名
  • 本地模拟器与真机调试
  • Previewer 预览器(无需模拟器即可预览 UI)
  • 性能分析、内存检测工具

开发语言与框架关系:

┌──────────────────────────────────────┐
│ 应用层(你的代码) │
│ ┌────────────┐ ┌───────────────┐ │
│ │ ArkTS │ │ ArkUI │ │
│ │ 编程语言 │ │ 声明式UI框架 │ │
│ └────────────┘ └───────────────┘ │
├──────────────────────────────────────┤
│ HarmonyOS SDK(API 26) │
│ 系统服务 / 分布式能力 / 安全框架 │
├──────────────────────────────────────┤
│ 内核 / 系统 │
└──────────────────────────────────────┘

1.4 安装 DevEco Studio

1.4.1 系统要求

项目WindowsmacOS
系统版本Windows 10/11 64位macOS 11+(Apple Silicon/Intel)
内存16GB 及以上(推荐 32GB)16GB 及以上
硬盘100GB 及以上(SSD 推荐)100GB 及以上(SSD 推荐)
分辨率1280×800 及以上1280×800 及以上

1.4.2 下载与安装

  1. 访问 华为开发者官网 → 开发工具 → DevEco Studio 下载中心
  2. 选择 Windows 版本安装包下载
  3. 双击安装包,一路 Next 完成安装
  4. 安装完成后,桌面出现 DevEco Studio 图标

💡 提示:安装路径不要包含中文与空格,推荐安装到非系统盘,如 D:\program\DevEco Studio

1.4.3 首次启动配置

  1. 启动 DevEco Studio,选择 Do not import settings(首次使用)
  2. 进入欢迎页后,等待 SDK 组件初始化
  3. 若未自动安装 SDK,可进入 File > Settings > SDK 手动配置

1.5 配置开发环境

1.5.1 检查 SDK

DevEco Studio 内置 HarmonyOS SDK,位于安装目录的 sdk 文件夹。

API 版本对应关系(本课程使用 API 26):

项目版本
DevEco Studio2026 版本
API Version26
compatibleSdkVersion"26.0.0"
运行时HarmonyOS 7.0

⚠️ 注意:在 build-profile.json5 中,API 26 的 compatibleSdkVersion / targetSdkVersion 必须写成 "26.0.0"(带补丁号),不能写成 "26",否则工程无法正确同步。

1.5.2 环境诊断

通过菜单 Help > Diagnostic Tools > Diagnose Development Environment 检查:

  • JDK 版本是否满足要求
  • SDK 路径与版本是否正常
  • Node.js 与 hvigor 工具链是否可用
  • 模拟器镜像是否就绪

1.5.3 创建模拟器

  1. 打开 Tools > Device Manager
  2. 点击 + New Emulator(若无镜像,先下载)
  3. 选择设备类型:Phone(本课程统一使用手机模拟器)
  4. 选择 API Version:26
  5. 下载模拟器镜像(约 2-3GB,需耐心等待)
  6. 点击 Finish 完成创建

💡 模拟器启动后,可通过 adb devices(HarmonyOS 使用 hdc)验证连接,输出类似 127.0.0.1:5555 device 即表示已连接。

1.6 创建第一个应用

1.6.1 创建项目

  1. 欢迎页点击 Create Project
  2. 选择 Application > Empty Ability
  3. 填写工程信息:
配置项说明
Project nameFirstApp工程名称
Bundle namecom.example.firstapp应用唯一标识
Compatible SDK26API 版本
Module nameentry默认模块名
Device typePhone目标设备

1.6.2 工程结构

HarmonyOS 工程采用 App(应用)+ Module(模块) 两级结构:

FirstApp/
├── AppScope/ # 应用级配置(全局)
│ ├── app.json5 # 应用配置:bundleName、图标、版本
│ └── resources/ # 应用级资源
│ └── base/
│ ├── element/ # 字符串、颜色等
│ └── media/ # 图标图片
├── entry/ # 模块目录
│ ├── build-profile.json5 # 模块构建配置
│ ├── hvigorfile.ts # 模块构建脚本
│ ├── oh-package.json5 # 模块依赖
│ └── src/
│ ├── main/
│ │ ├── ets/
│ │ │ ├── entryability/ # 应用入口 Ability
│ │ │ │ └── EntryAbility.ets
│ │ │ ├── entrybackupability/ # 备份能力
│ │ │ └── pages/
│ │ │ └── Index.ets # 首页页面
│ │ ├── resources/ # 模块资源
│ │ │ └── base/
│ │ │ ├── element/ # 字符串、颜色、样式
│ │ │ ├── media/ # 图片资源
│ │ │ └── profile/ # 页面配置等
│ │ └── module.json5 # 模块配置(权限、Ability声明)
│ └── ohosTest/ # 测试代码
├── build-profile.json5 # 工程构建配置(SDK版本、签名)
├── oh-package.json5 # 工程级依赖(modelVersion)
├── hvigorfile.ts # 工程构建脚本
└── hvigor/
└── hvigor-config.json5 # hvigor 构建工具配置

关键配置文件说明:

文件作用关键字段
AppScope/app.json5应用级配置bundleNameiconlabel
build-profile.json5构建配置compatibleSdkVersionsigningConfigs
oh-package.json5依赖管理modelVersion
module.json5模块配置abilitiesrequestPermissions

1.6.3 第一个页面(V1 写法)

刚入门的第一个页面,直接用 Empty Ability 模板默认的 V1 写法(与官网一致),等熟悉后再过渡到 V2。模板自动生成的首页如下:

// Index.ets —— 模板生成的默认首页
@Entry
@Component
struct Index {
@State message: string = 'Hello World'

build() {
Column({ space: 20 }) {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)

// ① 添加按钮,点击修改 message
Button('点击我')
.onClick(() => {
this.message = 'Welcome to HarmonyOS!' // ② 状态变化,UI 自动刷新
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}

V1 语法要点(本章入门认识即可):

  • @Entry:页面入口标识
  • @Component:组件装饰器
  • @State:组件内部状态,数据变化自动刷新 UI
  • 声明式写法:UI 由 build() 中的组件树描述,状态驱动更新

🔑 本课程的写法约定:第一章是官方入门体验,使用 V1(@Component/@State,与官网模板一致);从第二章起本课程统一采用 V2 状态管理@ComponentV2 + @Local 等装饰器),届时会系统讲解,此处先不展开。

💡 本章的最终案例(页面跳转)见 1.7 节,完整代码见 code/Chapter1

1.6.4 运行应用

  1. 启动模拟器(或连接真机并开启开发者模式)
  2. 点击工具栏绿色 Run 按钮(或 Shift+F10
  3. DevEco 自动完成:同步 → 编译 → 签名 → 安装 → 启动
  4. 模拟器中看到应用界面即运行成功

🔧 首次运行会执行 hvigor 同步,需下载依赖,耗时较长,请耐心等待。

1.7 经典案例:页面跳转(第一个应用)

🎯 本案例完全照搬华为官方《使用 ArkTS 语言开发(Stage 模型)》入门案例,采用官方最简单的 router 路由 + V1 写法@Entry/@Component/@State,路由经 getUIContext().getRouter() 获取,见 1.7.3 写法说明),让刚装好环境的第一课同学专注把"第一个能跳转的应用"跑起来。完整代码见 code/Chapter1

⚠️ 重要说明:本案例是官方入门体验,特意使用 V1 + router;从第二章开始本课程统一采用 V2 + Navigation(见 1.6.3 的写法约定)。两种写法都能运行、互不冲突,同学们先感受"页面能跳转",后续章节再系统学习正式写法。

1.7.1 新建第二个页面

  1. 在 Project 窗口,右键 entry > src > main > ets > pages
  2. 选择 New > Page > Empty Page,命名为 Second,点击 Finish
  3. 用这种方式创建,DevEco 自动在路由表 main_pages.json 中注册了新页面

💡 若用 New > ArkTS File 创建(纯文件、无页面模板),则需手动main_pages.json 中注册路由,见 1.7.2。

1.7.2 配置页面路由(main_pages.json)

router 按 url 跳转,所有页面都必须在路由表中注册。打开 entry > src > main > resources > base > profile > main_pages.json

{
"src": [
"pages/Index",
"pages/Second"
]
}

🔑 pages/Second 就是跳转时用的 url,页面文件与 url 一一对应,新增页面记得在这里注册。

1.7.3 首页 Index.ets(跳转)

⚠️ 写法说明:旧版教程直接 import { router } from '@kit.ArkUI' 使用 router 模块,该写法在新版 DevEco Studio 中会提示过时/不推荐。官方最新写法不再直接导入 router,而是通过 this.getUIContext().getRouter() 获取路由实例,编辑器不再告警。本课程一律采用官方最新写法。

打开 entry > src > main > ets > pages > Index.ets,改成:

// Index.ets
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
@State message: string = 'Hello World';

build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
// 添加按钮,以响应用户onClick事件
Button() {
Text('Next')
.fontSize(30)
.fontWeight(FontWeight.Bold)
}
.type(ButtonType.Capsule)
.margin({
top: 20
})
.backgroundColor('#0D9FFB')
.width('40%')
.height('5%')
// 跳转按钮绑定onClick事件,单击时跳转到第二页
.onClick(() => {
console.info(`Succeeded in clicking the 'Next' button.`)
// 获取UIContext
let uiContext: UIContext = this.getUIContext();
let router = uiContext.getRouter();
// 跳转到第二页
router.pushUrl({ url: 'pages/Second' }).then(() => {
console.info('Succeeded in jumping to the second page.')

}).catch((err: BusinessError) => {
console.error(`Failed to jump to the second page. Code is ${err.code}, message is ${err.message}`)
})
})
}
.width('100%')
}
.height('100%')
}
}

🔑 this.getUIContext() 获取当前页面的 UI 上下文,uiContext.getRouter() 返回路由实例,pushUrl({ url: 'pages/Second' }) 按 url 跳转到已注册页面,.then/.catch 处理成功/失败回调。

💡 按钮文字与背景色这里直接用字面量('Next''#0D9FFB'),方便初学者理解;把文字/颜色统一放进资源文件用 $r 引用是更规范的做法,后续章节再介绍。

1.7.4 第二页 Second.ets(返回)

// Second.ets
@Entry
@Component
struct Second {
@State message: string = 'Hi Second';

build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button() {
Text('Back')
.fontSize(25)
.fontWeight(FontWeight.Bold)
}
.type(ButtonType.Capsule)
.margin({
top: 20
})
.backgroundColor('#0D9FFB')
.width('40%')
.height('5%')
// 返回按钮绑定onClick事件,点击按钮时返回到第一页
.onClick(() => {
console.info(`Succeeded in clicking the 'Back' button.`)
// 获取UIContext
let uiContext: UIContext = this.getUIContext();
let router = uiContext.getRouter();
// 返回到第一页
router.back();
})
}
.width('100%')
}
.height('100%')
}
}

🔑 与首页一致:先获取 UIContext,再 getRouter() 拿到路由实例,router.back() 返回上一页。

1.7.5 运行验证

  1. 启动模拟器,点击工具栏 Run 运行
  2. 首页点击 Next → 跳转到第二页
  3. 第二页点击 Back → 回到首页
  4. 也可用 Previewer 预览验证跳转效果

🔧 本案例最终代码见 code/Chapter1Index.ets + Second.ets)。

运行效果截图:

Chapter1 Hello World 首页

Chapter1 页面跳转(Index 页)

1.8 IDE 高效操作(快捷键与实时模板)

参考:鸿蒙学苑-环境搭建(05 常用快捷键、06 实时模板)。第一课先熟悉这些高频操作,写代码事半功倍。

1.8.1 常用快捷键

快捷键功能
Ctrl + Alt + L格式化代码(写代码必备)
Ctrl + Y删除当前行
Ctrl + D复制当前行
Shift + Enter切换下一行(光标无需在行尾)
Ctrl + Alt + O清除多余导包
Ctrl + B / Ctrl + 左键进入方法/变量的定义处
Ctrl + F12弹出当前文件结构(快速跳转方法)
Ctrl + F / Ctrl + R当前文件查找 / 替换
Ctrl + [ / Ctrl + ]跳到花括号开始 / 结束
Ctrl + + / Ctrl + -展开 / 收缩代码块
Ctrl + 鼠标滚轮缩放代码字体
Shift + F6重命名文件(选中文件)
Ctrl + Alt + S打开设置
Ctrl + Alt + Shift + S项目结构(签名/版本配置)

💡 更多自定义:Settings > Keymap 中可按自己习惯修改快捷键(如从 VS Code 转来的同学可把格式化改为 Alt + Shift + F)。

1.8.2 实时模板(Live Templates)

写代码时反复出现的固定片段,可提前配置成缩写,输入缩写 + 回车即自动展开,大幅提升效率。

配置入口: Settings > Editor > Live Templates

模板语法:

  • $END$:展开后光标停留位置
  • 自定义变量(如 $FILE_NAME$):展开时可交互填写

1)todo 待办注释

在编写代码时,通常会有不同的业务逻辑待完成,暂时用 todo 注释标注,可在 TODO 窗口中查看和定位。配置代码片段,输入缩写 + 回车即可快速生成:

// TODO $FILE_NAME$ 待完成: $END$

2)点击事件 & 箭头函数

编写代码过程中会频繁使用点击事件和箭头函数,配置成代码片段可提高开发效率。

点击事件(自定义快捷键,例如 ock):

.onClick(() => {
$END$
})

箭头函数(自定义快捷键,例如 jt):

($END$) => {

}

3)诗词数组(pmarr)

马老师在授课过程中,可能会用到很多诗词。整理成数组,避免每次准备,以提高效率(自定义快捷键 pmarr):

pmArr: string[] = [
`我醉欲眠卿且去 明朝有意抱琴来`,
`卡布奇诺今犹在 不见当年倒茶人`,
`时来运转皆同力 运去英雄不自由`,
`堪笑一场梦颠倒 元来此生恰浮云`,
`再见少年拉满弓 不惧岁月不俱风`,
`我今因病魂颠倒 唯梦闲人不梦君`,
`君埋泉下泥削骨 我寄人间雪满头`,
`南来北往徒自老 故人稀`,
`日拱一卒无有尽 功不唐捐终入海`,
`何事人间频乞食 此心已是负彩霞`,
`峨眉山月半轮秋 影入平羌江水流`,
`天生我才必有用 千金散尽还复来`,
`垂杨紫陌洛城东 今年花胜去年红`,
`劝君莫负艳阳天 恩爱欢愉趁少年`,
`何须浅碧深红色 自是花中第一流`,
`山有木兮木有枝 心悦君兮君不知`,
`曾经沧海难为水 除却巫山不是云`,
`玲珑骰子安红豆 入骨相思知不知`,
`直道相思了无益 未妨惆怅是清狂`,
`金风玉露一相逢 便胜却人间无数`,
`从此无心爱良夜 任他明月下西楼`,
`欲寄彩笺兼尺素 山长水阔知何处`,
`若似月轮终皎洁 不辞冰雪为卿热`,
`得成比目何辞死 愿作鸳鸯不羡仙`,
]

4)初始化背景(bj)

NEXT 版本默认初始化页面结构为相对布局 RelativeContainer,授课偏好列布局,可配置默认代码片段(自定义快捷键 bj):

Column({ space: 30 }) {
$END$
}
.width('100%')
.height('100%')
.backgroundColor($r('app.color.theme_color'))
.justifyContent(FlexAlign.Center)

⚠️ 注意,此处背景颜色引用了资源文件 theme_color,应先去 resources > base > element > color.json 中设置该颜色值。

5)外部暴露子组件(zj)

开发中经常抽取自定义子组件到指定目录中进行结构分离,此时需要使用 export default 关键字,避免重复编写(自定义快捷键 zj):

@Component
export default struct $END$ {
build() {

}
}

6)配置文件导出/导入

更多实时模板代码片段可根据需求自行配置。若编辑器卸载重装或更换电脑,重新配置习惯的代码片段很费时,可将配置文件导入/导出以备后用:

  • 导出配置:File > Manage IDE Settings > Export Settings...
  • 导入配置:File > Manage IDE Settings > Import Settings...
  • 恢复默认:File > Manage IDE Settings > Restore Default Settings...

更多实时模板配置见:鸿蒙学苑-实时模板

1.9 调试基础

日志输出

console.log('调试信息')        // Info 级别
console.warn('警告信息') // Warn 级别
console.error('错误信息') // Error 级别

在 DevEco Studio 底部 Log 面板可查看输出,支持关键字过滤。

断点调试

  1. 点击代码行号左侧空白处设置断点(红色圆点)
  2. 点击 Debug(甲虫图标)启动调试
  3. 程序运行到断点处暂停,可在 Debugger 面板查看变量值
  4. 使用 Step Over(F8)/ Step Into(F7)单步执行

Previewer 预览

无需启动模拟器,点击页面右上角 Previewer 分栏即可实时预览 UI,修改代码自动刷新,适合快速开发调试。

1.10 常见问题

Q:工程同步报错 The root node of hvigor lock yaml is null

  • 说明工程缺少 oh-package-lock.json5 或 hvigor 配置不完整
  • 解决:确保工程包含完整的 hvigor/hvigor-config.json5oh-package.json5oh-package-lock.json5,然后 File > Sync and Refresh Project

Q:编译报错 compatibleSdkVersion 不合法?

  • 检查 build-profile.json5 中版本是否写为 "26.0.0"(必须含补丁号)
  • 检查 modelVersion 与 DevEco 版本匹配(API 26 对应 "5.0.0"

Q:模拟器启动失败?

Q:应用安装了但打开闪退?

  • 查看 Log 面板中的 Error 日志
  • 检查是否缺少网络权限(后续章节会用到)
  • 检查代码中是否有 V1/V2 装饰器混用

1.11 本章小结

收获说明
认识 HarmonyOS全场景分布式操作系统,一次开发多端部署
掌握工具链DevEco Studio 2026 + API 26 + hvigor
理解工程结构AppScope + entry 两级结构
运行首个应用从创建到运行完整流程
经典页面跳转案例router 两页面跳转/返回 + main_pages.json 路由注册
IDE 高效操作常用快捷键 + 实时模板(Live Templates)
声明式 UI 入门V1(@Component/@State),第二章起统一 V2

1.12 课后练习

  1. 完成 DevEco Studio 安装与模拟器创建
  2. 创建 Hello World 应用并运行到模拟器
  3. 修改首页 @State message 内容,观察 UI 联动刷新
  4. 完成 1.7 页面跳转案例:首页 → 第二页 → 返回
  5. 为首页按钮添加 onClick 修改 @State message 文本,观察 UI 联动刷新
  6. 在 Live Templates 中配置 todo / 点击事件模板并试用(练习 1.8.2 的缩写)
  7. 尝试用 Previewer 预览页面并设置断点调试

评论

加载中…
加载中...