news 2026/4/16 12:12:35

HarmonyOS 各个层级的通信机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 各个层级的通信机制

第一部分 层级通信

一、核心思想:架构延伸与范式统一

鸿蒙的通信架构可以被看作是Android Binder范式的一次大规模延伸与统一。它将Android成熟的单设备内IPC(进程间通信)范式,通过一套新的中间层,扩展为了跨设备的RPC(远程过程调用)范式,并致力于让开发者觉得这两种调用没有区别。

为了方便类比理解,下表是整个架构的对比概览:

通信层级Android (类比)HarmonyOS (对应架构)核心思想与关系
应用层 (逻辑单元)Activity, ServiceAbility (FA/PA)从Android的组件模型演进而来,是调度和通信的基本单元。
框架层 (编程接口)Android SDK (Java/Kotlin API)ArkUI/Ability框架 (ArkTS/JS/Java API)为应用开发者提供统一的编程接口,封装底层通信复杂性。
服务管理层 (服务目录)ServiceManagerSystem Ability Manager (SAMgr)架构核心类比点:功能完全对等,是系统的“服务电话簿”,负责系统服务的注册、发现和管理。
IPC/RPC 核心层 (通信机制)Binder 驱动1. 单设备:Binder-like驱动2. 跨设备:分布式软总线 (DSoftBus)架构演进关键:在单设备保留高性能Binder-like机制;通过DSoftBus将“进程”概念扩展为“设备”,实现跨设备Binder式调用。
接口契约层AIDL (Android Interface Definition Language)鸿蒙 IDL设计理念一致:用于严格定义服务接口,保证通信双方的类型安全,是生成Proxy/Stub代码的契约。

二、逐层深入:与Android的详细对比

1. 服务管理层:从ServiceManager到SAMgr

这是理解上下层通信的第一个枢纽,两者角色完全一致。

  • Android ServiceManager:系统启动时,所有关键服务(如ActivityManagerService, WindowManagerService)都向它注册。客户端要访问服务,首先查询ServiceManager获取该服务的Binder引用。

  • 鸿蒙 SAMgr:扮演完全相同的角色。所有“系统能力”(System Ability)都向SAMgr注册,并有一个唯一的SystemAbility ID。应用或服务通过GetSystemAbility()调用,向SAMgr查询并获取对应服务的远程对象代理。

2. IPC/RPC核心层:从Binder驱动到“Binder + 软总线”

这是架构演进的核心,鸿蒙在此分层。

  • 单设备内通信 (IPC):鸿蒙使用了与Android Binder高度相似甚至优化的驱动机制(即“Binder-like”驱动)。它同样位于内核层,提供一次拷贝、高性能的进程间通信能力

  • 跨设备通信 (RPC):这是鸿蒙的创造。分布式软总线(DSoftBus)在此核心作用。

    • 角色:它不是一个具体的驱动,而是一个位于系统服务层的“通信基座”子系统。它抽象了Wi-Fi、蓝牙等物理链路,实现设备的自动发现、安全组网和高效传输。

    • 与Binder的协同:当一次服务调用被判定为跨设备时(例如,手机应用调用智慧屏的摄像头服务),本地Binder驱动会将请求递交给分布式调度子系统。该子系统通过DSoftBus建立的安全通道,将请求发送到目标设备。对于目标设备而言,它收到的是一个标准的本地Binder调用请求。DSoftBus相当于在Binder通信路径中插入了一个透明的、跨设备的“扩展坞”

3. 接口契约层:从AIDL到鸿蒙IDL

两者设计理念一脉相承,是实现安全、高效通信的保障。

  • 作用:无论是Android的AIDL还是鸿蒙的IDL,其核心作用都是定义客户端和服务端之间的通信接口(方法名、参数、返回值)。通过工具编译后,会自动生成客户端代理(Proxy)和服务端存根(Stub)代码。

  • 意义:这保证了通信双方的类型安全,并将复杂的序列化/反序列化、事务编组等操作自动化,让远程调用在代码层面看起来如同本地函数调用。

4. 轻量级设备的补充:LiteIPC

