CHAPTER 01 · 10

环境搭建与 ArkTS 基础

安装 DevEco Studio,创建第一个鸿蒙应用,深入理解 ArkTS 语言的类型系统与核心语法。

什么是 HarmonyOS NEXT

HarmonyOS NEXT(鸿蒙 NEXT)是华为于 2024 年推出的全新版本鸿蒙操作系统,它与以往最大的区别在于:彻底移除了 Android 兼容层,成为完全自主、纯鸿蒙内核的操作系统。这意味着在 HarmonyOS NEXT 上运行的应用,必须是原生鸿蒙应用,不再兼容 Android APK。

这一变化对开发者来说是重大机遇:整个华为、荣耀手机生态需要重建原生应用,市场需求巨大。与此同时,HarmonyOS NEXT 提供了统一的开发框架 ArkUI,以及专属语言 ArkTS,让开发体验比以往任何版本都更加一致和高效。

HarmonyOS NEXT 的核心设计哲学是万物互联——手机、平板、手表、电视、汽车……所有华为生态设备共享同一套 UI 框架和分布式能力。开发者一次开发,可以覆盖整个华为超级终端生态。

核心名词解释

ArkTS
HarmonyOS NEXT 的官方开发语言,基于 TypeScript 扩展而来,增加了声明式 UI 语法和严格的静态类型约束。与 TypeScript 的关键区别是:ArkTS 禁止使用 eval()、动态属性访问等动态特性,以换取更高的运行时性能和编译期安全性。
ArkUI
HarmonyOS NEXT 的声明式 UI 框架。类似于 SwiftUI 或 Jetpack Compose,开发者通过描述"UI 应该是什么样子"而不是"怎么改变 UI"来构建界面。UI 与数据自动绑定,状态变化触发自动重绘。
Stage 模型
HarmonyOS NEXT 的应用架构模型,替代了旧版的 FA(Feature Ability)模型。在 Stage 模型中,应用的核心单元是 UIAbility(可视化能力),多个 Ability 共享同一个 ArkTS 引擎实例,内存效率更高,多实例管理更灵活。
DevEco Studio
HarmonyOS 官方 IDE,基于 IntelliJ IDEA 二次开发。提供 ArkTS 智能补全、预览器(支持真机同步预览)、性能分析器(Profiler)、签名管理等一站式开发工具链。
HAP(HarmonyOS Ability Package)
鸿蒙应用的安装包格式,类似 Android 的 APK。一个应用可以由多个 HAP 组成(entry HAP + feature HAP),支持按需下载,减少初始安装体积。
UIAbility
Stage 模型中代表一个可视化界面模块的基类,类似 Android 的 Activity。每个 UIAbility 有独立的生命周期(onCreate / onForeground / onBackground / onDestroy),可以独立响应系统事件。
方舟编译器(ArkCompiler)
华为自研的编译器工具链,将 ArkTS 代码编译为高效字节码(支持 AOT 提前编译)。相比 V8/JavaScriptCore 解释执行,ArkCompiler AOT 模式下 CPU 密集任务性能可提升 20%~60%,启动时间缩短明显。
AGC(AppGallery Connect)
华为应用市场后台,开发者在此注册应用、上传 HAP 包、配置云服务(认证、数据库、存储)。AGC 是鸿蒙生态的 Firebase 等价物,同时也是应用发布和分发的入口。

HarmonyOS NEXT vs 前代 vs 竞品

理解 HarmonyOS NEXT 在整个移动生态中的定位,有助于做出合理的技术选型:

维度HarmonyOS NEXTHarmonyOS 4.xiOSAndroid
Android 兼容无,纯鸿蒙有 AOSP 层本体
开发语言ArkTS(TS 超集)ArkTS / JavaSwift / ObjCKotlin / Java
UI 框架ArkUI 声明式ArkUI / XMLSwiftUI / UIKitCompose / XML
跨设备原生分布式部分支持Handoff/AirDropNearby Share
性能方舟编译器 AOTJIT+AOT 混合LLVM AOTART AOT+JIT
生态成熟度快速成长中成熟最成熟最广泛

安装 DevEco Studio

DevEco Studio 是开发 HarmonyOS NEXT 应用的唯一官方 IDE。以下是安装步骤:

  1. 访问华为开发者官网 developer.harmonyos.com,下载最新版 DevEco Studio(Windows 或 macOS 版本)
  2. 安装时选择"HarmonyOS NEXT"SDK,会自动下载 ArkTS 工具链、模拟器镜像
  3. 首次启动配置 SDK 路径,建议 SDK 安装在非系统盘路径(Windows)或用户目录(macOS)
  4. 在 SDK Manager 中确保安装:HarmonyOS SDK(API 12+)、工具包(Command Line Tools)
  5. 可选:安装模拟器镜像(约 4GB),或连接真机通过 USB 调试
系统要求 DevEco Studio 要求:macOS 12+ / Windows 10+,内存 8GB 以上(推荐 16GB),硬盘剩余空间 20GB 以上(含模拟器镜像)。低配机器建议使用真机调试而非模拟器。

