鸿蒙OS 5 架构设计探秘:从分层设计到多端部署
文章目录
- 鸿蒙OS架构设计探秘:从分层设计到多端部署
- 一、鸿蒙的分层架构设计
- 二、模块化设计的精髓
- 三、智慧分发设计:资源的动态调度
- 四、一次开发,多端部署的实践
- 总结与思考
鸿蒙OS架构设计探秘:从分层设计到多端部署
最近两年来,我一直在跟进鸿蒙系统的发展,从EMUI到HarmonyOS,见证了这个国产操作系统从无到有的成长历程。今天想和大家分享一下我对鸿蒙系统架构的理解和实践心得。
一、鸿蒙的分层架构设计
鸿蒙OS采用了一种独特的"1+8+N"分层架构,这和我们熟悉的Android、iOS有很大不同。这种架构让整个系统更加灵活,能更好地适应从智能手表到车机等不同设备。
从底层到上层,鸿蒙系统主要分为:
- 内核层:包括鸿蒙微内核、Linux内核和LiteOS
- 系统服务层:提供基础系统能力
- 框架层:为应用开发提供API
- 应用层:用户可见的应用程序
这种设计的最大优势在于"硬件下沉,应用上浮"。简单来说就是让硬件适配更简单,应用开发更统一。
来看一个调用系统服务的简单代码示例:
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%')}
}
总结与思考
经过几年发展,鸿蒙系统的架构设计已经变得相当成熟。分层架构提供了清晰的系统边界,模块化设计增强了系统灵活性,智慧分发机制优化了资源利用,而多端部署能力则大大提升了开发效率。
不过,作为一个从业多年的开发者,我也要实事求是地说,鸿蒙系统还有很长的路要走。特别是在生态建设方面,还需要吸引更多开发者参与。
最后想说,技术没有国界,但产品有祖国。鸿蒙的发展代表了中国在操作系统领域的一次重要突破,值得我们每一个开发者去了解和支持。
有什么问题欢迎在评论区讨论,我会尽量解答大家的疑问。下期我打算分享一下鸿蒙应用上架的那些坑,敬请期待!
你们觉得鸿蒙系统的哪个设计理念最吸引你?欢迎留言讨论~
相关文章:
鸿蒙OS 5 架构设计探秘:从分层设计到多端部署
文章目录 鸿蒙OS架构设计探秘:从分层设计到多端部署一、鸿蒙的分层架构设计二、模块化设计的精髓三、智慧分发设计:资源的动态调度四、一次开发,多端部署的实践总结与思考 鸿蒙OS架构设计探秘:从分层设计到多端部署 最近两年来&a…...
5. 实现一个中间件
原文地址: 实现一个中间件 更多内容请关注:php代码框架 理解中间件 中间件(Middleware) 是一种在请求被路由到控制器方法之前或响应返回客户端之前执行的代码。它通常用于处理通用任务,如身份验证、日志记录、CORS 处理等。 在…...
JVM 为什么不使用引用计数算法?——深入解析 GC 策略
在 Java 中,垃圾回收(Garbage Collection, GC)是一个至关重要的功能,它能够自动管理内存,回收不再使用的对象,从而防止内存泄漏。然而,在垃圾回收的实现上,JVM 并未采用引用计数算法…...
【HarmonyOS NEXT】EventHub和Emitter的使用场景与区别
一、EventHub是什么? 移动应用开发的同学应该比较了解EventHub,类似于EventBus。标准的事件广播通知,订阅,取消订阅的处理。EventHub模块提供了事件中心,提供订阅、取消订阅、触发事件的能力。 类似的框架工具有很多…...
01-系统编程
一、程序和进程的区别: window系统: 1、程序存储在硬盘中,文件格式为.exe后缀,静态的 2、进程运行在内存中,动态的 Linux系统 1、程序存储在硬盘中,文件格式为.ELF(可执行的链接文件&#…...
Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接
一、gcc/g基础认知 在Linux开发环境中,gcc和g是我们最常用的编译器工具: gcc:GNU C Compiler,专门用于编译C语言程序g:GNU C Compiler,用于编译C程序(也可编译C语言) 📌…...
UMI-OCR Docker 部署
额外补充 Docker 0.前置条件 部署前,请检查主机的CPU是否具有AVX指令集 lscpu | grep avx 输出如下即可继续部署 Flags: ... avx ... avx2 ... 1.下载dockerfile wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Do…...
26考研|数学分析:定积分及应用
这一部分作为数学分析的灵魂,在数学分析的计算中,绝大部分的问题都可以转换成定积分的计算问题,所以在这部分的学习中,一定要注意提升计算能力,除此之外,由积分引出的相关积分不等式也是分析的重点和难点&a…...
React Hooks使用方法:useState,useRef,useEffect,useReducer,useContext用法实战案例
react hooks介绍,包括了state,ref,effect,reducer,context等常见hooks,也包括forwardRef和createContext用法,下面看代码吧,我用的是js写的。每个hook都做了个案例。 // 使用state来…...
线程池详解:在SpringBoot中的最佳实践
线程池详解:在SpringBoot中的最佳实践 引言 在Java并发编程中,线程池是一种非常重要的资源管理工具,它允许我们在应用程序中有效地管理和重用线程,从而提高性能并降低资源消耗。特别是在SpringBoot等企业级应用中,正…...
扩展卡尔曼滤波
1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统,扩展卡尔曼滤波 则扩展到了非线性系统,核心原理就是将非线性系统线性化,主要用的的知识点是 泰勒展开(我另外一篇文章的链接),如下是泰勒展开的公式…...
AI作为学术评审专家有哪些优缺点?
大家好这里是AIWritePaper官方账号,官网👉AIWritePaper论文完成初稿之后,一般情况下,宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易,即使对老师来说,找人评审论文也是一件苦活。我们这个时…...
微信小程序登录和获取手机号
目录 准备工作 实现流程 实现代码 公共部分 通过code获取openid等信息 解密手机号 扩展 不借助工具类实现解密 借助工具类获取access_token 准备工作 需要小程序账号(可以去微信公众平台创建一个测试号或者正式号) appid:小程序id …...
4.Matplotlib:基础绘图
一 直方图 1.如何构建直方图 将值的范围分段,将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 2.直方图的适用场景 一般用横轴表示数据类型,纵轴表示分布情况。 直方图可以用于识别数据的分布模式和异常值,以及观察数…...
与Aspose.pdf类似的jar库分享
如果你在寻找类似于 Aspose.PDF 的 JAR 库,这些库通常用于处理 PDF 文档的创建、编辑、转换、合并等功能。以下是一些类似的 Java 库,它们提供 PDF 处理的功能,其中一些是收费的,但也有开源选项: 1. iText (iText PDF…...
VSCode 市场发现恶意扩展正在传播勒索软件!
在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店,但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld,目前已从商店中删除。 此外,ahban.cychelloworld 扩展于 2024 年 10 月…...
工作流引擎Flowable介绍及SpringBoot整合使用实例
Flowable简介 Flowable 是一个轻量级的业务流程管理(BPM)和工作流引擎,基于 Activiti 项目发展而来,专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…...
K8s证书--运维之最佳选择(K8s Certificate - the best Choice for Operation and Maintenance)
K8s证书--运维之最佳选择 No -Number- 01 一个月速通CKA 为了速通CKA,主要办了两件事情 1. 在官方的Killercoda上,练习CKA的题目。把命令敲熟悉。 // https://killercoda.com/killer-shell-ckad 2. 使用K3s在多台虚拟机上快速搭建了K8s集群&…...
MySQL 8.0.41源码目录深度解析:探索数据库内核的架构蓝图
文章目录 MySQL 8.0.41源码目录深度解析:探索数据库内核的架构蓝图一、MySQL 8.0.41 目录结构总览1.1 安装目录核心子目录1.2 数据目录关键组件 二、核心源码模块剖析2.1 SQL 引擎核心(sql / 目录)2.1.1 核心组件2.1.2 架构亮点 2.2 存储引擎…...
Leaflet.js+leaflet.heat实现热力图
Leaflet热力图 #mermaid-svg-I1zXN0OrNCBGKEWy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-icon{fill:#552222;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-text{fill:#552222;stroke:#5522…...
通过git文件查看大模型下载链接的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
多源最短路:Floyd算法の暴力美学
多源最短路求解的是图中的任意两个节点之间的最短路。 前文我们已经讲过单源最短路,我们完全可以做n次单源最短路算法,求出任意两节点的最短距离。最快的堆优化版的 dijkstra 算法的时间复杂度为o(m * logm),枚举n次时…...
初教六双机一飞冲天动作要领
初教六双机一飞冲天动作要领 初教六双机“一飞冲天”是典型的垂直爬升特技动作,要求双机以近乎垂直的姿态同步高速爬升,展现飞机的动力性能与编队协同能力。以下是该动作的详细技术解析与执行要点: 一、动作定义与特点 基本形态 双机以相同速…...
qtcore在docker容器中运行
FROM ubuntu # 设置时区环境变量 ENV TZAsia/Shanghai RUN echo "${TZ}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ && apt update \ && apt install -y tzdata \ && rm -rf /var/lib/apt…...
simpleITK - Setup - Pythonic Syntactic Sugar
Pythonic Syntactic Sugar Image Basics Notebook 非常简单,与 ITK 的 C 接口非常接近。 Sugar非常棒,它能让你精力充沛,更快地完成任务!SimpleITK 也应用了大量Sugar来帮助更快地完成任务。 %matplotlib inline import matplo…...
【leetcode hot 100 215】数组中的第K个最大元素
解法一:维护最大最小值 -> 堆 -> k个元素的最小值堆 class Solution {public int findKthLargest(int[] nums, int k) {// 维护最大最小值 -> 堆 -> k个元素的最小值堆PriorityQueue<Integer> heap new PriorityQueue<>((n1, n2) -> n…...
下载vmware17
我用VMware10安装ubuntu24,死活不能成功,要么突然退出,要么装着装着,眼看完成,居然卡住不动,一查日志,提示光盘读取失败(用的ISO文件,居然装模作样的说光驱读取失败&…...
德昂观点:如何看待MicroStrategy改名为Strategy?
2025年2月,纳斯达克上市公司MicroStrategy(股票代码:MSTR)宣布更名为“Strategy”,并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新,更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…...
嵌入式八股RTOS与Linux---网络系统篇
前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块 这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…...
Django 生成 ssl 安全证书,切换 https、wss协议(daphne 、nginx)
Django 普通 http 协议不够安全,无法支持连接本地摄像头(虽然在本地 localhost 上能连),此时需要切换成 https 协议(先提个醒,我这个方法最后失败了,不过对您应该也有帮助) 目录 配置…...