对于运行LiteOS-A内核的资源受限设备(如某些IoT设备),鸿蒙提供了LiteIPC作为一种更轻量的选择。其思想也是服务化,有类似于ServiceManager的ServiceManager来管理服务(Service)和权限。可以将它理解为在这些设备上,Binder-like机制的一个简化实现。


三、总结:通信路径全景

综合以上,可以描绘出两条清晰的通信路径:

  1. 单设备内通信路径应用/服务 (客户端)ArkTS/Java框架API→ 查询SAMgr获取服务引用 → 通过内核Binder-like驱动系统服务 (服务端)

    • 此路径与Android的AppServiceManagerBinder驱动System Service几乎一致。

  2. 跨设备通信路径设备A上的应用框架API→ 查询本地SAMgr发现服务在远端 →分布式调度子系统介入 → 通过DSoftBus安全网络通道 → 到达设备B→ 在设备B内转为本地Binder调用→ 访问设备B上的目标服务

    • 此路径是鸿蒙的核心创新,它让跨设备调用复用设备内成熟的Binder模型,实现了范式统一。

总而言之,鸿蒙的通信架构并非抛弃了Android的验证,而是在深刻理解Binder + ServiceManager这一高效范式的基础上,通过引入分布式软总线(DSoftBus)系统能力管理(SAMgr),将通信的边界从单个设备的进程之间,成功地扩展到了网络中的多个设备之间,最终实现了“一次开发,多端部署”和“超级终端”的体验。

第二部分 分布组件

以下是基于官方文档开源代码仓对这三个组件架构的整理分析,其中IDL和SAMgr的官方信息较为完整,而DSoftBus的协议细节更多依赖源码分析。

为便于快速对比理解,将它们的核心要素汇总如下表:

组件核心架构/语法要点代码仓/目录位置官方依据
IDL (接口描述语言)数据类型、接口定义、生成Proxy/Stub开发工具链 (idl)《OpenHarmony IDL工具规格及使用说明书》
分布式软总线 (DSoftBus)统一通信基座、设备发现、连接、传输/foundation/communication/dsoftbus官方子系统简介
系统能力管理框架 (SAMgr)服务注册、发现、生命周期管理/foundation/systemabilitymgr/官方SAMGR子系统说明

一、IDL接口描述语言

IDL用于严格定义跨进程或跨设备通信的服务接口,是实现RPC类型安全的基础。其核心架构和语法如下:

  • 1. 数据类型映射:IDL定义了与C++、TS等语言映射的基本类型(如intString)、可序列化的sequenceable类型、interface类型以及容器类型(如List<T>,Map<KT,VT>)。

  • 2. 接口定义语法:采用类BNF范式。一个.idl文件定义一个接口,接口内声明方法。关键语法包括:

    • 接口属性[oneway]表示异步,无返回值。

    • 方法属性:同上,但需注意异步方法不能有out/inout参数或返回值。

    • 参数方向:必须明确指定[in][out][inout]

    • 示例

      // 示例:IIdlTestService.idl interface OHOS.IIdlTestService { int TestIntTransaction([in] int data); // 同步方法,输入参数 oneway void TestStringTransaction([in] String data); // 异步方法 }
  • 3. 代码生成与使用:IDL工具(idl可执行文件)编译.idl文件,自动生成代理(Proxy)桩(Stub)代码。

    • 服务端:实现Stub类,在onRemoteRequest中处理具体业务逻辑。

    • 客户端:通过Proxy类调用方法,如同本地调用。

二、分布式软总线 (DSoftBus)

DSoftBus是鸿蒙分布式通信的“基座”,统一抽象底层网络差异,提供设备发现、连接和传输能力。由于详细的网络协议并未在公开文档中完全披露,其架构主要体现为设计思想和关键流程:

  • 1. 核心设计思想

    • 统一抽象:将Wi-Fi、蓝牙等不同物理链路统一为逻辑通信通道。

    • 自发现与自组网:设备可自动发现并连接同一局域网内的其他信任设备。

    • 安全通道:通信过程经过加密和身份认证。

  • 2. 关键流程

    • 组网(发现):服务启动后,获取在线设备列表,注册监听以感知设备上下线变化。

    • 传输(会话)

      1. 创建会话服务并注册监听。

      2. 指定设备上线后,主动建立会话。

      3. 会话建立成功后,通过该通道发送数据。

      4. 会话结束时关闭通道。

  • 3. 通信模式:支持点对点、发布/订阅等多种模式,适应不同业务场景。

  • 源码结构:核心实现位于OpenHarmony源码的/foundation/communication/dsoftbus目录下。

