鸿蒙系统架构与开发入门
What — 是什么
鸿蒙(HarmonyOS)是华为自研的全场景分布式操作系统,采用”1+8+N”战略(1手机+8终端+N生态),支持手机、平板、手表、电视、车机等多设备协同。HarmonyOS NEXT(纯血鸿蒙)完全去除了 AOSP 代码,不再支持 Android 应用,是鸿蒙生态的独立版本。
核心概念:
- 1+8+N 战略:1 手机为核心,8 类终端(平板/PC/手表/耳机/眼镜/车机/智慧屏/音箱),N 个生态设备
- 分布式软总线:多设备融合为超级终端,统一通信基础
- 分布式数据管理:跨设备数据同步与共享
- 分布式任务调度:跨设备 Ability 调用与迁移
- 一次开发多端部署:一套代码适配多设备形态
系统架构分层:
┌──────────────────────────────────────────────────┐
│ 应用层 (Application) │
│ 系统应用 │ 第三方应用 │ 元服务(Atomic Service) │
├──────────────────────────────────────────────────┤
│ 框架层 (Framework) │
│ ┌──────────┬──────────┬──────────┬───────────┐ │
│ │ ArkUI │ ArkTS │ Ability │ 分布式 │ │
│ │ 声明式UI │ 开发语言 │ 框架 │ 基础设施 │ │
│ ├──────────┼──────────┼──────────┼───────────┤ │
│ │ 多媒体 │ 网络 │ 数据 │ 安全 │ │
│ │ 框架 │ 框架 │ 管理 │ 基础设施 │ │
│ └──────────┴──────────┴──────────┴───────────┘ │
├──────────────────────────────────────────────────┤
│ 系统服务层 (System Services) │
│ ┌────────┬────────┬────────┬────────┬────────┐ │
│ │窗口管理│包管理 │分布式 │图形栈 │媒体服务│ │
│ │通知管理│帐号管理│数据管理│编译运行│通信服务│ │
│ └────────┴────────┴────────┴────────┴────────┘ │
├──────────────────────────────────────────────────┤
│ 内核层 (Kernel) │
│ ┌──────────────┬───────────────────────────┐ │
│ │ Linux Kernel │ HarmonyOS Micro Kernel │ │
│ │ (标准设备) │ (轻量设备) │ │
│ └──────────────┴───────────────────────────┘ │
└──────────────────────────────────────────────────┘
HarmonyOS NEXT 核心变化:
| 对比项 | HarmonyOS 4.x | HarmonyOS NEXT |
|---|---|---|
| 内核 | AOSP + OpenHarmony | 纯 OpenHarmony |
| Android 应用 | 兼容 | 不支持 |
| 开发语言 | Java/Kotlin + ArkTS | 仅 ArkTS |
| 运行时 | ART + 方舟引擎 | 仅方舟引擎 |
| 应用格式 | APK + HAP | 仅 HAP |
| 生态 | Android + 鸿蒙 | 纯鸿蒙 |
技术特性:
- 分布式软总线:设备自动发现、认证、组网,构建虚拟超级终端
- 分布式数据管理:跨设备数据自动同步,应用无感知
- 分布式任务调度:远程启动 Ability、跨设备迁移
- 一次开发多端部署:响应式布局 + 断点系统适配多设备
Why — 为什么
适用场景:
- 华为生态应用开发(国内市场必需)
- 多设备协同场景(手机+手表+车机)
- 元服务/卡片开发(免安装即用即走)
- 国产化替代需求(政务、企业)
对比 Android/iOS 开发:
| 维度 | HarmonyOS NEXT | Android | iOS |
|---|---|---|---|
| 开发语言 | ArkTS | Kotlin/Java | Swift |
| UI 框架 | ArkUI (声明式) | Jetpack Compose | SwiftUI |
| IDE | DevEco Studio | Android Studio | Xcode |
| 应用格式 | HAP | APK | IPA |
| 跨设备 | 原生支持 | 需自行实现 | 需自行实现 |
| 分布式 | 内置能力 | 无 | 无 |
| 卡片/元服务 | 原生支持 | App Widget | WidgetKit |
| 生态 | 成长中 | 成熟 | 成熟 |
| 目标市场 | 中国为主 | 全球 | 全球 |
优缺点:
- ✅ 优点:
- 原生分布式能力,多设备协同无缝
- ArkTS 基于 TypeScript,前端开发者友好
- 声明式 UI(ArkUI),开发效率高
- 方舟引擎 AOT 编译,性能优秀
- 免安装元服务,分发更灵活
- 华为设备市场占有率高(国内)
- ❌ 缺点:
- 生态仍在成长期,第三方库不如 Android/iOS 丰富
- 仅限华为设备,无法覆盖其他品牌
- 国际化支持有限
- 学习资源相对较少
- 调试工具链不如 Android/iOS 成熟
How — 怎么用
1. DevEco Studio 安装与配置
# 下载 DevEco Studio
# https://developer.huawei.com/consumer/cn/deveco-studio/
# 系统要求
# Windows 10/11 64位 或 macOS 12+
# 内存:16GB+ 推荐
# 磁盘:10GB+ 可用空间
# 安装步骤
# 1. 下载并安装 DevEco Studio
# 2. 启动后安装 HarmonyOS SDK
# 3. 配置 Node.js(DevEco 内置或指定路径)
# 4. 登录华为开发者账号
# 5. 配置签名证书
2. 项目创建与结构
# 创建项目
# DevEco Studio → File → New → Create Project
# 选择模板:Empty Ability (Stage 模型)
项目结构:
MyApp/
├── entry/ # 主模块
│ ├── src/
│ │ ├── main/
│ │ │ ├── ets/ # ArkTS 源码
│ │ │ │ ├── entryability/ # Ability
│ │ │ │ │ └── EntryAbility.ets
│ │ │ │ ├── pages/ # 页面
│ │ │ │ │ └── Index.ets
│ │ │ │ ├── model/ # 数据模型
│ │ │ │ ├── viewmodel/ # 视图模型
│ │ │ │ ├── common/ # 公共组件/工具
│ │ │ │ └── utils/ # 工具函数
│ │ │ ├── resources/ # 资源文件
│ │ │ │ ├── base/
│ │ │ │ │ ├── element/ # 颜色/字符串等
│ │ │ │ │ │ ├── color.json
│ │ │ │ │ │ └── string.json
│ │ │ │ │ ├── media/ # 图片
│ │ │ │ │ └── profile/ # 配置
│ │ │ │ ├── en_US/ # 英文资源
│ │ │ │ └── zh_CN/ # 中文资源
│ │ │ └── module.json5 # 模块配置
│ │ └── ohosTest/ # 测试
│ ├── build-profile.json5 # 构建配置
│ ├── hvigorfile.ts # 构建脚本
│ └── oh-package.json5 # 依赖配置
├── build-profile.json5 # 项目级构建配置
├── hvigorw # 构建工具
├── oh-package.json5 # 项目依赖
└── oh_modules/ # 依赖包
3. Stage 模型 vs FA 模型
| 对比项 | Stage 模型(推荐) | FA 模型(旧版) |
|---|---|---|
| Ability 类型 | UIAbility + ExtensionAbility | Page + Service + Data |
| 生命周期 | WindowStage 管理 | Page 独立管理 |
| 多实例 | 支持 | 不支持 |
| 后台任务 | BackgroundTaskManager | 无统一管理 |
| 数据共享 | DataShareExtensionAbility | Data Ability |
| 前景/后台 | onForeground/onBackground | onShow/onHide |
| 推荐程度 | ✅ 官方推荐 | ❌ 逐步弃用 |
4. Ability 生命周期
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
export default class EntryAbility extends UIAbility {
// 1. Ability 创建时调用
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
console.log('Ability onCreate');
// 初始化数据、读取参数
}
// 2. WindowStage 创建后调用
onWindowStageCreate(windowStage: window.WindowStage): void {
console.log('WindowStage create');
// 加载主页面
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
console.error('Failed to load content: ' + JSON.stringify(err));
return;
}
});
}
// 3. Ability 可见时调用(前台)
onForeground(): void {
console.log('Ability onForeground');
// 恢复任务、刷新数据
}
// 4. Ability 不可见时调用(后台)
onBackground(): void {
console.log('Ability onBackground');
// 暂停任务、保存状态
}
// 5. WindowStage 销毁时调用
onWindowStageDestroy(): void {
console.log('WindowStage destroy');
// 释放 WindowStage 资源
}
// 6. Ability 销毁时调用
onDestroy(): void {
console.log('Ability onDestroy');
// 释放所有资源
}
}
生命周期流程:
onCreate → onWindowStageCreate → onForeground
↑ │
│ ↓
│ onBackground
│ │
│ (前后台切换循环) ↓
│ onForeground
│ │
↓ ↓
onDestroy ← onWindowStageDestroy ← onBackground
5. 应用配置文件
// entry/src/main/module.json5
{
"module": {
"name": "entry",
"type": "entry", // entry(主模块) / feature / har(库)
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [ // 支持的设备类型
"phone",
"tablet",
"2in1"
],
"deliveryWithInstall": true,
"installationFree": false, // 是否免安装(元服务设为 true)
"pages": "$profile:main_pages", // 页面路由配置
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"description": "$string:ability_desc",
"icon": "$media:app_icon",
"label": "$string:ability_label",
"startWindowIcon": "$media:start_icon",
"startWindowBackground": "$color:start_bg",
"exported": true, // 是否可被其他应用调用
"skills": [
{
"entities": ["entity.system.home"],
"actions": ["action.system.home"]
}
]
}
],
"requestPermissions": [ // 权限声明
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.LOCATION",
"reason": "$string:location_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
}
}
// AppScope/app.json5
{
"app": {
"bundleName": "com.example.myapp",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:app_icon",
"label": "$string:app_name"
}
}
6. 第一个页面
// pages/Index.ets
@Entry
@Component
struct Index {
@State message: string = 'Hello HarmonyOS'
build() {
Column() {
Text(this.message)
.fontSize(30)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 20 })
Button('Click Me')
.width('60%')
.height(48)
.fontSize(18)
.onClick(() => {
this.message = 'Welcome to HarmonyOS!'
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
}
}
7. 应用签名与调试
# 生成签名证书
# DevEco Studio → Build → Generate Key and CSR
# 配置签名
# File → Project Structure → Project → Signing Configs
# 选择自动签名(Automatically generate signature)
# 真机调试
# 1. 华为开发者账号登录
# 2. 设备开启开发者模式(设置 → 关于手机 → 连点版本号7次)
# 3. USB 连接设备
# 4. DevEco Studio 选择设备运行
# 模拟器
# DevEco Studio → Tools → Device Manager
# 创建远程模拟器(Remote Emulator)或本地模拟器
8. 应用发布
# 构建发布包
# Build → Build Hap(s)/APP(s) → Build APP(s)
# 发布流程
# 1. 在 AppGallery Connect 创建应用
# 2. 上传 .app 文件
# 3. 填写版本信息和发布说明
# 4. 提交审核
# 5. 审核通过后发布
常见问题与踩坑
| 问题 | 原因 | 解决方案 |
|---|---|---|
| SDK 下载慢 | 华为 CDN 海外节点 | 使用国内网络/VPN |
| 模拟器启动失败 | 系统资源不足 | 关闭其他应用,确保 8GB+ 内存 |
| 真机无法调试 | 未开启开发者模式 | 设置中连点版本号7次 |
| 签名失败 | 证书/Profile 过期 | 重新生成签名配置 |
| 包名冲突 | bundleName 已被注册 | 使用唯一包名 |
| 权限被拒 | 未声明或未动态申请 | module.json5 声明 + 代码动态申请 |
| ArkTS 语法报错 | 使用了 TS 动态特性 | 查阅 ArkTS 限制清单 |
最佳实践
- 使用 Stage 模型开发新项目
- ArkTS 遵循严格类型,避免 any 和动态特性
- 多设备适配用响应式布局 + 断点系统
- 资源文件用 $r/$rawfile 引用,不硬编码
- 权限最小化原则,按需申请
- 优先使用系统能力 API(@kit.*)
- 遵循 HarmonyOS 设计规范
面试题
Q1: HarmonyOS NEXT 和之前的 HarmonyOS 有什么核心区别?
核心区别是完全去除了 AOSP 代码,不再兼容 Android 应用。HarmonyOS 4.x 基于 AOSP + OpenHarmony 双框架,可以运行 Android 应用(APK);HarmonyOS NEXT 纯基于 OpenHarmony,应用格式统一为 HAP,开发语言统一为 ArkTS,运行时统一为方舟引擎。这意味着 HarmonyOS NEXT 是完全独立的操作系统,不依赖任何 Android 组件,所有应用都需要使用鸿蒙 SDK 重新开发。
Q2: Stage 模型和 FA 模型有什么区别?为什么推荐 Stage 模型?
Stage 模型以 UIAbility 为核心,一个 Ability 对应一个 WindowStage(窗口舞台),可以加载多个页面,支持多实例、前后台统一管理。FA 模型以 Page 为核心,每个 Page 独立管理窗口和生命周期,不支持多实例。Stage 模型优势:①UIAbility + ExtensionAbility 分离,职责更清晰;②WindowStage 统一管理窗口,支持多窗口;③BackgroundTaskManager 统一管理后台任务;④DataShareExtensionAbility 标准化数据共享;⑤支持应用接续(Continuation)。官方推荐新项目使用 Stage 模型,FA 模型将逐步弃用。
Q3: 鸿蒙的分布式能力有哪些?如何实现”一次开发多端部署”?
四大分布式能力:①分布式软总线——设备自动发现、认证、组网,构建超级终端;②分布式数据管理——跨设备数据自动同步,应用无感知;③分布式任务调度——远程启动 Ability、跨设备迁移;④分布式文件系统——跨设备文件共享访问。一次开发多端部署的实现:响应式布局(breakpoint 断点系统 sm/md/lg)适配不同屏幕;多态组件根据设备类型自动调整;资源限定词(resources 目录下按设备类型分发);工程级多 HAP 部署(phone HAP + tablet HAP 共享公共 HAR)。
Q4: ArkTS 和 TypeScript 有什么关系?前端开发者学 ArkTS 需要注意什么?
ArkTS 是华为基于 TypeScript 扩展的语言,保留了 TS 的基本语法和类型系统,但增加了严格限制:①禁止 any 类型;②禁止 eval/with 等动态特性;③强制类型注解;④限制原型链操作;⑤新增装饰器体系(@Component/@State/@Prop 等)。前端开发者注意事项:①不能用 any,所有变量必须明确类型;②不能用 eval/Function 动态执行代码;③对象属性必须先声明后使用;④类不能动态添加属性;⑤使用装饰器而非 React Hooks 的思维;⑥异步用 Promise/async-await,和 TS 一致;⑦集合类型用 Array/Set/Map,和 JS 类似。
Q5: 鸿蒙应用和元服务有什么区别?
应用(Application)是传统的安装式应用,有桌面图标,通过 AppGallery 下载安装。元服务(Atomic Service)是免安装的轻量服务,没有桌面图标,通过服务卡片(Widget)、扫码、搜索等方式发现和使用。核心区别:①安装方式——应用需下载安装,元服务即用即走免安装;②入口——应用有图标,元服务通过卡片/URL 发现;③包大小——元服务限制更严格(2MB 以内推荐);④能力——元服务部分 API 受限;⑤分发——元服务通过服务分发,不需要应用市场审核上架。元服务适合工具类、查询类、快捷操作类场景。
Q6: 鸿蒙的应用配置文件 module.json5 和 app.json5 各自负责什么?
app.json5 是应用级配置,位于 AppScope 目录,定义应用全局信息:bundleName(包名)、vendor(开发者)、versionCode/versionName(版本号)、应用图标和名称。module.json5 是模块级配置,位于每个模块的 src/main 目录,定义模块信息:模块名称/类型(entry/feature/har)、支持的设备类型(deviceTypes)、Ability 声明(abilities 数组)、权限声明(requestPermissions)、页面路由(pages)。一个应用可以有多个模块(entry + feature),每个模块有自己的 module.json5。
Q7: 鸿蒙的权限管理机制是怎样的?
鸿蒙权限分三级:①normal 级——安装时自动授权(如 INTERNET);②system_basic 级——需要用户动态授权(如 LOCATION、CAMERA),首次使用时弹窗询问;③system_core 级——仅系统应用可用(如 INSTALL_BUNDLE)。使用流程:在 module.json5 的 requestPermissions 声明所需权限 → normal 级自动授权 → system_basic 级在代码中调用 requestPermissionsFromUser 动态申请 → 用户同意后获得权限。权限原则:最小化声明(只申请必要权限)、按需申请(使用时才申请)、说明原因(reason 字段解释用途)。
Q8: 鸿蒙对前端开发者的友好程度如何?有哪些优势和挑战?
友好程度较高。优势:①ArkTS 基于 TypeScript,前端开发者能快速上手;②ArkUI 声明式范式类似 React/Vue,思维模式接近;③CSS-like 样式属性(fontSize/fontWeight/margin/padding)降低学习成本;④组件化开发与 React/Vue 一致。挑战:①装饰器体系(@State/@Prop/@Link)与 React Hooks 思维不同;②严格类型限制禁止 any,需适应更严格的类型约束;③状态管理模型(单向/双向同步)与 React 单向数据流不同;④调试工具链不如 Web DevTools 成熟;⑤生态库不如 npm 丰富,很多功能需自己实现;⑥文档以中文为主,英文资源少。
相关链接: