IPC通信过程
设计接口类继承 IRemoteBroker,接口方法一般设计为虚方法。
定义该服务对外提供的能力集合函数,统一继承IPC接口类IRemoteBroker;同时声明该IPC对外接口唯一标识符DECLARE_INTERFACE_DESCRIPTOR(XXX);该标识符用于IPC通信的校验等目的。
定义IPC接口ITestAbility SA接口继承IPC基类接口IRemoteBroker,接口里定义描述符、业务函数和消息码,其中业务函数在Proxy端和Stub端都需要实现。
源码路径:
foundation\ability\ability_runtime\interfaces\inner_api\ability_manager\include\ability_manager_interface.h
2.定义客户端代码XXXProxy(IremoteProxy)
设计proxy类 继承至 IRemoteProxy,并且实现sendRequest方法和自身虚方法。
源码路径:
foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_proxy.h
foundation\ability\ability_runtime\services\abilitymgr\src\ability_manager_proxy.cpp
3.定义服务端代码XXXstub
设计stub类 继承至 IRemoteStub ,并且实现OnRemote方法和自身虚方法。
定义和实现服务端TestAbilityStub 该类是和IPC框架相关的实现,需要继承 IRemoteStub
foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_stub.h
foundation\ability\ability_runtime\services\abilitymgr\src\ability_manager_stub.cpp
4.sa的实现类
foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_service.h
5.SystemAbility配置
{
"process": "listen_test",//指定的进程名字
"systemability": [
{
"name": 180,//SA的名字,对应sa的systemabilityID为1001
"libpath": "libabilityms_test.z.so",//SA对应动态链接库的路径为liblisten_test.z.so "run-on-create": true,//是否在创建时就运行启动
"distributed": false,//是否支持分布式通信
"dump_level": 1 //调试信息级别为1
}
]
}
BUILD.gn文件
"services" : [{
"name" : "foundation",//服务名称
"path" : ["/system/bin/sa_main", "/system/profile/foundation.xml"], //sa服务的路径
"importance" : -20,
"uid" : "foundation", //...此处省略若干行 } ]
简单的cfg'文件格式如下:
{ "import" : [ ],//import下添加当前配置文件依赖的配置文件
"jobs" : [ ],//jobs为添加cfg的职能,包含服务的名称name以及需要执行的命令cmd
"services" : [ ] }//为添加的服务及其参数,示例如下
"services":[{
"name":"appspawn",//服务名称为appspawn
"path":["/system/bin/appspawn"],//服务的可执行文件路径
"uid":"root",//以root用户身份运行
"once":0,//0表示常驻进程,退出后init会重新拉起(但5分钟内连续退出5次后不再重启)
"importance":-10,//绑定到高优先级(-10
"critical":[1,5],服务崩溃时的恢复策略,5秒内崩溃超限则重启系统
"socket":[{//通过套接字通信。
"name":"appspawn",
"type":"SOCK_STREAM",
"permissions":"0660"
}]
}]