三、系统能力管理框架 (SAMgr)

SAMgr是所有系统服务(System Ability)的注册、发现和生命周期管理中心,类似于一个服务电话簿和调度中心。

  • 1. 核心架构:SAMgr子系统包含几个关键模块:

    • safwk:定义系统能力的实现规范,提供启动、注册API。

    • samgr:提供系统能力的注册、查询等管理API。

    • safwk_lite / samgr_lite:为轻量/小型系统提供的轻量化实现。

  • 2. 核心工作机制

    • 服务注册:每个系统服务(SA)启动时,向SAMgr注册一个唯一的整数ID和其远程对象。注册方式有静态(系统启动时)和动态(按需加载)两种。

    • 服务发现与调用:客户端(应用或其他服务)通过GetSystemAbility(SA_ID)向SAMgr查询。SAMgr返回一个代理对象,后续调用通过此代理进行,对开发者透明。

    • 生命周期管理:SAMgr负责服务的启动(OnStart)、停止(OnStop)以及崩溃后自动拉起。

    • 分布式扩展:在跨设备场景下,SAMgr可与分布式框架协同,使本地客户端能发现和调用远程设备上的系统能力。

  • 3. 源码结构:核心代码位于/foundation/systemabilitymgr/目录下,对应上述模块。

四、 总结

IDL、DSoftBus、SAMgr三者紧密协作,构成了鸿蒙分布式通信的基石:

  1. IDL定义了通信的契约(接口是什么),确保跨进程/设备调用的规范性。

  2. SAMgr扮演了服务的总机(服务在哪里),管理者所有系统能力的目录和生命周期。

  3. DSoftBus提供了通信的高速公路(数据怎么走),负责实际的数据传输,屏蔽网络复杂性。

第三部分 会话管理

一、 核心要点速览

组件核心工作机制与关键源码结构核心API与官方文档参考
IDL编译器工作流程:解析.idl文件 → 校验语法 → 生成目标语言(TS/C++)的ProxyStub代码。关键产出_proxy(客户端)、_stub(服务端) 和接口文件。工具链命令idl -gen-ts -d dir -c file.idl语法定义:数据类型、接口、方法参数的BNF范式。
DSoftBus会话管理源码目录:位于/foundation/communication/dsoftbus/core/transmission核心对象ISessionListener回调结构体。关键流程:创建会话服务(CreateSessionServer) → 打开会话(OpenSession) → 发送/接收数据 → 关闭清理。核心APICreateSessionServer,OpenSession,SendBytes,CloseSession,RemoveSessionServer架构说明:分布式通信子系统官方README。
SAMgr (系统能力管理框架)模块构成safwk(定义与启动)、samgr(注册与查询)、lite版本。核心机制:基于唯一SA ID的服务注册表与查询机制。核心APIAddSystemAbility(注册),GetSystemAbility(发现/获取)。官方介绍:SAMGR子系统架构文档。

二、 IDL编译器工作机制详解

