鸿蒙OS 5.0 服务能力框架深入剖析

鸿蒙OS 5.0 服务能力框架中关键类的作用分析

1\. 鸿蒙OS 5.0 服务能力框架导论

鸿蒙OS 5.0,亦称鸿蒙智联 5 1,标志着华为在分布式操作系统领域迈出的重要一步。与早期版本采用兼容安卓的AOSP层、Linux内核以及LiteOS内核不同,鸿蒙OS 5.0 专注于一个统一的微内核架构,旨在提供更强的安全性与更高的性能 1。这种架构的转变对进程间通信机制产生了深远的影响,而进程间通信正是服务能力框架的核心。操作系统的分层架构,从底层的内核层到系统服务层、框架层,再到应用层,为理解服务能力及其相关类在整个系统中的位置提供了基础 3。框架层为开发者提供了创建鸿蒙应用所需的工具,这其中就包含了服务能力框架以及支持多种编程语言的应用程序框架 1。

服务能力(Service Ability,SA)是鸿蒙OS应用的重要组成部分,它与提供用户交互界面的特性能力(Feature Ability,FA)相对应,主要负责处理后台任务并向其他应用或能力提供服务 1。服务能力拥有自身的生命周期,可以被其他能力启动并保持运行,也可以被连接并断开连接,允许多个客户端同时连接到同一个服务能力 5。鉴于服务能力常常需要在不同的进程中运行以实现更好的隔离性和系统稳定性,高效且可靠的进程间通信(Inter-Process Communication,IPC)就显得至关重要 2。在鸿蒙OS 5.0的服务能力框架中,IRemoteBroker、IRemoteStub、IRemoteProxy、IRemoteObject 和 SystemAbility 这五个关键类正是实现和管理这种跨进程通信以及系统级服务的核心组件。理解它们各自的作用以及它们之间的协作方式,对于深入掌握鸿蒙OS 5.0的服务能力开发至关重要。

2\. IRemoteBroker:接口代理人

IRemoteBroker 接口在鸿蒙OS的进程间通信中扮演着至关重要的角色。从本质上讲,它定义了一种契约,用于表示可以被远程访问的对象 6。当一个服务希望将其功能暴露给其他进程时,它会实现一个继承自 IRemoteBroker 的接口。IRemoteBroker 的核心目的是提供一种获取远程对象代理的方式 6。

服务接口通常会继承 IRemoteBroker,这表明该接口定义的方法可以被跨进程调用 6。例如,在代码示例中,IGameInterface 和 ITestAbility 都继承自 IRemoteBroker 6。这种继承关系确保了这些接口遵循鸿蒙OS进程间通信框架的要求,并能够被框架识别和管理为远程服务。一个关键的方法通常与 IRemoteBroker 关联,即 asObject() 7。服务提供者通过实现这个方法返回其自身的 IRemoteObject 实例(通常是 IRemoteStub 的子类),而客户端则通过这个方法获取到远程服务的代理对象 (IRemoteProxy)。因此,IRemoteBroker 不仅是一个标记接口,更重要的是,它提供了一个入口点,使得客户端能够获得与远程服务进行通信的本地代理。

3\. IRemoteStub:服务端的终点

IRemoteStub 是一个抽象基类,它位于服务提供者一侧,负责接收和处理来自远程代理的调用请求 6。当客户端通过 IRemoteProxy 发起一个远程方法调用时,这个请求最终会到达服务端的 IRemoteStub 实例。IRemoteStub 的主要功能在于接收、解封(unmarshalling)来自远程代理的调用请求,并将结果进行封装(marshalling)后返回给远程调用者 7。

IRemoteStub 通常会提供一个关键的抽象方法 OnRemoteRequest() 7。服务开发者需要继承 IRemoteStub 并重写这个方法,以定义如何处理来自不同远程调用的请求。OnRemoteRequest() 方法会接收到调用的代码(transaction code)、包含参数的 MessageParcel 数据包、用于返回结果的 MessageParcel 回复包,以及其他选项 6。在 OnRemoteRequest() 的实现中,开发者需要根据不同的调用代码,从输入的 MessageParcel 中读取参数(解封),然后调用实际的服务实现方法,并将方法的返回值写入到输出的 MessageParcel 中(封装)6。例如,在 GameServiceStub 的代码示例中,onRemoteRequest 方法根据 code 判断是哪个远程方法被调用,然后从 data 中读取参数并执行相应的操作 8。IRemoteStub 的存在极大地简化了服务端处理远程调用的复杂性,它将底层的IPC细节抽象出来,使得开发者可以专注于实现服务的业务逻辑。

