鴻蒙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.pswp.cn/diannao/75870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75870.shtml
英文地址,請注明出處:http://en.pswp.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…