IDL(接口描述语言)编译器的核心工作是充当“翻译官”和“代码生成器”,它将开发者定义的接口契约(.idl文件)转换为具体的、可编译的编程语言代码,实现跨进程/跨设备调用的自动化。

  1. 输入与解析

    • 输入:开发者编写的.idl文件。该文件严格遵循BNF范式定义,只能包含一个interface,且名称须与文件名相同。

    • 解析与校验:编译器首先解析文件,校验语法正确性(如接口属性、方法参数方向[in][out][inout]等)和类型合法性。

  2. 代码生成(以TS为例)编译器根据-gen-ts-gen-cpp等参数,生成三种核心文件:

    • 接口文件 (i_xxx.ts):声明了IDL中定义的所有方法,是客户端和服务端共同遵守的TypeScript接口契约

    • 代理端代码 (xxx_proxy.ts):继承自rpc.RemoteProxy。它实现了接口文件中的方法,内部将调用请求、参数序列化,并通过RPC通道发送给远端。对客户端而言,调用Proxy对象就像调用本地方法一样。

    • 桩端代码 (xxx_stub.ts):继承自rpc.RemoteObject。它接收来自Proxy的请求,反序列化参数,并调用开发者编写的实际服务实现,然后将结果序列化返回。

  3. 使用流程开发者执行命令(如idl -gen-ts -d ./output -c ./IIdlTestService.idl)生成代码后:

    • 服务端:实现具体的业务逻辑,并继承生成的Stub类

    • 客户端通过生成的Proxy类来调用远程服务。


三、 DSoftBus会话管理源码解析

DSoftBus的会话(Session)管理是实现设备间可靠数据传输的核心模块。其源码主要位于OpenHarmony代码仓的/foundation/communication/dsoftbus/core/transmission目录下。

  1. 核心数据结构:ISessionListener会话的所有事件都通过此回调接口通知给上层业务。

    // 会话监听器定义 typedef struct { int (*OnSessionOpened)(int sessionId, int result); // 会话建立结果回调 void (*OnSessionClosed)(int sessionId); // 会话关闭回调 void (*OnBytesReceived)(int sessionId, const void *data, unsigned int dataLen); // 收到字节流 void (*OnMessageReceived)(int sessionId, const void *data, unsigned int dataLen); // 收到消息 } ISessionListener;
  2. 会话生命周期管理流程一次完整的会话交互遵循以下典型流程:

    1. 创建会话服务 (CreateSessionServer):业务进程首先调用此API,传入一个唯一的会话名称(sessionName)和ISessionListener回调,向DSoftBus注册自己为一个可被连接的服务端点

    2. 打开会话 (OpenSession):当需要与某个对端设备通信时,调用此API,指定本地会话名对端会话名对端设备网络ID。DSoftBus会负责建立安全的传输通道,成功后将返回一个用于后续通信的sessionId

    3. 数据传输 (SendBytes/SendMessage):使用上一步获取的sessionId,调用发送API进行数据传输。对端在其注册的OnBytesReceivedOnMessageReceived回调中接收数据。

    4. 关闭与清理 (CloseSession,RemoveSessionServer):通信结束后,关闭指定会话。当业务不再需要该会话服务时,应调用RemoveSessionServer进行注销,释放资源。


四、 SAMgr详细API与工作机制

SAMgr(系统能力管理框架)是整个鸿蒙系统服务的“大管家”,所有系统能力(System Ability)都必须向其注册,并由其统一管理生命周期和提供查询。

  1. 架构与模块SAMgr由以下几个核心模块构成,代码位于/foundation/systemabilitymgr/目录下:

    • safwk:定义System Ability的实现规范,提供启动、注册等基础框架API。

    • samgr:提供系统能力的注册、查询等核心管理API。

    • safwk_lite / samgr_lite:为内存资源受限的轻量/小型系统提供的轻量化实现。

  2. 核心API列表与功能尽管搜索结果中没有提供完整的官方API参考手册,但综合多个技术博客和官方介绍,其最核心的API可以归纳为以下几类:

    API类别核心函数 (示例)功能描述
    服务注册AddSystemAbility(int32_t systemAbilityId, const sptr<IRemoteObject>& ability);向SAMgr注册一个系统能力。每个能力由唯一的SA ID标识。
    服务发现与获取GetSystemAbility(int32_t systemAbilityId);根据SA ID查询并获取系统能力的远程对象代理。如果服务未启动,SAMgr可能会按需拉起。
    客户端辅助SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();客户端获取SAMgr自身远程对象的标准方法,是调用上述API的前提。
    服务端基类SystemAbility::Publish(sptr<IRemoteObject> ability);系统服务在OnStart()中调用,将自身发布给SAMgr。
  3. 工作流程示例

    • 服务端注册:一个系统服务(如LocationService)启动后,在其OnStart()生命周期函数中,调用Publish(this)或通过GetSystemAbilityManager()->AddSystemAbility(LOCATION_SERVICE_ID, this)向SAMgr注册。

    • 客户端调用:应用需要定位服务时,调用GetSystemAbility(LOCATION_SERVICE_ID)。SAMgr在其注册表中查找,返回该服务的远程代理对象(Proxy)。客户端通过此代理进行RPC调用,整个过程无需关心服务所在的进程。

