鸿蒙OS 5 架构设计探秘:从分层设计到多端部署

文章目录

  • 鸿蒙OS架构设计探秘:从分层设计到多端部署
    • 一、鸿蒙的分层架构设计
    • 二、模块化设计的精髓
    • 三、智慧分发设计:资源的动态调度
    • 四、一次开发,多端部署的实践
    • 总结与思考

鸿蒙OS架构设计探秘:从分层设计到多端部署

最近两年来,我一直在跟进鸿蒙系统的发展,从EMUI到HarmonyOS,见证了这个国产操作系统从无到有的成长历程。今天想和大家分享一下我对鸿蒙系统架构的理解和实践心得。

一、鸿蒙的分层架构设计

鸿蒙OS采用了一种独特的"1+8+N"分层架构,这和我们熟悉的Android、iOS有很大不同。这种架构让整个系统更加灵活,能更好地适应从智能手表到车机等不同设备。

从底层到上层,鸿蒙系统主要分为:

  1. 内核层:包括鸿蒙微内核、Linux内核和LiteOS
  2. 系统服务层:提供基础系统能力
  3. 框架层:为应用开发提供API
  4. 应用层:用户可见的应用程序

这种设计的最大优势在于"硬件下沉,应用上浮"。简单来说就是让硬件适配更简单,应用开发更统一。

来看一个调用系统服务的简单代码示例:

