dsoftbus-执行入口梳理
分布式软总线执行入口梳理
本文梳理 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 在跳转处理器之前先做访问令牌权限检查。
额外入口:GetSoftbusSpecObject 和 GetBusCenterExObj 提供了子对象,客户端拿到后可以进一步通过二级 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.c — InitSoftBusServer()
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.c — InitSoftBus(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.c — ConnServerInit()
连接层提供多种底层连接类型之间的抽象,执行跳转包括:
| 项目 | 说明 |
|---|---|
| ConnOpenSocket() | 创建 TCP/BLE/BT 连接 |
| ConnPostMessage() / ConnSetConnectCallback() | 连接事件回跳 |
| WiFi Direct | core/connection/wifi_direct_cpp/ — 含 Scheduler / Executor 工厂,跳转到具体的 WiFi P2P 控制逻辑 |
八、认证层入口
核心文件:core/authentication/src/auth_manager.c — AuthInit()
认证过程中关键的 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相关问题。
更多推荐
所有评论(0)