创建第一个项目

  1. 打开 DevEco Studio,选择 "Create Project"
  2. 选择模板:Application → Empty Ability(Stage 模型,ArkTS)
  3. 填写项目名、包名(格式:com.example.myapp),选择 API 版本(选 API 12 或最新)
  4. 点击 Finish,等待 Gradle 同步和依赖下载(首次约 5~10 分钟)
  5. 连接设备或启动模拟器,点击运行按钮(▶)

项目结构详解

# HarmonyOS NEXT Stage 模型项目结构
MyApp/
├── AppScope/                    # 应用级配置
│   ├── app.json5                # 应用全局配置(包名、版本、图标)
│   └── resources/              # 应用级资源(启动图标等)
│
├── entry/                       # 入口 HAP 模块
│   ├── src/main/
│   │   ├── ets/                 # ArkTS 源码目录
│   │   │   ├── entryability/
│   │   │   │   └── EntryAbility.ets   # UIAbility 入口
│   │   │   └── pages/
│   │   │       └── Index.ets    # 首页组件
│   │   ├── resources/           # 模块资源(字符串、颜色、图片)
│   │   │   ├── base/
│   │   │   │   ├── element/     # string.json、color.json
│   │   │   │   └── media/       # 图片资源
│   │   │   └── rawfile/         # 原始文件(不压缩)
│   │   └── module.json5         # 模块配置(路由、权限声明)
│   └── build-profile.json5      # 构建配置
│
├── hvigor/                      # 构建工具(类似 Gradle)
├── build-profile.json5          # 项目构建配置
└── hvigorfile.ts                # 构建脚本
关于 .ets 文件扩展名 HarmonyOS 的源码文件使用 .ets 扩展名(Extended TypeScript),与普通 .ts 文件的区别是:.ets 文件支持 ArkUI 的声明式 UI 语法糖(如 Column(){}、Text() 这类 DSL 写法),由 DevEco Studio 的专属解析器处理。纯逻辑文件(无 UI)建议使用 .ts

ArkTS 语言基础

ArkTS 是鸿蒙生态的核心语言。理解它与 TypeScript 的关系非常重要:ArkTS 是 TypeScript 的超集,但同时也是受限子集。"超集"是指它新增了声明式 UI 语法;"受限子集"是指它禁止了一些 TypeScript 的动态特性,以保证性能和安全。

基本类型与变量

// ArkTS 完全支持 TypeScript 的类型系统
let name: string = '鸿蒙开发者'
let age: number = 25
let isActive: boolean = true
const PI: number = 3.14159

// 数组类型
let scores: number[] = [90, 85, 92]
let names: Array<string> = ['Alice', 'Bob']

// 联合类型
let id: string | number = 'abc123'
id = 42  // 合法

// 可选链与空值合并
let user: { name?: string } = {}
const displayName = user.name ?? '匿名用户'

// ArkTS 限制:禁止 any 类型(推荐 unknown 代替)
// let x: any = ...  ← 在严格模式下不推荐
let data: unknown = fetchData()
if (typeof data === 'string') {
  console.log(data.toUpperCase())  // 类型缩小后安全访问
}

接口与类

// 接口定义数据结构
interface User {
  id: number
  name: string
  email?: string    // 可选属性
  readonly role: string  // 只读属性
}

// 类实现接口
class Developer implements User {
  id: number
  name: string
  readonly role: string = 'developer'
  private skills: string[] = []

  constructor(id: number, name: string) {
    this.id = id
    this.name = name
  }

  addSkill(skill: string): void {
    this.skills.push(skill)
  }

  getSkills(): string[] {
    return [...this.skills]  // 返回副本,避免外部修改
  }
}

// 泛型函数
function createList<T>(items: T[]): T[] {
  return [...items]
}

const devList = createList<Developer>([
  new Developer(1, '张三'),
  new Developer(2, '李四')
])

异步编程

HarmonyOS 大量 API 是异步的,ArkTS 提供了完整的 Promise 和 async/await 支持:

// async/await 是处理异步的推荐方式
async function loadUserData(userId: number): Promise<User> {
  try {
    // 模拟网络请求
    const response = await httpRequest(`/api/users/${userId}`)
    const data: User = JSON.parse(response.result as string)
    return data
  } catch (err) {
    console.error('加载失败:', err)
    throw err
  }
}

// Promise 链式调用(等价于上面的 async/await)
loadUserData(1)
  .then(user => console.log(user.name))
  .catch(err => console.error(err))

// 并行请求
const [user, posts] = await Promise.all([
  loadUserData(1),
  loadPosts(1)
])

ArkTS 独有限制(与 TypeScript 的区别)

重要限制 以下 TypeScript 特性在 ArkTS 中被禁止或限制,违反会导致编译报错,需特别注意。
特性TypeScriptArkTS原因
eval()允许禁止安全风险,无法 AOT 编译
动态属性 obj[expr]允许受限无法在编译期确定类型
Function 构造器允许禁止动态代码执行
修改内置原型允许禁止破坏类型系统
any 类型允许不推荐绕过类型检查
解构赋值支持支持完全兼容
泛型支持支持完全兼容

