分布式软总线执行入口梳理

本文梳理 OpenHarmony 分布式软总线(dsoftbus)从进程启动、IPC 分派、模块初始化到会话建立的完整执行跳转链路。

flowchart LR
    subgraph App进程
        A[应用] --> B[SDK<br/>InitSoftBus]
        B --> C[ClientProxy<br/>softbus_server_proxy]
    end
    subgraph SoftBusServer进程
        D[SA 4700<br/>SoftBusServer]
        E[OnRemoteRequest<br/>IPC存根分派]
        F[InitSoftBusServer<br/>模块Init链]
        G[Looper消息循环]
    end
    C -- Binder IPC --> D
    D --> E
    E --> F
    F --> G
    G --> H[Trans传输层]
    G --> I[Auth认证]
    G --> J[Conn连接管理]
    G --> K[BusCenter总线中心]
    G --> L[Disc设备发现]

一、系统 SA 注册入口——进程起点

软总线服务以系统能力(SA)方式注册,SA ID 为 4700,进程由系统能力管理器(SAMGR)拉起。

文件:core/frame/standard/init/src/softbus_server.cpp

REGISTER_SYSTEM_ABILITY_BY_ID(SoftBusServer, SOFTBUS_SERVER_SA_ID, true)

当系统能力管理器拉起软总线 SA 时,调用 OnStart(),里面有两步跳转:

  • InitSoftBusServer() — 跳到各模块初始化(连接、认证、发现、传输、总线中心等)
  • Publish(this) — 向 SAMGR 宣布此 SA 可用,之后 IPC 请求才能到达这里
项目 说明
SA ID 4700(SOFTBUS_SERVER_SA_ID)
SA 配置 core/frame/standard/sa_profile/4700.json
关键配置 libpath: "libsoftbus_server.z.so"run-on-create: true

二、IPC 请求分派入口——客户端→服务端的执行跳转

标准系统(Standard)

文件:core/frame/standard/init/src/softbus_server_stub.cpp

入口是 SoftBusServerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)

内部有一张 memberFuncMap_(在 InitMemberFuncMap() 中填充),把 IPC 码号映射到对应的 Inner 函数。关键跳转包括:

IPC 码 跳转目标
MANAGE_REGISTER_SERVICE SoftbusRegisterServiceInner → SoftbusRegisterService()
SERVER_CREATE_SESSION_SERVER CreateSessionServerInner → TransCreateSessionServer()
SERVER_OPEN_SESSION OpenSessionInner → TransOpenSession()
SERVER_OPEN_AUTH_SESSION OpenAuthSessionInner → TransOpenAuthChannel()
SERVER_CLOSE_CHANNEL CloseChannelInner → TransCloseChannel()
SERVER_CLOSE_CHANNEL_STATISTICS CloseChannelWithStatisticsInner → TransCloseChannelWithStatistics()
SERVER_SESSION_SENDMSG SendMessageInner → TransSendMsg()
SERVER_JOIN_LNN JoinLNNInner → LnnIpcServerJoin()
SERVER_LEAVE_LNN LeaveLNNInner → LnnIpcServerLeave()
SERVER_GET_ALL_ONLINE_NODE_INFO GetAllOnlineNodeInfoInner → LnnIpcGetAllOnlineNodeInfo()
SERVER_GET_LOCAL_DEVICE_INFO GetLocalDeviceInfoInner → LnnIpcGetLocalDeviceInfo()
SERVER_GET_NODE_KEY_INFO GetNodeKeyInfoInner → LnnIpcGetNodeKeyInfo()
SERVER_PUBLISH_LNN PublishLNNInner → LnnIpcPublishLNN()
SERVER_REFRESH_LNN RefreshLNNInner → LnnIpcRefreshLNN()
SERVER_START_TIME_SYNC StartTimeSyncInner → LnnIpcStartTimeSync()
SERVER_SHIFT_LNN_GEAR ShiftLNNGearInner → LnnIpcShiftLNNGear()
SERVER_GET_SOFTBUS_SPEC_OBJECT GetSoftbusSpecObjectInner → 返回 TransSpecObject(额外的特殊传输能力对象)
SERVER_GET_BUS_CENTER_EX_OBJ GetBusCenterExObjInner → 返回 BusCenterExObj(额外的总线中心能力对象)
SERVER_PRIVILEGE_CLOSE_CHANNEL PrivilegeCloseChannelInner → TransPrivilegeCloseChannel()
SERVER_PROCESS_INNER_EVENT ProcessInnerEventInner → TransProcessInnerEvent()