4\. IRemoteProxy:客户端的代表

IRemoteProxy 类是客户端在本地持有的远程服务代理,它实现了与服务端相同的服务接口(继承自 IRemoteBroker)6。IRemoteProxy 的作用是作为客户端本地代理,将客户端的方法调用转化为跨进程通信,并处理返回结果 6。当客户端想要调用远程服务的方法时,它实际上是在调用 IRemoteProxy 上的方法。

IRemoteProxy 的关键功能在于拦截客户端的方法调用,并将这些调用转化为可以通过进程间通信发送的消息 6。这个过程包括将方法名和参数封装到 MessageParcel 对象中(marshalling)。IRemoteProxy 内部持有一个 IRemoteObject 的实例,这个 IRemoteObject 代表了远程的服务端对象。当 IRemoteProxy 上的方法被调用时,它会使用这个 IRemoteObject 的 SendRequest() 方法将封装好的消息发送到服务端 6。SendRequest() 方法需要指定调用的代码(通常在服务接口中定义)、包含参数的 MessageParcel、用于接收返回值的 MessageParcel,以及其他选项。在发送请求后,SendRequest() 会等待服务端的响应。一旦收到响应,IRemoteProxy 会从回复的 MessageParcel 中读取返回值(unmarshalling),并将其返回给客户端的调用者 6。例如,在 GameServiceProxy 的代码示例中,action 方法将 deviceId 和 action 参数写入 data,然后通过 remoteObject.sendRequest() 发送到服务端 8。IRemoteProxy 的设计使得客户端能够像调用本地对象一样调用远程服务,而无需关心底层的IPC细节。

5\. IRemoteObject:跨进程的信道

IRemoteObject 接口是鸿蒙OS中跨进程传递的远程对象的抽象表示 8。它的意义在于提供了一个底层的通信机制,使得不同进程中的对象可以相互引用和交互。IRemoteStub 和 IRemoteProxy 实际上都是通过 IRemoteObject 的实例进行通信的 6。

服务端的 IRemoteStub 本身就是一个 IRemoteObject 的实现 8。当一个服务能力被连接时,它的 onConnect() 方法会返回一个 IRemoteObject 实例(通常是 IRemoteStub 的子类)给连接的客户端 10。客户端接收到这个 IRemoteObject 后,会使用它来创建 IRemoteProxy,从而与远程服务进行交互 9。IRemoteObject 提供了一个核心方法 SendRequest(),用于发送IPC消息 6。IRemoteProxy 使用这个方法将封装好的请求发送给服务端的 IRemoteStub。同样,服务端接收到请求后,也会通过 IRemoteObject 将处理结果发送回客户端。IRemoteObject 的抽象性在于它隐藏了底层的进程边界和通信细节,为上层的 IRemoteStub 和 IRemoteProxy 提供了统一的通信接口。

6\. SystemAbility:系统服务的基础

SystemAbility 类在鸿蒙OS中扮演着提供系统级功能和服务的核心角色 11。虽然提供的资料中没有直接给出 SystemAbility 的详细定义,但可以推断出它代表了操作系统中的一个独立功能或服务,例如蓝牙、Wi-Fi 或 NFC 11。SystemAbility 可能是 SystemCapability (SysCap) 的具体实现 11。SystemCapability 描述了操作系统的某种能力,而 SystemAbility 则是提供这些能力的实际组件。

一个 SystemAbility 的生命周期通常包括注册、发布和被其他进程发现和使用的过程。在系统启动时,各种系统服务可能会将自己注册到系统的某个中心管理机构。注册过程可能涉及到为该服务分配一个唯一的标识符。发布是指将该服务的存在和可用性告知其他进程。其他进程可以通过特定的系统API查询和发现已发布的 SystemAbility 实例 12。一旦发现目标 SystemAbility,进程就可以建立与其的连接,并使用其提供的功能。这个连接过程可能涉及到前面讨论的 IRemoteBroker、IRemoteStub、IRemoteProxy 和 IRemoteObject 机制。例如,一个 SystemAbility 可能会实现一个继承自 IRemoteBroker 的接口,并在其 onConnect() 方法中返回一个 IRemoteStub 实例,供客户端通过 IRemoteProxy 进行访问。虽然具体的注册、发布和发现机制在提供的资料中没有详细说明,但可以肯定的是,SystemAbility 是鸿蒙OS提供系统级服务的关键基础设施。