import systemParameter from '@ohos.systemparameter';// 获取系统参数示例
export default {getSystemInfo() {try {// 获取设备类型const deviceType = systemParameter.getSync("const.build.characteristics");console.info(`当前设备类型: ${deviceType}`);// 获取系统版本const osVersion = systemParameter.getSync("const.product.software.version");console.info(`系统版本: ${osVersion}`);return {deviceType, osVersion};} catch(error) {console.error(`获取系统参数失败: ${error.message}`);return null;}}
}

记得我刚开始接触这套架构时,还挺不习惯的,但用久了就发现,这种分层确实让跨设备开发更加一致。

二、模块化设计的精髓

鸿蒙系统的另一大亮点是其模块化设计思想。系统功能被拆分成一个个相对独立的"功能卡片",可以根据设备能力进行组合。

这让我想起微服务架构,只不过鸿蒙把这种思想应用到了操作系统级别。对我们开发者而言,最直观的体现就是Ability机制。

在HarmonyOS中,应用由一个或多个Ability组成,主要分为:

  • FA (Feature Ability): 带UI的Ability
  • PA (Particle Ability): 无UI的后台服务

看一个简单的Ability示例:

import Ability from '@ohos.application.Ability'export default class MainAbility extends Ability {onCreate(want, launchParam) {console.log("[Demo] MainAbility onCreate")// 能力创建时的初始化工作globalThis.abilityWant = want;}onDestroy() {console.log("[Demo] MainAbility onDestroy")}onWindowStageCreate(windowStage) {console.log("[Demo] MainAbility onWindowStageCreate")// 加载UI页面windowStage.loadContent('pages/index', (err, data) => {if (err.code) {console.error(`Failed to load content. Cause: ${JSON.stringify(err)}`)return}console.info("Succeeded in loading content.")})}// 其他生命周期方法...
}

我记得有次做一个跨设备项目时,这种模块化设计帮了大忙。同样的业务逻辑,只需要针对不同设备适配不同UI就行,省了不少工作量。

三、智慧分发设计:资源的动态调度

智慧分发可能是鸿蒙系统中最让我惊艳的部分。它能根据用户行为和设备状态,智能地分配系统资源,确保前台应用的流畅体验。

举个例子,当用户在玩游戏时,系统会自动为游戏分配更多计算资源;当接到重要通知时,系统会确保通知能及时展示。这种设计让整个系统感觉更"聪明"。

实现这一点的关键在于鸿蒙的分布式调度器。我们可以通过类似这样的代码来设置应用优先级:

import resourceSchedule from '@ohos.resourceschedule.resourceManager';// 申请重要前台任务优先级
try {// 创建资源使用信息let resourceRequest = {"resourceType": resourceSchedule.ResourceType.CPU,"resourceLevel": resourceSchedule.ResourceLevel.HIGH};// 申请资源resourceSchedule.applyResourceRequest(resourceRequest).then(() => {console.info('资源申请成功,开始执行重要计算任务');performHeavyTask();}).catch((err) => {console.error(`资源申请失败: ${err.message}`);});
} catch(error) {console.error(`操作异常: ${error}`);
}function performHeavyTask() {// 执行需要高CPU优先级的任务// ...// 任务完成后,释放资源resourceSchedule.releaseResourceRequest().then(() => {console.info('资源已释放');});
}

之前接触过一个项目,我们需要在多种设备上运行复杂的图像处理算法。通过智慧分发机制,我们实现了根据设备性能自动调整处理精度的功能,让用户体验更加一致。

四、一次开发,多端部署的实践

这可能是大多数开发者最关心的部分。鸿蒙系统承诺"一次开发,多端部署",那么实际效果如何呢?

从我这两年的经验来看,情况是这样的:框架确实提供了统一的开发范式,但要做到真正的一码多端,还需要不少额外工作。

鸿蒙使用ArkUI作为UI框架,支持声明式开发范式。它有点像React和Flutter的结合体,学习曲线不算陡峭。

看个响应式多端适配的例子:

@Entry
@Component
struct ResponsiveLayout {@State screenType: string = 'unknown';aboutToAppear() {// 获取设备信息并设置屏幕类型this.detectScreenType();}detectScreenType() {// 这里应该是根据设备实际尺寸判断const windowWidth = px2vp(window.innerWidth);if (windowWidth < 600) {this.screenType = 'phone';} else if (windowWidth < 1200) {this.screenType = 'tablet';} else {this.screenType = 'desktop';}}build() {Column() {Text(`当前设备类型: ${this.screenType}`).fontSize(20).margin(20)if (this.screenType === 'phone') {this.buildPhoneLayout()} else if (this.screenType === 'tablet') {this.buildTabletLayout()} else {this.buildDesktopLayout()}}.width('100%').height('100%')}@BuilderbuildPhoneLayout() {Column() {Text("手机布局").fontSize(18)// 手机专用组件布局}.width('100%')}@BuilderbuildTabletLayout() {Row() {Text("平板布局").fontSize(18)// 平板专用布局}.width('100%')}@BuilderbuildDesktopLayout() {Column() {Text("桌面布局").fontSize(18)// 桌面专用布局}.width('100%')}
}

总结与思考

经过几年发展,鸿蒙系统的架构设计已经变得相当成熟。分层架构提供了清晰的系统边界,模块化设计增强了系统灵活性,智慧分发机制优化了资源利用,而多端部署能力则大大提升了开发效率。

不过,作为一个从业多年的开发者,我也要实事求是地说,鸿蒙系统还有很长的路要走。特别是在生态建设方面,还需要吸引更多开发者参与。

最后想说,技术没有国界,但产品有祖国。鸿蒙的发展代表了中国在操作系统领域的一次重要突破,值得我们每一个开发者去了解和支持。

有什么问题欢迎在评论区讨论,我会尽量解答大家的疑问。下期我打算分享一下鸿蒙应用上架的那些坑,敬请期待!


你们觉得鸿蒙系统的哪个设计理念最吸引你?欢迎留言讨论~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41407.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib——南丁格尔玫瑰

南丁格尔玫瑰图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;是一种特殊形式的柱状图&#xff0c;它以南丁格尔&#xff08;Florence Nightingale&#xff09;命名&#xff0c;她在1858年首次使用这种图表来展示战争期间士兵死亡原因的数据。 它将数据绘制在极坐…

【大模型基础_毛玉仁】4.4 低秩适配方法

目录 4.4 低秩适配方法4.4.1 LoRA1&#xff09;方法实现2&#xff09;参数效率 4.4.2 LoRA 变体1&#xff09;打破低秩瓶颈&#xff08;例ReLoRA&#xff09;2&#xff09;动态秩分配&#xff08;例AdaLoRA&#xff09;3&#xff09;训练过程优化&#xff08;例DoRA&#xff09…

融合YOLO11与行为树的人机协作智能框架:动态工效学优化与自适应安全决策

人工智能技术要真正发挥其价值&#xff0c;必须与生产生活深度融合&#xff0c;为产业发展和人类生活带来实际效益。近年来&#xff0c;基于深度学习的机器视觉技术在工业自动化领域取得了显著进展&#xff0c;其中YOLO&#xff08;You Only Look Once&#xff09;算法作为一种…

Java为什么要使用线程池?

前言1.对线程的管理更加的规范化2.降低创建线程和销毁线程的开销 前言 之前对于Java线程池的理解&#xff0c;一直停留在&#xff1a;对于Java中的多线程机制来说&#xff0c;如果不使用线程池的话&#xff0c;线程的使用就会变得杂乱无章。这一步。一直没有深入去理解为什么其…

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果&#xff1a; 从 MySQL 迁移至 TDengine 后&#xff0c;设备数据自动分片&#xff0c;运维更简单。 列式存储可减少 50% 的存储占用&#xff0c;单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内&#xff0c;提升应急管理效率。 新架构支持未来…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化时处于内网环境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复&#xff1a; vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题

【Linux】POSIX信号量与基于环形队列的生产消费者模型

目录 一、POSIX信号量&#xff1a; 接口&#xff1a; 二、基于环形队列的生产消费者模型 环形队列&#xff1a; 单生产单消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.cc&#xff1a; 多生产多消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.…

【13】Ajax爬取案例实战

目录 一、准备工作 二、爬取目标 三、初步探索&#xff1a;如何判断网页是经js渲染过的&#xff1f; 四、爬取列表页 4.1 分析Ajax接口逻辑 4.2 观察响应的数据 4.3 代码实现 &#xff08;1&#xff09;导入库 &#xff08;2&#xff09;定义一个通用的爬取方法…

嵌入式八股RTOS与Linux---网络系统篇

前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块   这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练 1.2025新版懒人精灵-实战红果搜索关键词刷视频&#xff1a;https://www.bilibili.com/video/BV1eK9kY7EWV 2.懒人精灵-全分辨率节点识别&#xff08;红果看广告领金币小实战&#xff09;&#xff1a;https://www.bili…

【更新中】【React】基础版React + Redux实现教程(Vite + React + Redux + TypeScript)

本项目是一个在react中&#xff0c;使用 redux 管理状态的基础版实现教程&#xff0c;用简单的案例练习redux的使用&#xff0c;旨在帮助学习 redux 的状态管理机制&#xff0c;包括 store、action、reducer、dispatch 等核心概念。 项目地址&#xff1a;https://github.com/Yv…

【MySQL】从零开始:掌握MySQL数据库的核心概念(四)

人们之所以不愿改变&#xff0c;是因为害怕未知。但历史唯一不变的事实&#xff0c;就是一切都会改变。 前言 这是我自己学习mysql数据库的第四篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的表格约束&#xff0c;没看的同学可以…

AP 场景架构设计(一) :OceanBase 读写分离策略解析

说明&#xff1a;本文内容对应的是 OceanBase 社区版&#xff0c;架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见&#xff1a; 官网链接。 概述​ 当两种类型的业务共同运行在同一个数据库集群上时&#xff0c;这对数据库的配置等条件提出了较高…

CPU架构和微架构

CPU架构&#xff08;CPU Architecture&#xff09; CPU架构是指处理器的整体设计框架&#xff0c;定义了处理器的指令集、寄存器、内存管理方式等。它是处理器设计的顶层规范&#xff0c;决定了软件如何与硬件交互。 主要特点&#xff1a; 指令集架构&#xff08;ISA, Instr…

6.4 模拟专题:LeetCode1419.数青蛙

1.题目链接&#xff1a;数青蛙 - LeetCode 2.题目描述 给定一个字符串 croakOfFrogs&#xff0c;表示青蛙的鸣叫声序列。每个青蛙必须按顺序发出完整的 “croak” 字符&#xff0c;且多只青蛙可以同时鸣叫。要求计算最少需要多少只青蛙才能完成该字符串&#xff0c;若无法完成…

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服务 # user li 20250325# 检查当前用户是否为root用户 # 因为配置DNS服务通常需要较高的权限&#xff0c;只有root用户才能进行一些关键操作 if [ "$USER" ! "root" ]; then# 如果不是root用户&#xff0c;输出错误信息echo "…

Leetcode 二进制求和

java solution class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();//首先设置2个指针, 从右往左处理int i a.length() - 1;int j b.length() - 1;int carry 0; //设置进位标志位//从2个字符串的末尾向前遍历while(…

【NLP 49、提示工程 prompt engineering】

目录 一、基本介绍 语言模型生成文本的基本特点 提示工程 prompt engineering 提示工程的优势 使用注意事项 ① 安全问题 ② 可信度问题 ③ 时效性与专业性 二、应用场景 能 ≠ 适合 应用场景 —— 百科知识 应用场景 —— 写文案 应用场景 —— 解释 / 编写…

【NLP 43、文本生成任务】

目录 一、生成式任务 二、seq2seq任务 1.模型结构 2.工作原理 3.局限性 三、自回归语言模型训练 Decoder only 四、自回归模型结构&#xff1a;文本生成任务 —— Embedding LSTM 代码示例 &#x1f680; 数据文件 代码流程 Ⅰ、模型初始化 Ⅱ、前向计算 代码运行流程 Ⅲ、加载…

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu&#xff0c;并且出现下面的错误打印&#xff1a; [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…