鸿蒙Samgr_Lite的文件框架层次分析与总结
在OneCoin小组的共同努力下,最后一个模块的标注也基本完成,这里简单总结一下整个框架的层次分析,以及内部逻辑和功能的一些总结和感想
1. Samgr_Lite的文件框架图
# Samgr_Lite
1. communication
1. broadcast_service.c:实现了广播服务继承服务的四个函数以及广播服务的注册函数
2. broadcast_service.c:BroadcastService结构体的定义所在(其实就简单使用INHERIT_SERVICE继承了服务的四个函数指针)
3. pub_sub_feature.c:实现了广播服务feature继承feature的四个函数以及获取存储了特定topic对应consumer的Relation的函数 GetRelation和判断topic是否一致的IsTopicEqual
4. pub_sub_feature.h:ConsumerNode、Relation和PubSubFeature结构体的定义
5. pub_sub_implement.c:pubsubFeature的功能实现比如publish、subscribe等涉及consumer、provider和subscriber和操作
6. pub_sub_implement.h:PubSubImplement结构体的定义所在
2. interfaces:全部都是头文件用于描述框架中各部分结构体的定义,包括广播、代理、vector等
1. innerkits
1. distributed_service_interface.h:主要定义了DmsLiteCommonErrorCode
2. kits
1. communication:广播中三个重要角色consumer、provider、subscriber的定义
2. registry:代理客户端口和服务端口的定义
3. samgr:包括vector、feature、server、message、iunknown等重要结构体的定义和详细介绍
3. samgr
1. adapter
1. cmsis:M核适配的线程、队列、内存分配机制
2. posix:A核适配的线程、队列、内存分配机制
2. registry
1. service_registry.c:五个weak Api函数
2. service_registry.h:四个Api函数的定义头文件
3. resource
1. common.c:封装了关于Vector的九种操作函数
2. feature_impl.h:关于featureImp的结构体核函数封装
3. feature.c:注册服务featureImpl的相关函数封装,包括接口的添加、删除和获取以及为feature创建一个featureImpl的 FEATURE_CreateInstance
4. iunknown.c:iunknown接口的三个函数指针的实现
5. message_inner.h:通信的封装结构体exchange的定义以及exchange类型枚举的定义
6. message.c:包含了几种类型的request和response用于不同场景下的进程通信
7. samgr_lite_inner.h:非常非常重要的SamgrLiteImpl结构体和BootStatus系统状态枚举变量的定义
8. samgr_lite.c:整个框架重中之重的代码文件,涵盖的内容非常广,首先实现了SamgrLite结构体中的13个函数指针所指函数包括重 要的服务、feature、featureApi的注册和注销;然后就是为了实现服务初始化的一些函数包括taskPool创建函数、初始化服务请求函数和判断是否全部初始化等函数,通过这些函数来启动整个系统,使得系统状态BootStatus达到DYNAMIC运行状态
9. service_impl.h:ServiceImpl和Operations结构体的定义
10. service.c:主要是serviceImpl的创建以及相应feature的添加、获取、删除和消息处理函数
11. task_manager.c:taskPool的创建、工作流程中的六种函数实现
12. task_manager.h:TaskPool结构体定义以及创建三种taskPool和获取的函数定义
4. samgr_client/source
1. remote_register.h:RemoteRegister结构体定义
2. remote_register.c:主要是serviceApi的注册相关函数以及g_remoteRegister初始化函数
5. samgr_endpoint/source
1. client_factory.c:封装了创建客户代理的factory方法相关函数
2. default_client.c:包含客户代理实例IDefaultClient的创建以及ProxyInvoke实现代理功能的函数相关
3. default_client.h:定义了SaName{serviceName, featureName}
4. endpoint.c:主要包括endpoint的创建、注册与重新注册、路由的添加、boss线程的创建运行、对外的服务处理函数,还包括feature的注册,feature对应的Policy生成以及添加,还有对消费者享用服务的权限检查,提供系统能力(SysCap)的注册、查询,以及获取所有 SysCap 的接口(具体包括发送获取所有 SysCap 消息的函数和以及对该消息解析处理的函数)
6. endpoint.h:两个枚举变量ResourceID和OptionID的定义,一个用于标志消息来源,一个用于标志操作类型。一个重要结构体 Endpoint的定义
7. sa_store.c:存储SA service和feature的身份信息,包括名称、handle、token等
8. sa_store.h:重要结构体SAStore的定义所在,存储了service和feature的身份信息
9. token_bucket.c:token桶的实现,用于实现限流管控
10. token_bucket.h:TokenBucket以及BucketStatus的定义所在
6. samgr_server/source
1. samgr_server.c:四个重要函数和一个重要全局变量
1. g_server:SamgrServer类型,同样继承了service的四个函数以及服务代理的invoke函数
2. InitializeRegistry:g_server的初始化,包括capabilities和CapSysImpl和endpoint的创建和注册等
3. ProcEndpoint:从origin中解析出pid,在saStore中查找对应handle,不存在则新建,并将handle作为reply输入缓冲区
4. ProcFeature:分为两种操作,PUT则调用调用ProcPutFeature,GET则调用ProcGetFeature
5. ProcSysCap:三种操作:PUT调用ProcAddSysCap,GET调用ProcGetSysCap,ALL则调用ProcGetAllSysCap
2. samgr_server.h:三个结构体定义所在:
1. SamgrProxy:服务代理
2. SamgrServer:服务管理实例
3. SysCapImpl:注册服务的登记表
2. 五大模块总结
按照逻辑可以分为这么几大块:
- communication广播服务模块
- 客户端代理服务端代理注册和初始化模块
- SamgrServer服务模块
- 整个Samgr系统的启动模块(包括系统服务和用户APP服务的注册和初始化)
- IPC通信和消息处理的任务机制模块
这里简单回顾一下这几个模块的主要功能:
- communication广播服务模块:作为系统服务之一的广播服务,在完成在g_samgrImpl的注册和初始化后,根据topic的类型,将信息发送给Relation链表中topic对应的consumer,本质的机制还是IPC
我们也可以通过这个服务来具体看到系统服务是如何在系统中注册和初始化的 - 客户端服务端代理注册和初始化模块:客户端代理通过g_remoteRegister进行管理和操作,服务端代理通过g_server管理,实际上都是在其中的endpoint中,proxy作为接口API为服务直接提供了通信的接口,IPC通信也是通过endpoint来进行的
- SamgrServer服务模块:包括了服务端endpoint的创建和初始化,通过g_server管理endpoint,并通过结构体sa_Store管理服务和feature的信息,通过三个ProcXXX函数来具体处理request并返回reply
- 整个Samgr系统的启动模块:一个服务的启动三步走:服务注册,服务初始化,服务Api的注册和初始化;整个Samgr系统的启动三步走:系统服务注册、用户APP服务注册、所有服务的初始化,使得BootStatus进入DYNAMIC状态
- IPC通信和消息处理的任务机制模块:IPC通信机制主要是从listen出发到invoke调用处理函数,从QUEUE进入Thread完成处理后将reply再通过Dispatch沿着router按照policy返回通信endpoint的整个过程;消息处理主要是通过taskPool中的队列和线程进行处理调度
3. 基于SA框架完整的进程通信机制
经过对全部代码的解读,结合五大模块的功能和原理,最后以图示和文字说明的方式再一次完整的阐明整个SA框架下的进程通信机制
整个流程大致如下:
1. 首先通过整个服务启动的三步走完成系统服务启动
2. 每个服务对应有默认的serviceApi或者有0个、1个或多个featureImpl对应的featureApi其内部机制就是对应的endpoint管理着proxy、router、policy
3. 通过proxy代理开启listen,然后创建一个boss线程进行receive并startLoop
4. 再调用Dispatch根据policy进行信息的规范然后对应router信息发送到对应进程的endpoint上
5. 接收endpoint通过receive接收后调用HandleIPC通过proxy,根据发送message中的operation调用不同的handle进行处理并将reply写入缓冲区发送回endpoint完成一次IPC
至此Samgr_Lite的全部代码解读完毕,当然几篇文章并不足以详尽的写完整个SA服务框架,更多的细节和功能待读者发掘