7\. 标准鸿蒙OS 5.0 SA 架构中的相互关系和协同工作方式

在标准的鸿蒙OS 5.0 服务能力架构中,IRemoteBroker、IRemoteStub、IRemoteProxy 和 IRemoteObject 紧密协作,共同实现了高效的跨进程通信。SystemAbility 则作为系统级服务的基础,可能利用这些通信机制向其他进程提供服务。

当一个服务能力(可能是自定义的应用服务,也可能是 SystemAbility)希望被其他进程访问时,它会定义一个继承自 IRemoteBroker 的服务接口。该服务能力的实现类会继承自 IRemoteStub(或者直接继承自 RemoteObject 并实现服务接口)。在服务能力启动并准备好接受连接时,它的 onConnect() 方法会返回一个 IRemoteStub 的实例,这个实例同时也是一个 IRemoteObject 10。

客户端进程想要使用这个服务时,会通过特定的机制(例如,使用 connectAbility() 方法 13)与服务建立连接。连接成功后,客户端会获得一个代表远程服务的 IRemoteObject。为了方便地调用远程服务的方法,客户端通常会使用这个 IRemoteObject 创建一个本地的 IRemoteProxy。这个 IRemoteProxy 实现了与服务端相同的服务接口(继承自 IRemoteBroker)。

现在,当客户端调用 IRemoteProxy 上的一个方法时,IRemoteProxy 会将方法名和参数封装成一个 MessageParcel,然后通过其持有的 IRemoteObject 将这个请求发送到服务端进程。在服务端进程中,IRemoteStub 接收到这个请求,它会解封 MessageParcel 中的参数,并根据请求的标识符(transaction code)调用实际的服务实现方法。服务方法执行完毕后,IRemoteStub 会将结果封装到另一个 MessageParcel 中,并通过相同的 IRemoteObject 发送回客户端进程。客户端进程中的 IRemoteProxy 接收到这个包含结果的 MessageParcel 后,会解封结果并将其返回给客户端的调用者。

下表总结了这五个关键类在鸿蒙OS 5.0 服务能力框架中的角色和主要功能:

表 1: 鸿蒙OS 5.0 服务能力框架中关键类的角色和职责

类名

角色

主要功能

IRemoteBroker

远程接口的契约

定义远程通信的接口规范;提供获取底层 IRemoteObject 或 IRemoteProxy 的方式。

IRemoteStub

服务端请求处理的终点

接收IPC消息,解封参数,调度调用到服务实现,封装结果返回给调用者。

IRemoteProxy

客户端远程服务的本地代理

拦截方法调用,将参数封装成IPC消息,通过 IRemoteObject 发送请求,接收响应,解封结果并返回给客户端。

IRemoteObject

跨进程通信的底层抽象

提供进程间通信的基础通道;被代理用于发送请求,被存根用于接收请求。

SystemAbility

系统级服务的基础

封装并提供系统功能(可能与 SystemCapability 相关);管理其生命周期(注册、发布、发现)。

通过这种精巧的设计,鸿蒙OS 5.0 的服务能力框架实现了高效、安全且易于使用的跨进程通信机制,为构建复杂的分布式应用和管理系统级服务提供了坚实的基础。

8\. 结论

鸿蒙OS 5.0 的服务能力框架依赖于 IRemoteBroker、IRemoteStub、IRemoteProxy 和 IRemoteObject 这四个核心类的紧密协作来实现跨进程通信。IRemoteBroker 作为远程接口的蓝图,定义了服务可以提供的功能。IRemoteStub 充当服务端的消息处理器,负责接收和分发远程调用。IRemoteProxy 则作为客户端的代表,将本地的方法调用转化为远程请求。IRemoteObject 是连接客户端和服务端的桥梁,提供了底层的通信通道。而 SystemAbility 作为系统级服务的基础,很可能也利用了这些机制来向其他进程提供操作系统的核心功能。

这些类的协同工作方式不仅实现了模块化,使得不同的功能可以作为独立的服务运行,而且提高了代码的重用性,因为多个客户端可以连接到同一个服务能力。通过精心设计的封装和解封机制,鸿蒙OS 5.0 实现了高效的跨进程通信,这对于构建复杂的分布式应用和确保系统的稳定性和安全性至关重要。理解这五个关键类的作用及其相互关系,是深入学习和开发鸿蒙OS 5.0 服务能力的关键。

