都 2025 了,还分不清鸿蒙和安卓?——一次把「鸿蒙操作系统总体架构」讲清楚,你说香不香?

举报
bug菌 发表于 2025/11/01 20:14:40 2025/11/01
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 前言老实讲,第一次上手鸿蒙(HarmonyOS / OpenHarmo...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

老实讲,第一次上手鸿蒙(HarmonyOS / OpenHarmony)的时候,我也被它“既熟悉又陌生”的气质拿捏了:看着像移动 OS,骨子里却是“多设备协同”的分布式系统思维。今天这篇,我们不打官腔、不讲玄学,拿出工程视角可运行代码,把“系统分层结构”“关键特性”到“与 Android 的异同”一股脑梳顺。放心,过程有梗,内容有干货,且尽量“去模板化、去套路化”,写出点“人味儿”。🙂


目录速览

  • 前言:为什么又是“分布式”?

  • 总览:一图带你理解鸿蒙的“层、面、域”

  • 系统分层结构

    • 内核层(微内核/内核服务、HDF、驱动框架)
    • 系统服务与框架层(分布式子系统、图形/多媒体、数据/安全/调度)
    • 应用层(ArkTS 生态、UIAbility、Stage 模型)
  • 关键特性

    • 分布式能力(SoftBus、分布式数据、分布式任务调度)
    • 轻量化(最小系统、可插拔子系统、裁剪能力)
    • 多设备协同(跨屏流转、跨设备调用、同构 API)
  • 与 Android 的异同(工程师视角表格 + 讲人话解读)

  • 实战代码演示(ArkTS)

    • UIAbility + 分布式数据对象(跨设备状态同步)
    • 设备发现与文件跨端传输(示意)
    • Ability 之间的任务调度与权限要点
  • 性能与安全:调度、内存、权限与沙箱

  • 工程化落地:测试、包体积治理与 CI/CD 线索

  • 总结与延伸:从“手机操作系统”到“设备操作系统”的思维改造


前言:为什么又是“分布式”?我手机就一台啊…

先别急着吐槽。移动端过去十年最大的变化,是“设备从一台变成一群”:手机、手表、耳机、平板、车机、电视、甚至家里那台老冰箱都在喊“我也要联网”。当设备彼此要共享算力、数据与交互时,传统“单机操作系统 + App”这套范式就显得不够用了——你总不能在五六台设备上各装一份重逻辑,还手搓一堆 RPC、鉴权、容错吧?
  鸿蒙选择了一条更“系统级”的路:把分布式抽象下沉到 OS 与系统服务层,给开发者提供一致的 API 与能力,让“跨端像跨进程”一样自然。理念不复杂,但工程实现真不简单。


总览:一张脑图看鸿蒙(简化示意)

应用层(ArkTS/ETS、UIAbility、Extension、JS/Native)
  └─ 分布式应用框架(Ability、路由、资源、窗口)
     └─ 系统服务层(图形/多媒体、数据管理、安全、调度、网络)
        └─ 分布式子系统(SoftBus、分布式数据、分布式文件/任务调度)
           └─ 设备驱动框架 HDF(统一驱动模型/适配)
              └─ 内核层(微内核/内核服务:进程/线程/IPC/内存/调度/驱动)

记住一个关键词就够:分布式在“系统服务层”做了真功夫,应用层才能写得“像写本地”。


系统分层结构(内核、框架、应用层)

1)内核层:微内核 + HDF,核心职责够“克制”

  • 微内核思想:把内核职责“减到最小”:进程/线程管理、地址空间、进程间通信(IPC)、基础调度、最小驱动能力。其他能力(文件系统、网络栈、图形、多媒体…)尽可能放到用户态服务去做。这意味着更好的安全隔离与可演进性
  • HDF(Hardware Driver Foundation):统一驱动框架,提供标准化驱动模型、配置与热插拔能力。换句话说,同一类硬件在不同设备形态上能以较统一的方式被系统识别和管理。
  • 多内核形态:针对不同内存与算力档位的设备,内核可裁剪;从“极轻量”的 IoT 设备,到具备复杂 UI 的终端,一套架构跨形态

小结一句:内核保持“瘦”,服务移到“外”,让“更新”和“安全”都更可控。


