SA服务中的IPC通信和init自定义SA启动过程(二)

IPC通信过程

  1. 定义IPC对外接口IXXX如(IRemotebroker)

 设计接口类继承 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。Stub端作为接收请求的一端,需重写OnRemoteRequest方法用于接收客户端调用。

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配置

  1. xxx.json文件(服务配置文件)

{

  "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文件

  1. cfg配置文件

"services" : [{

 "name" : "foundation",//服务名称

 "path" : ["/system/bin/sa_main", "/system/profile/foundation.xml"], //sa服务的路径

"importance" : -20,

"uid" : "foundation", //...此处省略若干行 } ]

  1. 要实现开机时启动某个SA服务时,需要在init.cfg文件和build.gn中进行配置。
  1. 其中init.cfg默认配置文件,由init系统定义,优先解析。
  2. /system/etc/init/*.cfg各子系统定义的配置文件。
  3. /vendor/etc/init/*.cfg厂商定义的配置文件。

简单的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"

}]

}]

  • 格式校验:JSON格式错误会导致解析失败,引发parse failed!错误。
  • 权限问题:若服务启动失败(如err 13),需检查SELinux策略或临时禁用(setenforce 0)进行测试。

你可能感兴趣的:(wpf,c#,开发语言,harmonyos)