还附带一张 memberPermissionMap_OnRemoteRequest 在跳转处理器之前先做访问令牌权限检查。

额外入口GetSoftbusSpecObjectGetBusCenterExObj 提供了子对象,客户端拿到后可以进一步通过二级 IPC 跳转调用这些子对象上的方法。

小型系统(Small)

文件:core/frame/small/init/src/softbus_server_stub.c

入口是 Invoke(IServerProxy *iProxy, int funcId, ...),通过 g_serverInvokeCmdTbl[] 表格分流(约 35 个命令码)。

SAMGR Lite 框架通过 SYSEX_SERVICE_INIT(Init) 注册服务:

SAMGR_GetInstance()->RegisterService((Service *)&g_samgrService);
SAMGR_GetInstance()->RegisterDefaultFeatureApi(SOFTBUS_SERVICE, GET_IUNKNOWN(g_samgrService));

三、服务框架初始化入口——启动阶段的模块跳转

文件:core/frame/common/src/softbus_server_frame.cInitSoftBusServer()

OnStart()InitSoftBusServer() 按顺序跳到各模块的 Init 函数(任何一个失败则回滚 ServerModuleDeinit()):

InitSoftBusServer()
 ├─ SoftbusConfigInit()           ← 配置文件加载
 ├─ LnnInitMonitorInit()          ← LNN 初始化依赖监视器
 ├─ ServerStubInit()              ← IPC stub 初始化
 ├─ SoftBusTimerInit()            ← 定时器
 ├─ LooperInit()                  ← 消息循环(见第五部分)
 ├─ InitDdos()                    ← DDoS 防护
 ├─ InitServicesAndModules():
 │   ├─ ConnServerInit()          → core/connection/manager/ 连接管理
 │   ├─ AuthInit()                → core/authentication/ 认证
 │   ├─ DiscServerInit()          → core/discovery/ 设备发现
 │   ├─ BusCenterServerInit()     → core/bus_center/ 总线中心
 │   ├─ TransServerInit()         → core/transmission/ 传输层
 │   ├─ DiscEventManagerInit()    → 发现事件管理器
 │   ├─ GetWifiDirectManager()->init() → WiFi Direct 模块
 │   ├─ ConnBleDirectInit()       → BLE Direct 连接
 │   └─ InitSoftbusSysEvt() / SoftBusHiDumperInit() → DFX
 └─ SoftBusBtInit()               → 蓝牙初始化

每个 Init 函数内部再跳到各自的子模块 init。

四、客户端 SDK 初始化入口——应用进程→软总线服务的跳转

文件:sdk/frame/common/src/softbus_client_frame_manager.cInitSoftBus(const char *pkgName)

应用调用此函数来接入软总线:

InitSoftBus(pkgName)
 ├─ SoftbusConfigInit()
 ├─ EventClientInit()              → 事件管理器
 ├─ BusCenterClientInit()          → 总线中心客户端
 ├─ ConnClientInit()               → 连接套接字 / BaseListener
 ├─ TransClientInit()              → 传输层客户端
 ├─ ClientStubInit()               → IPC stub 初始化
 └─ ClientRegisterService(pkgName) → 通过 IPC 跳到服务端 SoftbusRegisterService()

客户端 IPC 代理(标准系统):

文件 职责
sdk/frame/standard/src/softbus_server_proxy_standard.cpp 客户端发送 IPC 请求的入口,ClientRegisterService() → IPC → 服务端 SoftbusRegisterServiceInner()
sdk/frame/standard/src/softbus_client_stub.cpp 服务端回调客户端时的 IPC 反跳转(如 session 打开通知、数据到达)

五、Looper 消息循环入口——异步执行跳转

文件:core/common/message_handler/message_handler.c

LooperInit() 创建两个 looper 线程:

Loop 名称 线程函数 用途
BusCenter_Lp LoopTask Bus Center 主消息循环
ReactorLink_Lp LoopTask 连接层 Reactor 消息循环

另有 4 个 Looper 类型槽位:

类型 获取方式 典型使用方
LOOP_TYPE_DEFAULT GetLooper(LOOP_TYPE_DEFAULT) Bus Center
LOOP_TYPE_CONN GetLooper(LOOP_TYPE_CONN) 连接层
LOOP_TYPE_LNN GetLooper(LOOP_TYPE_LNN) LNN
LOOP_TYPE_DISC GetLooper(LOOP_TYPE_DISC) 发现层

