文章

口述鸿蒙应用架构全景图:从四层体系到面试要点

口述题:把鸿蒙应用架构从四层体系(应用/Ability/系统/设备)到核心机制串成全景图。 掌握后能流畅口述鸿蒙架构与面试要点,应对体系级追问。

口述鸿蒙应用架构全景图:从四层体系到面试要点

一句话概括

鸿蒙应用架构是一个四层体系——从 ArkTS 声明式 UI 框架,到 Ability 组件模型,到进程/线程调度,到底层分布式软总线——面试中最容易被问「鸿蒙和 Android/iOS 架构上到底有什么不同」,答案就藏在这四层里。

核心知识点

1. ArkTS 的本质:TypeScript 超集 + 装饰器体系

ArkTS 不是新语言,它是 TypeScript 的超集,核心增量就四个:@Component/@Entry 声明组件与入口、@State/@Prop/@Link/@Provide/@Consume 五件套做响应式、build() 描述 UI、$$ 语法糖实现双向绑定。

1
2
3
4
5
6
7
8
9
10
11
@Component
struct Counter {
  @State count: number = 0;  // 状态变 → build 自动重新执行

  build() {
    Column() {
      Text(`点击了 ${this.count} 次`).fontSize(20)
      Button('+1').onClick(() => this.count++)  // 改状态即更新 UI
    }
  }
}

编译时 Ark 编译器扫描装饰器,生成运行时的状态订阅/更新代码——和 Vue 的 ref → watchEffect 链路异曲同工。

2. Stage 模型的灵魂:UIAbility ≠ Activity

Stage 模型下,一个 UIAbility 管理多个页面,页面切换靠路由而非 Ability 跳转。这和 Android 的一个 Activity 一个页面完全不同——鸿蒙的 UIAbility 更像一个”带窗口的进程入口”。

1
2
3
4
5
UIAbility.onCreate
  → 加载首页 (路由 "/")
  → 用户点「详情」→ router.pushUrl("/detail")  // 不创建新 UIAbility
  → 按返回 → router.back()
UIAbility.onDestroy

ExtensionAbility 是”无 UI 的能力单元”:ServiceExtensionAbility(后台任务)、FormExtensionAbility(桌面卡片)、InputMethodExtensionAbility(输入法),每种都有预定义的生命周期。

3. Want:鸿蒙的分布式 Intent

Want = Android Intent 的鸿蒙版本,区别在于它原生支持跨设备:

1
2
3
4
5
6
7
8
9
// 同一设备
let want: Want = { bundleName: 'com.example.app', abilityName: 'MainAbility' };

// 跨设备——只多一个 deviceId
let crossDeviceWant: Want = {
  ...want,
  deviceId: 'device_abc_123'  // 分布式软总线自动寻址
};
this.context.startAbility(crossDeviceWant);

鸿蒙面试高频题:”分布式能力在代码层怎么体现?”——答案就是 deviceId 参数。

4. AppSpawn:对标 Android Zygote 的应用孵化器

用户点击桌面图标 → AMS 通知 AppSpawn → AppSpawn 预加载了 Ark 引擎 → fork 出子进程直接可用。对比:

 Android Zygote鸿蒙 AppSpawn
预加载内容Java 框架类Ark JS/TS 运行时
启动方式fork + 加载 dexfork + 复用运行时
冷启动速度~200-500ms (ART)理论上更轻量

面试时能说出”AppSpawn 预加载 Ark 引擎,fork 后无需重新初始化”就够了。

5. 线程铁律:主线程永不阻塞

1
2
3
1 个主线程:UI 渲染 + 事件处理 ← 绝对不阻塞
N 个 TaskPool 线程:自动管理,计算任务丢这里
M 个 Worker 线程:独立 JS 运行时,长时间 CPU 密集任务

最简单的记忆法:setTimeout 默认在 TaskPool 执行,但如果 aboutToAppear 里写死循环,UI 照样卡死——因为 aboutToAppear 跑在主线程。

其实你每天都在用

  • Vue 的 ref + watch 和 ArkTS 的 @State + build() 是一回事——声明式响应式的不同方言
  • React Native 的 Bridge 在鸿蒙变成了 NAPI——从异步 JSON 桥进化成了同步函数调用
  • Android 的 Intent 换个名字叫 Want,但鸿蒙多了一个 deviceId 参数让它可以跨设备
  • iOS 的 UIViewController 管理单页面,鸿蒙的 UIAbility 管理多页面——这是从 UIKit 转鸿蒙最需要适应的差异
  • Web 的 Service Worker 在鸿蒙就是 ExtensionAbility——无 UI 的后台能力单元

常见误解(FAQ)

❌ 误区:ArkTS 是全新语言,需要从头学。

✅ ArkTS 是 TypeScript 超集。你会 TS 就已经掌握了 80%,剩下 20% 是装饰器语法和链式 API。和 SwiftUI 的 @State、Jetpack Compose 的 remember 是同一类声明式范式。

❌ 误区:鸿蒙应用每个页面都应该是一个 UIAbility。

✅ Stage 模型下推荐 1 个 UIAbility 管理所有页面。只有需要独立窗口(如悬浮播放器)或独立进程时才拆分。多 UIAbility 带来额外的进程开销和启动延迟——面试官喜欢听到”我知道什么时候不该拆”。

❌ 误区:元服务和完整 App 是两套架构。

✅ 同一套 Stage 模型、同一套 UI 框架、同一套 Ability 生命周期。唯一区别是 HAP 包 ≤10MB,逼你做按需加载。搞清楚这个等于同时搞定了两个面试题。

❌ 误区:鸿蒙的链式 API 和 CSS 可以混用。

✅ ArkTS 的渲染引擎不是浏览器 DOM,没有 CSS 选择器、没有盒模型、没有 display: flex。样式全部用链式 API:.fontSize(18).fontColor(Color.Blue).padding(12)。Web 前端转鸿蒙最容易犯这个错误。

一句话总结

鸿蒙应用架构 = ArkTS 声明式 UI + Stage 模型组件化 + AppSpawn 轻量进程 + 分布式软总线跨设备——四个词讲完,面试官就知道你真的理解架构了。

本文由作者按照 CC BY 4.0 进行授权