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   ![](../figures/h2sa_outRes.png)
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_cifoundation/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_cibuild/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_civendor/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   >~~~