第四部分 鸿蒙特色

下表梳理了这三个问题的关键信息来源:

关注点核心答案概览主要信息来源分析
IDL生成的具体代码段有详细流程和代码示例。官方提供了从C/C++头文件自动生成IDL的工具(h2idl),并有完整的工作原理和生成示例。来自官方开发者博客和文档,内容具体。
DSoftBus会话建立过程仅有高层流程描述。官方文档只概括了会话创建、打开、发送数据、关闭等步骤,没有底层协议和网络交互的细节。来自开源文档网站,为高层概述,细节缺失。
SAMgr跨设备查询机制只有原理性说明。官方介绍指出SAMgr支持跨设备查询,并简述了其作为分布式系统服务“枢纽”的角色,但缺少分布式发现、路由等核心机制的详细说明。来自开源文档和技术博客,后者对原理阐述较生动。

下面将基于现有信息,对这三个问题进行详细说明。

一、IDL生成的具体代码段:h2idl工具的工作流程

官方不仅定义了IDL语法,还提供了从现有C/C++头文件(.h)自动生成IDL文件的工具,例如h2idlnapi-gen插件中的h2sa功能。其核心工作是完成从C/C++类型到IDL类型的映射和转换

1. 核心类型映射规则这是生成正确IDL代码的基础。工具内部维护了一个类型映射表,部分关键映射如下:

C/C++ 类型映射后的 IDL 类型
int32_t,intint
std::stringString
std::vector<T>List<T>
std::map<K, V>Map<K, V>
boolboolean

2. 从C++头文件到IDL文件的完整生成示例假设有一个C++头文件audio_adapter.h,定义了以下接口:

// audio_adapter.h (C++ 头文件) namespace ohos { namespace audio { class IAudioAdapter { public: virtual int32_t SetVolume(int32_t volume) = 0; virtual int32_t GetVolume(int32_t& volume) = 0; // 注意:volume是输出参数 }; } // namespace audio } // namespace ohos

使用h2idl工具转换后,会生成类似下面的IDL文件:

// 生成的 IAudioAdapter.idl package ohos.audio; ​ interface IAudioAdapter { int32_t SetVolume([in] int32_t volume); int32_t GetVolume([out] int32_t volume); // 工具自动识别并添加[out]方向 }

关键生成步骤解析

  1. 解析提取:工具(如_header_parser.py)会解析C++头文件,提取出类名、方法名、参数类型等信息。

  2. 类型转换:根据映射表,将int32_t转换为int,将std::string转换为String

  3. 推断参数方向:工具会分析C++代码。例如,对于GetVolume方法中的引用参数int32_t& volume,工具能推断其为输出参数,并在IDL中自动添加[out]标签。

  4. 生成最终IDL:按照鸿蒙IDL的语法规范,生成最终的接口文件。

二、DSoftBus会话建立的底层网络过程

关于这部分,公开的官方文档仅描述了高层的编程步骤和逻辑流程,并未深入其底层的网络协议、握手过程、编解码等实现细节。

根据文档,一次完整的会话传输流程如下:

  1. 创建会话服务:业务调用CreateSessionServer(),注册一个监听回调。

  2. 建立会话:待目标设备上线后,调用OpenSession()与其建立连接。

  3. 发送数据:会话建立成功后,使用SendBytes()等函数发送数据。

  4. 关闭会话:通信完成后,调用CloseSession()RemoveSessionServer()进行清理。

文档强调,所有设备必须位于同一局域网中,这是软总线实现自发现和自组网的基础网络约束条件。底层如何利用Wi-Fi或蓝牙等链路实现设备发现、安全连接和可靠传输,目前缺乏公开的协议细节。

三、SAMgr在分布式场景下的跨设备查询机制