引用的著作

  1. HarmonyOS NEXT \- Wikipedia, 访问时间为 三月 28, 2025, https://en.wikipedia.org/wiki/HarmonyOS\_NEXT

  2. HarmonyOS/README.md at master \- GitHub, 访问时间为 三月 28, 2025, https://github.com/Awesome-HarmonyOS/HarmonyOS/blob/master/README.md

  3. Digging into Harmony OS Internals | by Jasper Morgan | Snapp Mobile \- Medium, 访问时间为 三月 28, 2025, https://medium.com/snapp-mobile/digging-into-harmony-os-internals-fb48d822e65a

  4. Intermediate: Ability Framework in HarmonyOS Part-1 | by Shiddalingeshwar M S \- Medium, 访问时间为 三月 28, 2025, https://shikkerimath.medium.com/intermediate-ability-framework-in-harmonyos-part-1-22a16ba086a8

  5. Service Ability Lifecycle-Service Ability-Ability-Ability Framework ..., 访问时间为 三月 28, 2025, Document

  6. 鸿蒙开发HarmonyOS IPC与RPC通信-腾讯云开发者社区-腾讯云, 访问时间为 三月 28, 2025, 鸿蒙开发HarmonyOS IPC与RPC通信-腾讯云开发者社区-腾讯云

  7. HarmonyOS跨进程通信—IPC与RPC通信开发-华为开发者问答| 华为 ..., 访问时间为 三月 28, 2025, 华为开发者问答 | 华为开发者联盟

  8. \[HarmonyOS\] Part 2—How to connect a Harmony OS app with an ..., 访问时间为 三月 28, 2025, https://www.reddit.com/r/HuaweiDevelopers/comments/nozpmd/harmonyos\_part\_2how\_to\_connect\_a\_harmony\_os\_app/

  9. \[HarmonyOS\] Part 1—How to connect a Harmony OS app with an ..., 访问时间为 三月 28, 2025, https://www.reddit.com/r/Huawei/comments/npocmw/harmonyos\_part\_1how\_to\_connect\_a\_harmony\_os\_app/

  10. Beginner: Service Ability features in Huawei Harmony OS \- HUAWEI Developer Forum, 访问时间为 三月 28, 2025, HUAWEI Developer Forum | HUAWEI Developer

  11. SystemCapability \- Huawei, 访问时间为 三月 28, 2025, Document

  12. Version Overview-HarmonyOS 5.0.1 Release-Release Notes \- HUAWEI Developers, 访问时间为 三月 28, 2025, Document

  13. HarmonyOS API:@ohos.rpc (RPC通信) \- 鸿蒙开发者社区, 访问时间为 三月 28, 2025, HarmonyOS API:@ohos.rpc (RPC通信)-鸿蒙开发者社区-51CTO.COM

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

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

相关文章

RTMP推流+EasyDSS云服务+边缘AI分析的无人机监控系统设计

在现代科技不断发展的背景下,无人机技术已经广泛应用于各个领域,从航拍摄影到工业巡检,从农业监测到应急救援,无人机以其高效的工作能力,为人们的生活和工作带来了诸多便利与创新,而其视频传输与分析系统更…

HCIP(VLAN综合实验)