Looper 的工作方式:PostMessage() / PostMessageDelay() 向队列插入消息 → LoopTask 线程取出 → 调用 msg->handler->HandleMessage(msg)

这是一个非常核心的跳转机制——各种模块通过 PostMessage 把执行跳转到对应的 looper 线程去做异步处理(如连接建立、认证超时、重试等)。

六、公开 API 入口——应用→软总线的跳转

Session API

头文件:interfaces/kits/transport/session.h

API 跳转目标
CreateSessionServer() IPC → 服务端 TransCreateSessionServer()
RemoveSessionServer() IPC → 服务端 TransRemoveSessionServer()
OpenSession() IPC → 服务端 TransOpenSession()
CloseSession() IPC → 服务端 TransCloseSession()
SendBytes() IPC → 服务端 TransSendMsg()
SendMessage() IPC → 服务端 TransSendMsg()
SendStream() 传输层流通道
SendFile() 传输层文件通道

回调入口(服务端→客户端):

回调 触发时机
ISessionListener.OnSessionOpened session 打开完成
ISessionListener.OnSessionClosed session 关闭
ISessionListener.OnBytesReceived 收到字节数据
ISessionListener.OnMessageReceived 收到消息数据
ISessionListener.OnStreamReceived 收到流数据
ISessionListener.OnQosEvent QoS 事件

总线中心 API

头文件:interfaces/kits/bus_center/softbus_bus_center.h

API 跳转目标
JoinLNN() IPC → 服务端 LnnIpcServerJoin() → 核心 LNN 模块
LeaveLNN() IPC → 服务端 LnnIpcServerLeave()
GetAllOnlineNodeInfo() IPC → LnnIpcGetAllOnlineNodeInfo()
GetLocalDeviceInfo() IPC → LnnIpcGetLocalDeviceInfo()
GetNodeKeyInfo() IPC → LnnIpcGetNodeKeyInfo()
PublishLNN() IPC → LnnIpcPublishLNN()
RefreshLNN() IPC → LnnIpcRefreshLNN()

七、Connection 连接管理入口

核心文件:core/connection/manager/softbus_conn_manager.cConnServerInit()

连接层提供多种底层连接类型之间的抽象,执行跳转包括:

项目 说明
ConnOpenSocket() 创建 TCP/BLE/BT 连接
ConnPostMessage() / ConnSetConnectCallback() 连接事件回跳
WiFi Direct core/connection/wifi_direct_cpp/ — 含 Scheduler / Executor 工厂,跳转到具体的 WiFi P2P 控制逻辑

八、认证层入口

核心文件:core/authentication/src/auth_manager.cAuthInit()

认证过程中关键的 FSM(有限状态机):

项目 说明
FSM 文件 core/authentication/src/auth_session_fsm.c
状态流转 STATE_AUTH_INIT → STATE_AUTH_PROCESS → STATE_AUTH_COMPLETE
完成跳转 认证完成后跳到 AuthOnSessionLinked() → 通知 LNN

九、总结:完整执行时序图

sequenceDiagram
    participant App as App进程
    participant SDK as SDK客户端
    participant SA as SoftBusServer(SA 4700)
    participant LNN as LNN模块
    participant Auth as Auth认证
    participant Conn as Conn连接
    participant Trans as Trans传输

    App->>SDK: InitSoftBus(pkgName)
    SDK->>SA: IPC: SoftbusRegisterService()
    App->>SDK: CreateSessionServer()
    SDK->>SA: IPC: TransCreateSessionServer()
    App->>SDK: OpenSession()
    SDK->>SA: IPC: TransOpenSession()
    SA->>LNN: LnnQueryLaneResource() 选路
    SA->>Auth: AuthInit() 认证
    SA->>Conn: ConnOpenSocket() 建连
    SA-->>SDK: OnSessionOpened() IPC回调
    SDK-->>App: ISessionListener.OnSessionOpened
    App->>SDK: SendBytes()
    SDK->>SA: IPC: TransSendMsg()
    SA->>Trans: 底层socket发送

十、关键跳转点总结

序号 跳转点 说明
1 SA 注册 进程起点,SAMGR 拉起服务
2 IPC 存根分派 客户端→服务端的执行跳转
3 模块 Init 链 启动阶段的模块跳转
4 Looper 消息队列投递 异步执行跳转
5 客户端代理/回调 服务端→客户端的反跳转
6 认证 FSM 认证状态机跳转
7 连接/传输层 连接管理与传输层内部跳转

欢迎加入Laval社区

社区规范:仅讨论OpenHarmony相关问题。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