官方文档确认了SAMgr(系统能力管理框架)具备查询跨设备分布式系统服务的功能。其分布式角色可以概括为“分布式服务能力的统一查询入口”

1. 核心机制描述在分布式场景下,其工作机制可以理解为:

  • 服务注册:每个设备上的本地服务(System Ability)会向本设备的SAMgr注册。

  • 跨设备查询:当应用通过GetSystemAbility()请求一个服务时,本地SAMgr会判断该服务是否在本机。

  • 分布式路由:如果不在,SAMgr会通过分布式调度机制(可能与分布式任务调度子系统dmsfwk协同),将查询请求路由到网络中的其他设备。

  • 透明调用:找到目标服务后,会返回一个跨设备的代理对象(Proxy)给调用者。后续的调用会通过分布式软总线(DSoftBus)进行跨设备RPC,但对开发者而言,调用方式与本地服务无异

2. 代码流程示意以下是一个高度简化的代码逻辑示意,展示了SAMgr如何使跨设备调用对开发者透明:

// 应用代码:调用方式与请求本地服务完全相同 // SAMgr和分布式框架在背后处理了所有跨设备逻辑 sptr<IRemoteObject> remoteObject = SystemAbilityManagerClient::GetInstance().GetSystemAbility(DISTRIBUTED_SERVICE_ID); ​ // 假设获取到的是智慧屏上的音频服务代理 sptr<IAudioService> audioProxy = iface_cast<IAudioService>(remoteObject); audioProxy->PlayMusic("song.mp3"); // 此调用实际在远程设备执行

四、总结与建议

总的来说,目前关于鸿蒙底层架构的公开信息呈现“工具与流程可见,深层协议与机制未公开”的特点。

问题当前信息状态性质
IDL生成代码段较为详细,有工具原理和示例开发规范/工具链
DSoftBus底层网络过程仅有高层API使用流程未公开的实现细节
SAMgr跨设备查询有原理描述和架构定位已公开的架构设计
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:14:17

结束节点-–-behaviac

原文 结束&#xff08;End&#xff09;节点可以使用于行为树执行过程中的强制返回&#xff0c;即终止该行为树的全部执行&#xff0c;整个行为树直接返回当前结束节点所配置的“结束状态”值&#xff0c;如下图所示&#xff1a; 在上图中&#xff0c;当执行到结束节点时&#…

作者头像 李华
网站建设 2026/4/10 1:50:22

Obsidian极简首页终极指南:5分钟打造个性化知识管理中心

Obsidian Homepage是一款专为知识工作者设计的极简美学模板&#xff0c;通过精心设计的界面布局和模块化功能组件&#xff0c;帮助用户快速构建既美观又实用的笔记启动页面。无论你是初次接触Obsidian的新手&#xff0c;还是寻求界面优化的资深用户&#xff0c;这款模板都能为你…

作者头像 李华
网站建设 2026/4/15 3:48:56

Pose-Search:人体动作分析与姿态搜索完整解决方案

Pose-Search&#xff1a;人体动作分析与姿态搜索完整解决方案 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 在人工智能技术飞速发展的今天&#xff0c;实时姿态检测和动作搜索已成为计算机视觉领…

作者头像 李华
网站建设 2026/4/16 11:14:10

B站API终极指南:Python异步爬虫快速上手实战

B站API终极指南&#xff1a;Python异步爬虫快速上手实战 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址&#xff1a;https://github.com/MoyuScript/bilibili-api 项目地址: https://gitcode.com/gh_mirrors/bi/bi…

作者头像 李华
网站建设 2026/4/15 20:59:21

如何快速实现大屏游戏串流:Moonlight for Tizen的完整指南

如何快速实现大屏游戏串流&#xff1a;Moonlight for Tizen的完整指南 【免费下载链接】moonlight-chrome-tizen A WASM port of Moonlight for Samsung Smart TVs running Tizen OS (5.5 and up) 项目地址: https://gitcode.com/gh_mirrors/mo/moonlight-chrome-tizen …

作者头像 李华
网站建设 2026/4/12 14:15:43

在线图片转ico

https://www.freeconvert.com/zh/ico-converter/download

作者头像 李华