2)系统服务与框架层:这里,是鸿蒙“分布式”的灵魂

  • 分布式子系统

    • SoftBus:统一的设备发现、连接与消息通道抽象;跨 Wi-Fi/蓝牙等网络,屏蔽差异,提供统一编程接口
    • 分布式数据/文件/任务调度:把“跨设备的数据/任务/文件”当成系统能力来提供,开发者写起来更像“用本地 API”。
  • 通用系统服务:图形(窗口/合成/动效)、多媒体(音视频编解码/渲染)、网络(协议栈)、数据管理(KV/关系/对象)、安全(权限、密钥、Sandbox)、调度(前后台、优先级、功耗治理)。

  • 应用框架(Ability 框架)

    • UIAbility(Stage 模型):应用的“UI 入口”;与 Android 的 Activity 有点像,但更偏向多设备协同场景设计。
    • Extension:扩展型能力(如 ServiceAbility 的替代形态)以及与系统服务交互的“长生命周期”组件。
    • 资源/路由/窗口管理:支持分屏、跨设备迁移等场景。

3)应用层:ArkTS 时代的“同构体验”

  • ArkTS / ETS:面向鸿蒙的第一语言(TypeScript 超集),语法对前端/全栈很友好;声明式 UI + 响应式状态

  • App 模型

    • UIAbility:图形界面主载体;
    • 分布式数据对象(DDO)分布式路由:简化“跨端状态”与“跨端导航”。
  • Native 能力:C/C++/Rust 可用于性能关键路径;NAPI 提供 JS ↔ Native 互通;多媒体/图形可走 Native Pipeline。

  • 签名与权限:应用由签名与权限声明保护,分布式场景下还要考虑跨设备授权链路。


关键特性:分布式、轻量化、多设备协同

A. 分布式(核心里的核心)

  • 统一发现与连接(SoftBus):设备间“看到彼此、说上话”。
  • 分布式数据:把跨设备的 KV/对象同步变成“像用本地状态”的体验;冲突解决与一致性由系统/框架兜底。
  • 分布式任务调度:把某段计算从 A 设备迁到 B 设备(比如让电视/平板去算、手机只展示),由系统服务调度计算位置与数据路径。
  • 分布式 UI 流转:典型场景:手机上点开视频 → 一键流转到电视继续播;不是单纯投屏,而是更“应用态”的迁移。

B. 轻量化(不是口号,是工程策略)

  • 子系统可裁剪:迷你 IoT 设备不需要完整多媒体栈;按需拼装降低资源占用。
  • 最小系统镜像:小到几百 KB ~ 几 MB 的形态也能跑;这不是“缩水版手机 OS”,而是同一体系结构的另一侧
  • 统一驱动与配置:HDF 让驱动移植成本下降,便于覆盖更多设备形态。

C. 多设备协同(开发者真的能用得上)

  • 跨屏交互统一范式:资源定位、窗口/输入抽象、权限委派,都有系统一套
  • 同构 API:你写的 ArkTS 组件,大概率在不同屏幕形态下只需适配布局,无需重写业务逻辑。
  • 生态串联:从手机到车机、穿戴,借助分布式数据与 SoftBus,能把“碎片化体验”拧成连续体验

与 Android 的异同(工程师不拐弯抹角版)

维度 鸿蒙(HarmonyOS/OpenHarmony) Android
内核哲学 微内核导向:内核做最少,更多服务在用户态;HDF 统一驱动框架 宏内核(Linux):大量子系统在内核态;驱动走 Linux 模型
分布式能力 系统级内建(SoftBus、分布式数据/文件/任务),跨设备像跨进程 非系统内建;更多依赖上层框架、厂商方案或自研 RPC
应用模型 UIAbility + Extension(Stage 模型)、ArkTS 优先、声明式 UI Activity/Service/Broadcast/ContentProvider(四大组件),多以 Java/Kotlin
生态语言 ArkTS/ETS 为主,NAPI 走 Native;强调“分布式一致 API” Kotlin/Java 主流,NDK/C++;分布式无统一抽象
设备覆盖 从极轻 IoT 到大屏/车机/手机的同一体系裁剪 移动/TV/Wear 等形态,IoT 更常见是 AOSP 改造或定制 Linux
权限模型 分布式场景下的跨设备权限链路与能力授权 单设备权限为主,跨端协同非系统内建能力
更新与演进 系统服务在用户态更易演进,微内核利于故障隔离 Linux 子系统更新与碎片化挑战并存
开发心智 把“跨设备”当成一等公民来设计 把“单设备 App”做好,再视需要接入跨端 SDK