实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机(SW1、SW2、SW3)个人电脑(PC1、PC2、PC3、PC4、PC5、PC6)路由器(R1…

Linux系统编程 | 线程的基本概念

💓个人主页:mooridy 💓专栏地址:Linux 关注我🌹,和我一起学习更多计算机的知识! 🔝🔝🔝 什么是线程 程序中的一个执行路线就叫做线程 一个进程至少要有一个执行线程,单…

小林coding-12道Spring面试题

1.说一下你对 Spring 的理解?spring的核心思想说说你的理解? 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc?依赖倒置,依赖注入,控制反转分别是什么?依赖注…

第十二章——位运算

按位的与& 若x的第i位和y的第i位都是1,那么(x&y)1,否则(x&y) 0 应用:希望让某一位或某些位为0 。取一个数中的一段。 按位的或| 若x的第i位1或y的第i位1,那么&…

计算机等级考试数据库三级(笔记3)

插入 修改 现要创建一个具有如下功能的触发器:每当在销售表中插入一条销售记录时,修改商品表中对应商品的销售总量,假设一次只插入一条销售记录。请补全下列代码。CREATE TRIGGER tri insert on xx FOR xx AS xx 商品表 xx 销售总量xx (SELEC…

【Leetcode 每日一题】2716. 最小化字符串长度

问题背景 给你一个下标从 0 0 0 开始的字符串 s s s,重复执行下述操作 任意 次: 在字符串中选出一个下标 i i i,并使 c c c 为字符串下标 i i i 处的字符。并在 i i i 左侧(如果有)和 右侧(如果有&…

Flutter中实现拍照识题的功能

文章目录 **1. 功能拆解****2. 具体实现步骤****(1) 拍照或选择图片****(2) 图片预处理(可选)****(3) 文字识别(OCR)****(4) 数学公式识别 → LaTeX****方案1:Mathpix API(高精度,付费&#xff…

【Mysql:内置函数】

日期函数: 查看当前日期: select current_date();查看当前时间: select current_time(); 查看当前时间戳: select current_timestamp(); 计算两个日期的差值: select datediff(date1,date2); 当前的日期时间&a…

71. 我的第一个Linux驱动实验

一、字符设备驱动框架 字符设备驱动的编写主要就是驱动对应的open、close、read。。。其实就是 file_operations结构体的成员变量的实现。 其中关于 C 库以及如何通过系统调用“陷入” 到内核空间这个我们不用去管,我们重点关注的是应用程序和具体的驱动&#xff0…

jdk21使用Vosk实现语音文字转换,免费的语音识别

1.下载vosk的model vosk官网&#xff1a;https://alphacephei.com/vosk/models 我这里使用较小的vosk-model-small-cn-0.22 2.添加相关pom文件 <!-- 获取音频信息 --><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifac…

如何一键安装所有Python项目的依赖!

在开发项目时&#xff0c;常常需要在多个环境中安装各种依赖。对开发者来说&#xff0c;每次手动一个个安装这些依赖是不是很麻烦&#xff1f;&#x1f605; 其实有个超简单的办法&#xff01;只需要一个脚本&#xff0c;就能快速解决问题&#xff01;&#x1f4a1; 这就是我们…

Blender配置渲染设置并输出动画

在Blender中&#xff0c;渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤&#xff1a; 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板&#xff08;按 N 键可切换显示&#xff09;。 点击 “输出属性” 选项卡&#xff08;图标是…

C++修炼:string类的使用

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

【go微服务】如何快速掌握grpc开发

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【区块链 + 文化版权】基于 FISCO BCOS 的方言大数据语料库 | FISCO BCOS 应用案例

苏州喵自在区块链科技有限公司打造的基于FISCO BCOS 的粤语大数据语料库&#xff0c; 旨在利用区块链技术保护和发展粤语文化遗产。该项目利用区块链的不可篡改性、分布式存储、智能合约和激励机制等特性&#xff0c; 为保护非物质文化遗产&#xff0c; 加强粤语研究与教育和开…

大模型在支气管扩张预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、大模型技术概述 2.1 大模型的基本原理与架构 2.2 适用于支气管扩张预测的大模型类型及特点 2.3 大模型在医疗领域的应用现状与优势 三、支气管扩张的相关医学知识 3.1 支气管扩张的病因…

亚马逊云科技提供完全托管的DeepSeek-R1模型

近日&#xff0c;亚马逊云科技宣布在Amazon Bedrock上线完全托管的DeepSeek-R1模型。DeepSeek是首个登陆Amazon Bedrock的国产大模型&#xff0c;自今年1月底推出以来&#xff0c;已有数千客户使用Amazon Bedrock的自定义模型导入功能部署了DeepSeek-R1模型。 DeepSeek在过去几…

二叉树、排序算法与结构图

二叉树、排序算法与数据库 二叉树 二叉树的性质 节点数与深度的关系&#xff1a;深度为 k k k的二叉树&#xff0c;最多有 2 k − 1 2^k - 1 2k−1个节点。例如&#xff0c;深度为 3 3 3的二叉树&#xff0c;最多有 2 3 − 1 7 2^3 - 1 7 23−17个节点。叶子节点与度为2节…

vmwaretools解压失败|vmware tools distrib cannot mkdir read only file system|bug汇总

最简单的一条路线&#xff1a;你的解压命令用sudo了吗&#xff1f; 这个方法不能解决的话就看下面内容。本文提供给你全过程思路。 如需转载&#xff0c;标记出处 背景&#xff1a; 之前虚拟机和主机的复制黏贴还能用&#xff0c;今天突然用不了&#xff0c;重新下载安装包&am…