18c339a94Sopenharmony_ci### Usage Guide 28c339a94Sopenharmony_ci 38c339a94Sopenharmony_ci## 简介 48c339a94Sopenharmony_ci 58c339a94Sopenharmony_cih2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。实现Service远程调用接口需要开发人员熟悉IPC通信框架,了解proxy/stub的继承与实现方式,掌握C++类型转为MessageParcel数据包的各种API方法,有一定的学习成本。而Service代码生成工具能够帮助使用者生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。 68c339a94Sopenharmony_ci 78c339a94Sopenharmony_ci## 约束 88c339a94Sopenharmony_ci 98c339a94Sopenharmony_ci系统:建议Ubuntu 20.04或者Windows 10 108c339a94Sopenharmony_ci 118c339a94Sopenharmony_ci依赖版本:VS Code 1.62.0 128c339a94Sopenharmony_ci 138c339a94Sopenharmony_ci## 使用方法 148c339a94Sopenharmony_ci 158c339a94Sopenharmony_ci#### 命令行 168c339a94Sopenharmony_ci 178c339a94Sopenharmony_ci1. 安装python库 CppHeaderParser 188c339a94Sopenharmony_ci 198c339a94Sopenharmony_ci ~~~ 208c339a94Sopenharmony_ci pip install CppHeaderParser 218c339a94Sopenharmony_ci ~~~ 228c339a94Sopenharmony_ci 238c339a94Sopenharmony_ci2. 安装typescript:在napi_generator/src/cli/h2sa/src目录下执行命令 248c339a94Sopenharmony_ci 258c339a94Sopenharmony_ci ~~~ 268c339a94Sopenharmony_ci npm i typescript 278c339a94Sopenharmony_ci ~~~ 288c339a94Sopenharmony_ci 298c339a94Sopenharmony_ci3. 安装stdio:在napi_generator/src/cli/h2sa目录下执行命令 308c339a94Sopenharmony_ci 318c339a94Sopenharmony_ci ~~~ 328c339a94Sopenharmony_ci npm i stdio 338c339a94Sopenharmony_ci ~~~ 348c339a94Sopenharmony_ci 358c339a94Sopenharmony_ci4. 在napi_generator/src/cli/h2sa/src/gen目录下执行命令生成service框架代码: 368c339a94Sopenharmony_ci 378c339a94Sopenharmony_ci ~~~ 388c339a94Sopenharmony_ci node main.js -f test.h 398c339a94Sopenharmony_ci ~~~ 408c339a94Sopenharmony_ci 418c339a94Sopenharmony_ci其中,参数详情如下: 428c339a94Sopenharmony_ci 438c339a94Sopenharmony_ci-f,定义远程服务的.h文件; 448c339a94Sopenharmony_ci 458c339a94Sopenharmony_ci-l,可选参数,日志级别(0-3),默认为1; 468c339a94Sopenharmony_ci 478c339a94Sopenharmony_ci-o,可选参数,生成框架代码输入到指定路径下; 488c339a94Sopenharmony_ci 498c339a94Sopenharmony_ci-s,可选参数,指定serviceID,默认为19000; 508c339a94Sopenharmony_ci 518c339a94Sopenharmony_ci-v,可选参数,指定版本(3.2和4.1,默认版本为3.2) 528c339a94Sopenharmony_ci 538c339a94Sopenharmony_ci#### 生成物 548c339a94Sopenharmony_ci 558c339a94Sopenharmony_ci1. 输出testservice文件夹,其中的文件如下所示: 568c339a94Sopenharmony_ci 578c339a94Sopenharmony_ci  588c339a94Sopenharmony_ci 598c339a94Sopenharmony_ci ~~~ 608c339a94Sopenharmony_ci ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 618c339a94Sopenharmony_ci ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 628c339a94Sopenharmony_ci ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 638c339a94Sopenharmony_ci │ ├── BUILD.gn 648c339a94Sopenharmony_ci │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 658c339a94Sopenharmony_ci ├── include 668c339a94Sopenharmony_ci │ ├── test_service.h # 服务端头文件 678c339a94Sopenharmony_ci │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 688c339a94Sopenharmony_ci │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 698c339a94Sopenharmony_ci ├── interface 708c339a94Sopenharmony_ci │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 718c339a94Sopenharmony_ci ├── sa_profile 728c339a94Sopenharmony_ci │ ├── 19000.json # 服务配置文件 738c339a94Sopenharmony_ci │ └── BUILD.gn 748c339a94Sopenharmony_ci └── src 758c339a94Sopenharmony_ci ├── i_test_service.cpp # 接口实现文件 768c339a94Sopenharmony_ci ├── test_client.cpp # 客户端程序 778c339a94Sopenharmony_ci ├── test_service.cpp # 服务端程序 788c339a94Sopenharmony_ci ├── test_service_proxy.cpp # 客户端代理实现 798c339a94Sopenharmony_ci └── test_service_stub.cpp # 服务端 stub 实现 808c339a94Sopenharmony_ci ~~~ 818c339a94Sopenharmony_ci 828c339a94Sopenharmony_ci#### 应用和验证 838c339a94Sopenharmony_ci 848c339a94Sopenharmony_ci1. 将生成的testservice文件夹放在对应版本的源码根目录下 858c339a94Sopenharmony_ci 868c339a94Sopenharmony_ci2. 修改服务配置文件 878c339a94Sopenharmony_ci 888c339a94Sopenharmony_ci 在foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include/system_ability_definition.h增加以下一行: 898c339a94Sopenharmony_ci 908c339a94Sopenharmony_ci ``` 918c339a94Sopenharmony_ci TEST_SERVICE_ID = {serviceID}, //保证ID与参数-s的值一致且没有重复,例如:默认值19000 928c339a94Sopenharmony_ci ``` 938c339a94Sopenharmony_ci 948c339a94Sopenharmony_ci3. 修改子系统配置文件 958c339a94Sopenharmony_ci 968c339a94Sopenharmony_ci 在build/subsystem_config.json中增加以下内容。 978c339a94Sopenharmony_ci 988c339a94Sopenharmony_ci ``` 998c339a94Sopenharmony_ci "testservice": { 1008c339a94Sopenharmony_ci "path":"testservice", 1018c339a94Sopenharmony_ci "name": "testservice" 1028c339a94Sopenharmony_ci } 1038c339a94Sopenharmony_ci ``` 1048c339a94Sopenharmony_ci 1058c339a94Sopenharmony_ci4. 修改产品配置,如rk3568 1068c339a94Sopenharmony_ci 1078c339a94Sopenharmony_ci 在vendor/hihope/rk3568/config.json中增加以下内容: 1088c339a94Sopenharmony_ci 1098c339a94Sopenharmony_ci ``` 1108c339a94Sopenharmony_ci { 1118c339a94Sopenharmony_ci "subsystem": "testservice", 1128c339a94Sopenharmony_ci "components": [ 1138c339a94Sopenharmony_ci { 1148c339a94Sopenharmony_ci "component": "testservice_part", 1158c339a94Sopenharmony_ci "features": [] 1168c339a94Sopenharmony_ci } 1178c339a94Sopenharmony_ci ] 1188c339a94Sopenharmony_ci } 1198c339a94Sopenharmony_ci ``` 1208c339a94Sopenharmony_ci 1218c339a94Sopenharmony_ci5. 修改权限配置 1228c339a94Sopenharmony_ci 1238c339a94Sopenharmony_ci 在相应的产品目录的vendor/hihope/rk3568/security_config/high_privilege_process_list.json中增加以下内容: 1248c339a94Sopenharmony_ci 1258c339a94Sopenharmony_ci ``` 1268c339a94Sopenharmony_ci { 1278c339a94Sopenharmony_ci "name": "testservice", 1288c339a94Sopenharmony_ci "uid": "system", 1298c339a94Sopenharmony_ci "gid": ["root", "system"] 1308c339a94Sopenharmony_ci } 1318c339a94Sopenharmony_ci ``` 1328c339a94Sopenharmony_ci 1338c339a94Sopenharmony_ci6. selinux权限配置 1348c339a94Sopenharmony_ci 1358c339a94Sopenharmony_ci vendor/hihope/rk3568/config.json中"build_selinux"属性若为true, 即要配置selinux权限,应修改以下文件;若为false,无需修改 1368c339a94Sopenharmony_ci 1378c339a94Sopenharmony_ci > 1. testservice/etc/sample_service.cfg 1388c339a94Sopenharmony_ci > 1398c339a94Sopenharmony_ci > ``` 1408c339a94Sopenharmony_ci > "secon" : "u:r:testservice:s0" 1418c339a94Sopenharmony_ci > ``` 1428c339a94Sopenharmony_ci > 1438c339a94Sopenharmony_ci > 2. base/security/selinux_adapter/sepolicy/base/public/service_contexts 1448c339a94Sopenharmony_ci > 1458c339a94Sopenharmony_ci > ``` 1468c339a94Sopenharmony_ci > 9016 u:object_r:sa_testservice:s0 1478c339a94Sopenharmony_ci > ``` 1488c339a94Sopenharmony_ci > 1498c339a94Sopenharmony_ci > 3. base/security/selinux_adapter/sepolicy/base/public/service.te 1508c339a94Sopenharmony_ci > 1518c339a94Sopenharmony_ci > ``` 1528c339a94Sopenharmony_ci > type sa_testservice, sa_service_attr; 1538c339a94Sopenharmony_ci > ``` 1548c339a94Sopenharmony_ci > 1558c339a94Sopenharmony_ci > 4. base/security/selinux_adapter/sepolicy/ohos_policy/startup/init/system/init.te 1568c339a94Sopenharmony_ci > 1578c339a94Sopenharmony_ci > ``` 1588c339a94Sopenharmony_ci > allow init testservice:process { getattr rlimitinh siginh transition }; 1598c339a94Sopenharmony_ci > ``` 1608c339a94Sopenharmony_ci > 1618c339a94Sopenharmony_ci > 5. base/security/selinux/sepolicy/base/public/type.te 1628c339a94Sopenharmony_ci > 1638c339a94Sopenharmony_ci > ``` 1648c339a94Sopenharmony_ci > type testservice, sadomain, domain; 1658c339a94Sopenharmony_ci > ``` 1668c339a94Sopenharmony_ci > 1678c339a94Sopenharmony_ci > 6. /base/security/selinux/sepolicy/base/te目录下增加新service的te文件,新增文件名即为服务名,例如:testservice.te 1688c339a94Sopenharmony_ci > 1698c339a94Sopenharmony_ci > ``` 1708c339a94Sopenharmony_ci > allow testservice init_param:file { map open read }; 1718c339a94Sopenharmony_ci > allow testservice sa_testservice:samgr_class { add get }; 1728c339a94Sopenharmony_ci > ``` 1738c339a94Sopenharmony_ci 1748c339a94Sopenharmony_ci7. 编码完成后,执行镜像编译命令 1758c339a94Sopenharmony_ci 1768c339a94Sopenharmony_ci ~~~ 1778c339a94Sopenharmony_ci ./build.sh --product-name 产品名 1788c339a94Sopenharmony_ci 1798c339a94Sopenharmony_ci 若编译rk3568开发板,则执行 1808c339a94Sopenharmony_ci ./build.sh --product-name rk3568 1818c339a94Sopenharmony_ci ~~~ 1828c339a94Sopenharmony_ci 1838c339a94Sopenharmony_ci8. 烧录镜像 1848c339a94Sopenharmony_ci 1858c339a94Sopenharmony_ci9. 运行验证 1868c339a94Sopenharmony_ci 1878c339a94Sopenharmony_ci >验证一: shell登录开发板。 查看服务端进程是否已正常启动 1888c339a94Sopenharmony_ci > 1898c339a94Sopenharmony_ci >~~~ 1908c339a94Sopenharmony_ci >ps -ef | grep testservice 1918c339a94Sopenharmony_ci >system 288 1 0 00:02:13 ? 00:00:00 testservice_sa --- 服务进程已正常运行 1928c339a94Sopenharmony_ci >~~~ 1938c339a94Sopenharmony_ci > 1948c339a94Sopenharmony_ci >验证二:运行客户端 1958c339a94Sopenharmony_ci > 1968c339a94Sopenharmony_ci >~~~ 1978c339a94Sopenharmony_ci >/system/bin/testclient 1988c339a94Sopenharmony_ci >~~~