人话版总结:Android 像“单机 OS + 丰富应用框架”鸿蒙像“多设备 OS + 分布式中台”。做单机,二者都行;做跨设备一体化体验,鸿蒙“开箱即用”的味儿更浓。


实战代码演示(ArkTS / ETS)

以下示例基于 Stage 模型ArkTS 风格,展示 UIAbility、分布式数据对象与设备发现/传输的常见套路。命名与数据结构做了简化,便于速读与复用。

1)UIAbility:应用入口与窗口管理(EntryAbility.ets

// ./entry/src/main/ets/entryability/EntryAbility.ets
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
import hilog from '@ohos.hilog';

export default class EntryAbility extends UIAbility {
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'Demo', 'EntryAbility onCreate');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err) {
        hilog.error(0x0000, 'Demo', `loadContent failed: ${JSON.stringify(err)}`);
        return;
      }
      hilog.info(0x0000, 'Demo', 'loadContent ok');
    });
  }
}

2)声明式 UI + 响应式状态(pages/Index.ets

// ./entry/src/main/ets/pages/Index.ets
import { observe } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  @State counter: number = 0;

  build() {
    Column() {
      Text(`Hello HarmonyOS: ${this.counter}`)
        .fontSize(22).fontWeight(FontWeight.Bold).margin({ bottom: 16 })

      Button('Increase', { type: ButtonType.Capsule })
        .onClick(() => this.counter++)
        .width('50%')

      Navigator({ target: 'pages/Devices' }) {
        Text('Go to Devices').fontSize(18)
      }.margin({ top: 20 })
    }.padding(24).width('100%').height('100%')
  }
}

3)分布式数据对象:跨设备自动同步(distributed/CounterStore.ets

// ./entry/src/main/ets/distributed/CounterStore.ets
import distributedDataObject from '@ohos.data.distributedDataObject';

export class CounterStore {
  private static instance: CounterStore;
  private ddo: distributedDataObject.DataObject;

  static async get() {
    if (!this.instance) {
      const obj = distributedDataObject.create({ counter: 0 }, { schema: { counter: 'number' } });
      await obj.bindToNetwork({ // 绑定到分布式网络,允许其他设备订阅
        enable: true,
        allowAnonymous: false
      });
      this.instance = new CounterStore(obj);
    }
    return this.instance;
  }

  private constructor(obj) { this.ddo = obj; }

  get value(): number { return this.ddo['counter']; }

  increase() { this.ddo['counter'] = this.value + 1; } // 更新后会自动同步到已加入会话的其他设备
}

在页面里使用它,实现跨设备共享计数

// ./entry/src/main/ets/pages/Devices.ets
import { CounterStore } from '../distributed/CounterStore';

@Entry
@Component
struct Devices {
  @State value: number = 0;

  aboutToAppear() {
    CounterStore.get().then(store => {
      this.value = store.value;
      // 简易监听:当分布式对象更新,驱动 UI 变化
      setInterval(() => this.value = store.value, 300);
    });
  }

  build() {
    Column() {
      Text(`Shared Counter: ${this.value}`).fontSize(20).margin({ bottom: 16 })
      Button('Increase Remotely')
        .onClick(async () => (await CounterStore.get()).increase())
    }.padding(24)
  }
}

效果:两台设备加入同一分布式会话后,任意一端点击按钮,两端数字一起涨。这就是“像改本地数据一样”去做跨设备同步的日常体验。

4)设备发现 + 跨端文件传输(示意)

// ./entry/src/main/ets/device/DeviceBridge.ets
import deviceManager from '@ohos.distributedDeviceManager';
import fileTransfer from '@ohos.file.transfer'; // 伪名示意;实际以当前 SDK 能力为准
import fs from '@ohos.file.fs';

export class DeviceBridge {
  private dm = deviceManager.createDeviceManager('demo.app');

  startDiscovery(onFound: (device) => void) {
    this.dm.on('deviceFound', onFound);
    this.dm.startDeviceDiscovery({ subscribeId: 1001, mode: 1 /* 近场 */ });
  }