第一个完整 ArkTS 组件

下面这个例子展示了 ArkTS + ArkUI 声明式 UI 的完整写法,包含状态管理和事件处理:

// Index.ets — 第一个 HarmonyOS NEXT 应用

// @Entry 标记这是页面的入口组件(一个页面只能有一个)
@Entry
// @Component 标记这是一个 ArkUI 组件
@Component
struct Index {
  // @State 声明响应式状态变量
  // 当 count 变化时,引用它的 UI 自动重绘
  @State count: number = 0
  @State greeting: string = '你好,鸿蒙!'

  // build() 方法描述 UI 结构,由框架自动调用
  build() {
    // Column 是垂直布局容器,子组件从上到下排列
    Column({ space: 20 }) {

      // Text 组件显示文字,通过链式调用设置属性
      Text(this.greeting)
        .fontSize(28)
        .fontWeight(FontWeight.Bold)
        .fontColor('#CF0A2C')

      Text(`点击次数:${this.count}`)
        .fontSize(20)
        .fontColor('#adbac7')

      // Button 组件,onClick 事件处理函数
      Button('点击我 +1')
        .width(200)
        .height(48)
        .backgroundColor('#CF0A2C')
        .borderRadius(10)
        .onClick(() => {
          this.count++
          // 修改 @State 变量,框架自动触发 UI 更新
        })

      // if 条件渲染
      if (this.count >= 5) {
        Text('🎉 点击达到 5 次!')
          .fontSize(16)
          .fontColor('#56d364')
      }

    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .backgroundColor('#0d1117')
  }
}
声明式 UI 的核心思想 注意代码中没有任何"更新 UI"的命令——没有 setText(),没有 invalidate()。开发者只需修改 this.count,框架自动计算哪些 UI 节点依赖了这个状态,并精确重绘它们。这是声明式 UI 的核心优势,与命令式(Android XML + Java)的本质区别。

EntryAbility 生命周期

在 Stage 模型中,UIAbility 是应用的核心容器。理解其生命周期对于处理应用状态切换(如从后台恢复)至关重要:

// EntryAbility.ets
import UIAbility from '@ohos.app.ability.UIAbility'
import type { AbilityConstant, Want, window } from '@kit.AbilityKit'

export default class EntryAbility extends UIAbility {

  // 应用首次创建时调用(冷启动)
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    console.log('Ability onCreate')
    // 适合:初始化全局数据、配置日志系统
  }

  // 窗口创建后调用,在此加载页面
  async onWindowStageCreate(windowStage: window.WindowStage) {
    // loadContentByName 加载路由命名页面
    await windowStage.loadContent('pages/Index')
    console.log('页面加载完成')
  }

  // 应用切到前台(从后台恢复或首次可见)
  onForeground() {
    console.log('Ability onForeground')
    // 适合:恢复定时器、重新订阅数据
  }

  // 应用切到后台(用户按 Home 键或切换应用)
  onBackground() {
    console.log('Ability onBackground')
    // 适合:暂停定时器、保存临时状态
  }

  // 应用销毁时调用
  onDestroy() {
    console.log('Ability onDestroy')
    // 适合:释放资源、取消订阅
  }
}
UIAbility 生命周期状态机 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 启动 │ ▼ ┌─────────┐ │ onCreate │ ← 初始化,仅一次 └────┬────┘ │ ▼ ┌─────────────────┐ │ onWindowStage │ ← 加载页面 │ Create │ └────────┬────────┘ │ ▼ ┌──────────────┐ │ onForeground │◄──────────┐ └──────┬───────┘ │ │ 运行中 │ 从后台恢复 │ │ ▼ │ ┌──────────────┐ │ │ onBackground │───────────┘ └──────┬───────┘ │ 销毁 ▼ ┌──────────────┐ │ onDestroy │ ← 资源释放 └──────────────┘

module.json5 配置文件

每个 HAP 模块的核心配置文件,类似 Android 的 AndroidManifest.xml:

{
  "module": {
    "name": "entry",
    "type": "entry",           // 入口模块
    "description": "应用主模块",
    "mainElement": "EntryAbility",

    "deviceTypes": [           // 支持的设备类型
      "phone",
      "tablet"
    ],

    "abilities": [{            // Ability 声明
      "name": "EntryAbility",
      "srcEntry": "./ets/entryability/EntryAbility.ets",
      "description": "主界面",
      "icon": "$media:icon",
      "label": "$string:EntryAbility_label",
      "startWindowIcon": "$media:startIcon",
      "startWindowBackground": "$color:start_window_background",
      "exported": true,
      "skills": [{             // 响应的 Intent
        "entities": ["entity.system.home"],
        "actions": ["action.system.home"]
      }]
    }],

    "requestPermissions": [   // 权限声明
      {
        "name": "ohos.permission.INTERNET"
      }
    ]
  }
}
学习建议 完成本章后,建议在 DevEco Studio 中亲手创建一个项目,修改 Index.ets 中的文字和颜色,感受实时预览的效果。HarmonyOS NEXT 的预览器非常强大,支持多设备同时预览(手机、平板、折叠屏),建议充分利用。