  async sendFile(deviceId: string, localPath: string, remotePath: string) {
    const file = await fs.open(localPath);
    const session = await fileTransfer.openSession({ deviceId });
    await session.pushFile(file.fd, remotePath, { overwrite: true });
    await session.close();
  }
}

工程提示:实际项目要补传输完整性校验、断点续传、加密与权限;上面是“把架子搭起来”的最低示范。

5)任务调度与权限(轻示例)

// ./entry/src/main/ets/tasks/Offload.ets
import { startRemoteTask } from '@ohos.distributed.scheduler'; // 示意
import accessToken from '@ohos.security.accessToken';

export async function runOnDevice(deviceId: string, payload: object) {
  // 申请/检查权限(示意)
  const ok = await accessToken.verify('DISTRIBUTED_TASK');
  if (!ok) throw new Error('Permission denied');

  // 把计算 offload 到目标设备
  return await startRemoteTask({
    deviceId,
    task: 'heavyCompute',
    args: payload
  });
}

性能与安全:我们得聊点“真工程”

性能面

  • 跨设备 ≠ 免费午餐:SoftBus 的传输延迟、带宽上限、连接稳定性都要纳入设计。二八原则:把 80% 的计算放在更合适的设备上(例如离数据近的设备),剩余 20% 再远程。
  • 渲染管线:复杂动效和视频合成尽量走系统多媒体/图形服务链路;避免在应用层“重复造轮子”。
  • 状态最小化:分布式数据请小步表达(差量同步、幂等更新),不要拿它当“网盘”。
  • 功耗策略:长连、监听、心跳都得设上限;无用户可见时降采样/减频率

安全面

  • 分布式权限链:跨设备访问要有明确主体、客体、用途;临时授权 vs. 长期授权要区分。
  • 数据落地策略:是否落本地、落密文、仅内存?敏感字段单独加密,密钥与业务分开管理
  • 传输层加固:握手、会话、重放攻击、MITM;不要把“近场”当成“安全”。

工程化落地:测试、包体积与 CI/CD

  • 测试分层

    1. 纯单元(逻辑与状态机);
    2. 组件级(ArkTS 视图与状态绑定);
    3. 分布式集成(两设备串联流程录制 + 断网/弱网回放);
    4. 端到端(E2E)(真实设备农场,覆盖流转与权限交互)。
  • 包体积治理:资源分包、特性动态化、按形态裁剪子系统;监控冷启动体积资源冗余

  • CI/CD

    • 代码扫描(权限声明、敏感 API 用量);
    • 分布式用例回归集
    • 多形态设备并行打包(手机/平板/车机 profile);
    • 产物签名与灰度策略(按设备类型/版本投放)。

一句带走:做“单机”看 Android,做“多设备”看鸿蒙

鸿蒙的杀手锏是把“分布式能力”沉到底层、露到上层,让你写跨设备像写跨进程一样自然。Android 的强项仍是成熟生态与海量工具链,做单设备应用依然香。
  如果你的产品蓝图不只是一块屏,而是一串屏、一道声、一次连续体验——那就把鸿蒙当作**一套“多设备操作系统平台”**去思考与设计。思维一旦转过去,很多事情会突然变简单:不是“怎么把 A 端投到 B 端”,而是“怎么让 A 和 B 像一台机”


延伸阅读与实战清单(自查表)

  • [ ] 分布式数据对象是否“最小表达 + 幂等更新”?
  • [ ] 跨设备权限是否分级:临时授权、强提醒、场景化回收?
  • [ ] 设备发现/会话建立是否考虑弱网/重试/熔断?
  • [ ] 任务调度是否做到就近计算可回滚
  • [ ] UIAbility/Extension 生命周期与后台策略是否覆盖?
  • [ ] 资源与包体积是否做分形态裁剪与按需加载?
  • [ ] CI 是否包含“双设备 E2E 测试矩阵 + 弱网回放”?

彩蛋:两句掏心窝子的话

  • 架构没有银弹,只有成本-收益曲线。鸿蒙把分布式做成“系统能力”,是为了让这条曲线更好看
  • 写跨设备应用,像组乐队:手机是主唱,平板是键盘,手表是鼓,电视是贝斯。鸿蒙做的是调音台。你只管编曲与演出。🎸

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。