From 4dbdc0948d6a7a2e6ea25c939fb0953bd5b130f9 Mon Sep 17 00:00:00 2001 From: huruitao Date: Tue, 20 Aug 2024 17:59:28 +0800 Subject: [PATCH 01/15] =?UTF-8?q?md=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- src/cli/h2sa/Develop_Guide_sa.md | 233 +++++++++++++++++++++++++++++++ src/cli/h2sa/Usage.md | 54 +++++++ 2 files changed, 287 insertions(+) create mode 100644 src/cli/h2sa/Develop_Guide_sa.md create mode 100644 src/cli/h2sa/Usage.md diff --git a/src/cli/h2sa/Develop_Guide_sa.md b/src/cli/h2sa/Develop_Guide_sa.md new file mode 100644 index 00000000..4a142104 --- /dev/null +++ b/src/cli/h2sa/Develop_Guide_sa.md @@ -0,0 +1,233 @@ +## Develop guide + +### Service代码生成工具使用场景 + +​ 当开发人员为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。 Service代码生成工具能够帮助用户生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。用户可基于框架代码专注于业务功能的编写。 + +![image-20240723101920662](C:\Users\kaihong\AppData\Roaming\Typora\typora-user-images\image-20240723101920662.png) + +--- + +### Service工具代码框架说明 + +~~~ +napi_generator\src\cli\h2sa + +h2sa +├── docs //文档,(后续文档会整理在一起) +├── examples //样例,测试h文件 +│ ├── sample.h +│ └── test.h +├── h2sa_DEVELOP_README_ZH.md //开发文档 +├── README_ZH.md //usage,使用说明 +└── src + ├── package.json //Node.js打包配置文件 + └── src + ├── gen + │ ├── analyze.js //包含用于分析C++头文件的逻辑。读取头文件内容;解析文件以提取类、方法、参数等信息。 + │ ├── fileTemplate.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) + │ ├── generate.js //包含核心的代码生成逻辑。调用analyze.js来获取分析结果;使用fileTemplate.js中的模板和分析结果来生成代码。 + │ ├── header_parser.py //脚本,与analyze.js协同工作,用于解析C++头文件 + │ └── main.js //项目的入口。初始化日志记录和其他工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 + └── tools + ├── common.js //包含整个项目中使用的通用函数和常量 + ├── FileRW.js //包含文件读写操作的JavaScript模块 + ├── NapiLog.js //日志记录模块 + ├── re.js //包含正则表达式相关功能的模块 + └── tool.js //包含一些辅助工具函数 +~~~ + +运行逻辑 + +![image-20240723144207759](C:\Users\kaihong\AppData\Roaming\Typora\typora-user-images\image-20240723144207759.png) + +js文件中的部分重要函数和参数: + +~~~ +//main.js + +let ops = stdio.getopt({ + //命令行参数 + 'filename': { key: 'f', args: 1, description: '.h file', default: '' }, + 'out': { key: 'o', args: 1, description: 'output directory', default: '.' }, + 'loglevel': { key: 'l', args: 1, description: 'Log Level: 0~3', default: '1' }, + 'serviceId': { key: 's', args: 1, description: 'service register id: 9000~16777214', default: '9000' }, + 'versionTag': { key: 'v', args: 1, description: 'version tag: 4.1 / 3.2', default: '3.2' } +}); + +function genServiceFile(fileName) { + // 1. h文件解析保存为结构体 + let rootInfo = analyze.doAnalyze(fileName, ops); + + // 2. 根据结构体生成代码 + let fileContent = gen.doGenerate(rootInfo); + + // 3. 创建service工程目录 + let servicePath = re.pathJoin(ops.out, rootInfo.serviceName.toLowerCase() + 'service'); + let etcPath = re.pathJoin(servicePath, 'etc'); + let includePath = re.pathJoin(servicePath, 'include'); + let interfacePath = re.pathJoin(servicePath, 'interface'); + let profilePath = re.pathJoin(servicePath, 'sa_profile'); + let srcPath = re.pathJoin(servicePath, 'src'); + createFolder(servicePath); + createFolder(etcPath); + createFolder(includePath); + createFolder(interfacePath); + createFolder(profilePath); + createFolder(srcPath); + + // 4. 生成代码保存为文件 + wirte2Disk(fileContent.serviceCfgGnFile, etcPath); + wirte2Disk(fileContent.proxyHFile, includePath); + wirte2Disk(fileContent.stubHFile, includePath); + ... +} + +~~~ + +~~~ +// analyze.js + +function doAnalyze(hFilePath, cmdParam) { + let parseResult = parseFileAll(hFilePath); + parseResult.isInclude = false; + AllParseFileList.push(parseResult); + let rootInfo = { + 'serviceName': '', + 'nameSpace': [], + 'class': [], + 'includes': [], + 'using': [], + 'serviceId': (cmdParam.serviceId === null || cmdParam.serviceId === undefined) ? + '9002' : cmdParam.serviceId, + 'versionTag': (cmdParam.versionTag === null || cmdParam.versionTag === undefined) ? + '3.2' : cmdParam.versionTag, + 'rawContent': parseResult.rawContent + }; + + analyzeNameSpace(rootInfo, parseResult); + analyzeClasses(rootInfo, parseResult.classes); + rootInfo.includes = parseResult.includes; + rootInfo.using = parseResult.using; + return rootInfo; //经过解析后返回的结构体;作为参数,传值调用使用 +} + +~~~ + +~~~ +//generate.js +let fileContent = { + 'iServiceHFile': {}, + 'proxyHFile': {}, + 'stubHFile': {}, + 'serviceHFile': {}, + 'proxyCppFile': {}, + 'stubCppFile': {}, + 'serviceCppFile': {}, + 'clientCppFile': {}, + 'buildGnFile': {}, + 'bundleJsonFile': {}, + 'profileGnFile': {}, + 'profileXmlFile': {}, + 'profileJsonFile': {}, + 'serviceCfgFile': {}, + 'serviceCfgGnFile': {}, + 'iServiceCppFile': {}, +}; + +function doGenerate(rootInfo) { + rootHFileSrc = rootInfo.rawContent; + let lowServiceName = rootInfo.serviceName.toLowerCase(); + let upperServiceName = rootInfo.serviceName.toUpperCase(); + + // 生成文件名 + genFileNames(lowServiceName, rootInfo); + + // 按模板生成.h和.cpp文件内容框架 + let files = genFilesByTemplate(upperServiceName, lowServiceName, rootInfo); + + // 替换文件includes + replaceIncludes(files, rootInfo); + ... + + // 替换namespace + replaceServiceName(files, rootInfo); + + // 替换类名 + let classInfo = rootInfo.class[0]; + replaceClassName(files, classInfo); + ... + + // 文件内容汇总 + fileContent.iServiceHFile.content = files.iServiceH; + fileContent.proxyHFile.content = files.proxyH; + fileContent.stubHFile.content = files.stubH; + fileContent.serviceHFile.content = files.serviceH; + fileContent.proxyCppFile.content = files.proxyCpp; + fileContent.stubCppFile.content = files.stubCpp; + fileContent.serviceCppFile.content = files.serviceCpp; + fileContent.clientCppFile.content = files.clientCpp; + ... + return fileContent; +} + +~~~ + +### 工具使用方法说明 + +1. 安装python库 CppHeaderParser + + ~~~ + pip install CppHeaderParser + ~~~ + +2. 安装typescript:在napi_generator/src/cli/h2sa/src/src目录下执行命令 + + ~~~ + npm i typescript + ~~~ + +3. 安装stdio:在napi_generator/src/cli/h2sa/src目录下执行命令 + + ~~~ + npm i stdio + ~~~ + +4. 将待转换的文件test.h文件拷贝到napi_generator/src/cli/h2sa/src/src/gen目录下 + +5. 在napi_generator/src/cli/h2sa/src/src/gen目录下执行命令生成service框架代码: + + ~~~ + node main.js -f test.h + ~~~ + + 其中,参数详情如下: -f,定义远程服务的.h文件; -l, 日志级别(0-3),默认为1; -o,生成框架代码输入到指定路径下; -s,指定serviceID。 -v,指定版本(3.2和4.1,默认版本为3.2) + +6. 输出testservice文件夹 + + ~~~ + /xxxservice + ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 + ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 + ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 + │ ├── BUILD.gn + │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 + ├── include + │ ├── test_service.h # 服务端头文件 + │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 + │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 + ├── interface + │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 + ├── sa_profile + │ ├── 9000.json + │ └── BUILD.gn + └── src + ├── i_test_service.cpp + ├── test_client.cpp + ├── test_service.cpp + ├── test_service_proxy.cpp + └── test_service_stub.cpp + ~~~ + + + diff --git a/src/cli/h2sa/Usage.md b/src/cli/h2sa/Usage.md new file mode 100644 index 00000000..6157828b --- /dev/null +++ b/src/cli/h2sa/Usage.md @@ -0,0 +1,54 @@ +### 工具使用方法说明 + +1. 安装python库 CppHeaderParser + + ~~~ + pip install CppHeaderParser + ~~~ + +2. 安装typescript:在napi_generator/src/cli/h2sa/src/src目录下执行命令 + + ~~~ + npm i typescript + ~~~ + +3. 安装stdio:在napi_generator/src/cli/h2sa/src目录下执行命令 + + ~~~ + npm i stdio + ~~~ + +4. 将待转换的文件test.h文件拷贝到napi_generator/src/cli/h2sa/src/src/gen目录下 + +5. 在napi_generator/src/cli/h2sa/src/src/gen目录下执行命令生成service框架代码: + + ~~~ + node main.js -f test.h + ~~~ + + 其中,参数详情如下: -f,定义远程服务的.h文件; -l, 日志级别(0-3),默认为1; -o,生成框架代码输入到指定路径下; -s,指定serviceID。 -v,指定版本(3.2和4.1,默认版本为3.2) + +6. 输出testservice文件夹 + +7. 编译步骤:生成的testservice文件夹放在源码根目录下 + +8. 配置vendor serviceID + +9. 编配置完成后,执行镜像编译命令 ./build.sh --product-name 产品名若编译rk3568开发板,则执行 ./build.sh --product-name rk3568 + +10. 烧录镜像 + +11. 验证 + + > 验证一: shell登录开发板。 查看服务端进程是否已正常启动 + > + > ~~~ + > ps -ef | grep testservice + > ~~~ + > + > 验证二:运行客户端 + > + > ~~~ + > /system/bin/testclient + > ~~~ + From 0c475a914934c08bcc4f6284da09ccaac81d0c30 Mon Sep 17 00:00:00 2001 From: huruitao Date: Tue, 10 Sep 2024 18:07:59 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9guide=E5=92=8Cusage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- src/cli/h2sa/Develop_Guide_sa.md | 137 +------------ src/cli/h2sa/Usage.md | 191 ++++++++++++++++-- .../docs/figures/service_frame_structure.png | Bin 0 -> 94356 bytes .../h2sa/docs/figures/service_runLogic.png | Bin 0 -> 109769 bytes 4 files changed, 175 insertions(+), 153 deletions(-) create mode 100644 src/cli/h2sa/docs/figures/service_frame_structure.png create mode 100644 src/cli/h2sa/docs/figures/service_runLogic.png diff --git a/src/cli/h2sa/Develop_Guide_sa.md b/src/cli/h2sa/Develop_Guide_sa.md index 4a142104..7db9363e 100644 --- a/src/cli/h2sa/Develop_Guide_sa.md +++ b/src/cli/h2sa/Develop_Guide_sa.md @@ -4,7 +4,7 @@ ​ 当开发人员为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。 Service代码生成工具能够帮助用户生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。用户可基于框架代码专注于业务功能的编写。 -![image-20240723101920662](C:\Users\kaihong\AppData\Roaming\Typora\typora-user-images\image-20240723101920662.png) +![image](./docs/figures/service_frame_structure.png) --- @@ -39,137 +39,7 @@ h2sa 运行逻辑 -![image-20240723144207759](C:\Users\kaihong\AppData\Roaming\Typora\typora-user-images\image-20240723144207759.png) - -js文件中的部分重要函数和参数: - -~~~ -//main.js - -let ops = stdio.getopt({ - //命令行参数 - 'filename': { key: 'f', args: 1, description: '.h file', default: '' }, - 'out': { key: 'o', args: 1, description: 'output directory', default: '.' }, - 'loglevel': { key: 'l', args: 1, description: 'Log Level: 0~3', default: '1' }, - 'serviceId': { key: 's', args: 1, description: 'service register id: 9000~16777214', default: '9000' }, - 'versionTag': { key: 'v', args: 1, description: 'version tag: 4.1 / 3.2', default: '3.2' } -}); - -function genServiceFile(fileName) { - // 1. h文件解析保存为结构体 - let rootInfo = analyze.doAnalyze(fileName, ops); - - // 2. 根据结构体生成代码 - let fileContent = gen.doGenerate(rootInfo); - - // 3. 创建service工程目录 - let servicePath = re.pathJoin(ops.out, rootInfo.serviceName.toLowerCase() + 'service'); - let etcPath = re.pathJoin(servicePath, 'etc'); - let includePath = re.pathJoin(servicePath, 'include'); - let interfacePath = re.pathJoin(servicePath, 'interface'); - let profilePath = re.pathJoin(servicePath, 'sa_profile'); - let srcPath = re.pathJoin(servicePath, 'src'); - createFolder(servicePath); - createFolder(etcPath); - createFolder(includePath); - createFolder(interfacePath); - createFolder(profilePath); - createFolder(srcPath); - - // 4. 生成代码保存为文件 - wirte2Disk(fileContent.serviceCfgGnFile, etcPath); - wirte2Disk(fileContent.proxyHFile, includePath); - wirte2Disk(fileContent.stubHFile, includePath); - ... -} - -~~~ - -~~~ -// analyze.js - -function doAnalyze(hFilePath, cmdParam) { - let parseResult = parseFileAll(hFilePath); - parseResult.isInclude = false; - AllParseFileList.push(parseResult); - let rootInfo = { - 'serviceName': '', - 'nameSpace': [], - 'class': [], - 'includes': [], - 'using': [], - 'serviceId': (cmdParam.serviceId === null || cmdParam.serviceId === undefined) ? - '9002' : cmdParam.serviceId, - 'versionTag': (cmdParam.versionTag === null || cmdParam.versionTag === undefined) ? - '3.2' : cmdParam.versionTag, - 'rawContent': parseResult.rawContent - }; - - analyzeNameSpace(rootInfo, parseResult); - analyzeClasses(rootInfo, parseResult.classes); - rootInfo.includes = parseResult.includes; - rootInfo.using = parseResult.using; - return rootInfo; //经过解析后返回的结构体;作为参数,传值调用使用 -} - -~~~ - -~~~ -//generate.js -let fileContent = { - 'iServiceHFile': {}, - 'proxyHFile': {}, - 'stubHFile': {}, - 'serviceHFile': {}, - 'proxyCppFile': {}, - 'stubCppFile': {}, - 'serviceCppFile': {}, - 'clientCppFile': {}, - 'buildGnFile': {}, - 'bundleJsonFile': {}, - 'profileGnFile': {}, - 'profileXmlFile': {}, - 'profileJsonFile': {}, - 'serviceCfgFile': {}, - 'serviceCfgGnFile': {}, - 'iServiceCppFile': {}, -}; - -function doGenerate(rootInfo) { - rootHFileSrc = rootInfo.rawContent; - let lowServiceName = rootInfo.serviceName.toLowerCase(); - let upperServiceName = rootInfo.serviceName.toUpperCase(); - - // 生成文件名 - genFileNames(lowServiceName, rootInfo); - - // 按模板生成.h和.cpp文件内容框架 - let files = genFilesByTemplate(upperServiceName, lowServiceName, rootInfo); - - // 替换文件includes - replaceIncludes(files, rootInfo); - ... - - // 替换namespace - replaceServiceName(files, rootInfo); - - // 替换类名 - let classInfo = rootInfo.class[0]; - replaceClassName(files, classInfo); - ... - - // 文件内容汇总 - fileContent.iServiceHFile.content = files.iServiceH; - fileContent.proxyHFile.content = files.proxyH; - fileContent.stubHFile.content = files.stubH; - fileContent.serviceHFile.content = files.serviceH; - fileContent.proxyCppFile.content = files.proxyCpp; - fileContent.stubCppFile.content = files.stubCpp; - fileContent.serviceCppFile.content = files.serviceCpp; - fileContent.clientCppFile.content = files.clientCpp; - ... - return fileContent; -} +![image](./docs/figures/service_runLogic.png) ~~~ @@ -228,6 +98,3 @@ function doGenerate(rootInfo) { ├── test_service_proxy.cpp └── test_service_stub.cpp ~~~ - - - diff --git a/src/cli/h2sa/Usage.md b/src/cli/h2sa/Usage.md index 6157828b..551be34a 100644 --- a/src/cli/h2sa/Usage.md +++ b/src/cli/h2sa/Usage.md @@ -1,4 +1,18 @@ -### 工具使用方法说明 +### h2sa工具 + +## 简介 + +h2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。实现Service远程调用接口需要开发人员熟悉IPC通信框架,了解proxy/stub的继承与实现方式,掌握C++类型转为MessageParcel数据包的各种API方法,有一定的学习成本。而Service代码生成工具能够帮助使用者生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。 + +## 约束 + +系统:建议Ubuntu 20.04或者Windows 10 + +依赖版本:VS Code 1.62.0 + +## 使用方法 + +#### 命令行 1. 安装python库 CppHeaderParser @@ -20,6 +34,35 @@ 4. 将待转换的文件test.h文件拷贝到napi_generator/src/cli/h2sa/src/src/gen目录下 + ~~~cpp + napi_generator/src/cli/h2sa/examples/test.h + #ifndef TEST_H + #define TEST_H + + namespace OHOS { + namespace Example { + /** + * @brief service服务,提供IPC调用接口 + * @ServiceClass + */ + class test { + public: + int testFunc(int v1, int v2, bool v3); + }; + } // namespace Example + } // namespace OHOS + #endif // TEST_H + ~~~ + + 注意:.h文件中待生成的主class必须加注释:@brief service服务,提供IPC调用接口 ,如下所示: + + ```cpp + /** + * @brief service服务,提供IPC调用接口 + * @ServiceClass + */ + ``` + 5. 在napi_generator/src/cli/h2sa/src/src/gen目录下执行命令生成service框架代码: ~~~ @@ -28,27 +71,139 @@ 其中,参数详情如下: -f,定义远程服务的.h文件; -l, 日志级别(0-3),默认为1; -o,生成框架代码输入到指定路径下; -s,指定serviceID。 -v,指定版本(3.2和4.1,默认版本为3.2) -6. 输出testservice文件夹 +#### 生成物 -7. 编译步骤:生成的testservice文件夹放在源码根目录下 +1. 输出testservice文件夹,其中的文件如下所示: -8. 配置vendor serviceID + ![](./docs/figures/h2sa_outRes.png) -9. 编配置完成后,执行镜像编译命令 ./build.sh --product-name 产品名若编译rk3568开发板,则执行 ./build.sh --product-name rk3568 +#### 生成物的应用和验证 -10. 烧录镜像 +1. 编译步骤:生成的testservice文件夹放在对应版本的源码根目录下 -11. 验证 +2. 修改系统公共文件 - > 验证一: shell登录开发板。 查看服务端进程是否已正常启动 - > - > ~~~ - > ps -ef | grep testservice - > ~~~ - > - > 验证二:运行客户端 - > - > ~~~ - > /system/bin/testclient - > ~~~ + ##### 基础配置 + 1. 服务配置 + + 在foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include/ + + system_ability_definition.h增加以下一行: + + ``` + TEST_SERVICE_ID = 9016, + ``` + + 其中,TEST_SERVICE_ID宏值与用户定义的serviceID一致。 + + 2. 子系统配置 + + 在build/subsystem_config.json中增加以下内容。 + + ``` + "testservice": { + "path":"testservice", + "name": "testservice" + } + ``` + + 3. 产品配置,如rk3568 + + 在vendor/kaihong/rk3568/config.json中增加以下内容: + + ``` + { + "subsystem": "testservice", + "components": [ + { + "component": "testservice_part", + "features": [] + } + ] + } + ``` + + 4. 权限配置 + + 在相应的产品目录的vendor/kaihong/rk3568/security_config/high_privilege_process_list.json中增加以下内容: + + ``` + { + "name": "testservice", + "uid": "system", + "gid": ["root", "system"] + } + ``` + + ##### selinux权限配置 + + 上述基础配置时关闭了selinux 权限配置,用户新增服务时需根据自身需求配置selinux 权限 。 + + 若要配置selinux权限,首先应将vendor/hihope/rk3568/config.json中"build_selinux"属性改为true,然后修改以下文件: + + 1. testservice/etc/sample_service.cfg + + ``` + "secon" : "u:r:testservice:s0" + ``` + + 2. base/security/selinux_adapter/sepolicy/base/public/service_contexts + + ``` + 9016 u:object_r:sa_testservice:s0 + ``` + + 3. base/security/selinux_adapter/sepolicy/base/public/service.te + + ``` + type sa_testservice, sa_service_attr; + ``` + + 4. base/security/selinux_adapter/sepolicy/ohos_policy/startup/init/system/init.te + + ``` + allow init testservice:process { getattr rlimitinh siginh transition }; + ``` + + 5. base/security/selinux/sepolicy/base/public/type.te + + ``` + type testservice, sadomain, domain; + ``` + + 6. /base/security/selinux/sepolicy/base/te目录下增加新service的te文件,新增文件名即为服务名,例如:testservice.te + + ``` + allow testservice init_param:file { map open read }; + allow testservice sa_testservice:samgr_class { add get }; + ``` + +3. 编码完成后,执行镜像编译命令 + + ~~~ + ./build.sh --product-name 产品名 + + 如:若编译Hi3516DV300开发板,则执行 + ./build.sh --product-name Hi3516DV300 + + 若编译rk3568开发板,则执行 + ./build.sh --product-name rk3568 + ~~~ + +4. 烧录镜像 + +5. 运行验证 + + > 验证一: shell登录开发板。 查看服务端进程是否已正常启动 + > + > ~~~ + > ps -ef | grep testservice + > system 288 1 0 00:02:13 ? 00:00:00 testservice_sa --- 服务进程已正常运行 + > ~~~ + > + > 验证二:运行客户端 + > + > ~~~ + > /system/bin/testclient + > ~~~ \ No newline at end of file diff --git a/src/cli/h2sa/docs/figures/service_frame_structure.png b/src/cli/h2sa/docs/figures/service_frame_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..49ee3d9b2c179a768922c068fdf193f1f4ca4d14 GIT binary patch literal 94356 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

JR8wrBp0 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 ay(%hDv`{`o^Hdc9|H(@$OMRCx^!tCJU-WMP literal 0 HcmV?d00001 From 9b3cb6f474fd89506d928f0734f0e09bcf9d8ed8 Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 11 Sep 2024 10:34:32 +0800 Subject: [PATCH 03/15] codecheck Signed-off-by: huruitao --- src/cli/h2sa/Develop_Guide_sa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/h2sa/Develop_Guide_sa.md b/src/cli/h2sa/Develop_Guide_sa.md index 7db9363e..272343ed 100644 --- a/src/cli/h2sa/Develop_Guide_sa.md +++ b/src/cli/h2sa/Develop_Guide_sa.md @@ -28,7 +28,7 @@ h2sa │ ├── fileTemplate.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) │ ├── generate.js //包含核心的代码生成逻辑。调用analyze.js来获取分析结果;使用fileTemplate.js中的模板和分析结果来生成代码。 │ ├── header_parser.py //脚本,与analyze.js协同工作,用于解析C++头文件 - │ └── main.js //项目的入口。初始化日志记录和其他工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 + │ └── main.js //项目的入口。初始化日志记录和其它工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 └── tools ├── common.js //包含整个项目中使用的通用函数和常量 ├── FileRW.js //包含文件读写操作的JavaScript模块 From 07367216e00d204ccc083dd83e9450e7f02a4f69 Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 11 Sep 2024 11:15:19 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E7=9B=91=E8=A7=86?= =?UTF-8?q?=E6=84=8F=E8=A7=81=E4=BF=AE=E6=94=B9md=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- src/cli/h2sa/Develop_Guide_sa.md | 175 +++++++++++++++++++++++-------- src/cli/h2sa/Usage.md | 23 ++++ 2 files changed, 153 insertions(+), 45 deletions(-) diff --git a/src/cli/h2sa/Develop_Guide_sa.md b/src/cli/h2sa/Develop_Guide_sa.md index 272343ed..db486bfd 100644 --- a/src/cli/h2sa/Develop_Guide_sa.md +++ b/src/cli/h2sa/Develop_Guide_sa.md @@ -37,64 +37,149 @@ h2sa └── tool.js //包含一些辅助工具函数 ~~~ -运行逻辑 +### 运行逻辑 ![image](./docs/figures/service_runLogic.png) -~~~ +### 适配其它版本的方法 -### 工具使用方法说明 +#### 场景说明 -1. 安装python库 CppHeaderParser +为了实现工具生成的接口被其它子系统或者应用调用,需将生成的代码经系统框架开发者二次开发后编译集成到OpenHarmony系统中,使其生成动态库,供OpenHarmony应用层调用。此处介绍如何将工具生成的源码集成到OpenHarmony 4.1 relsease,可基于此方法集成OpenHarmony 5.0 relsease。 - ~~~ - pip install CppHeaderParser - ~~~ +#### 修改编译文件 -2. 安装typescript:在napi_generator/src/cli/h2sa/src/src目录下执行命令 +1. 修改testservice/BUILD.gn文件,将utils/native 改为 commonlibrary/c_utils,将samgr_standard改为samgr,− 将hiviewdfx_hilog_native改为hilog,在ohos_shared_library("testservice")中include_dirs内新增"//base/startup/init/interfaces/innerkits/include/syspara",将ohos_shared_library("testservice")中的deps删除,并删除external_deps中的"startup_l2:syspara",同时在external_deps中新增"c_utils:utils", 将ohos_executable("testclient")中的deps删除,同时在external_deps中新增"c_utils:utils"。修改后的BUILD.gn文件内容如下所示: - ~~~ - npm i typescript - ~~~ + ``` + import("//build/ohos.gni") + + ohos_shared_library("testservice") { + sources = [ + "//testservice/src/i_test_service.cpp", + "//testservice/src/test_service_stub.cpp", + "//testservice/src/test_service.cpp" + ] + include_dirs = [ + "//testservice/include", + "//testservice/interface", + "//commonlibrary/c_utils/base/include", + "//base/startup/init/interfaces/innerkits/include/syspara", + ] + + external_deps = [ + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + "c_utils:utils", + ] + + part_name = "testservice_part" + subsystem_name = "testservice" + } + + ohos_executable("testclient") { + sources = [ + "//testservice/src/i_test_service.cpp", + "//testservice/src/test_service_proxy.cpp", + "//testservice/src/test_client.cpp" + ] + + include_dirs = [ + "//testservice/include", + "//testservice/interface", + "//commonlibrary/c_utils/base/include", + ] + + external_deps = [ + "hilog:libhilog", + "ipc:ipc_core", + "samgr:samgr_proxy", + "c_utils:utils", + ] + + part_name = "testservice_part" + subsystem_name = "testservice" + } + ``` -3. 安装stdio:在napi_generator/src/cli/h2sa/src目录下执行命令 +2. 修改testservice/bundle.json文件,将"name": "@ohos/testservice"修改为 "name": "@ohos/testservice_part";将"samgr_standard"改为"samgr","utils_base"修改为"c_utils";将"hiviewdfx_hilog_native"修改为"hilog";− 将"deps":"components"下的"starup_l2"删除。修改后的bundle.json文件内容如下所示: - ~~~ - npm i stdio - ~~~ + ``` + { + "name": "@ohos/testservice_part", + "description": "system ability framework test", + "homePage": "https://gitee.com/", + "version": "4.1", + "license": "Apache License 2.0", + "repository": "", + "publishAs": "code-segment", + "segment": { + "destPath": "testservice" + }, + "dirs": {}, + "scripts": {}, + "component": { + "name": "testservice_part", + "subsystem": "testservice", + "adapted_system_type": [ + "standard" + ], + "rom": "2048KB", + "ram": "~4096KB", + "deps": { + "components": [ + "hilog", + "ipc", + "samgr", + "c_utils", + "safwk" + ], + "third_party": [ "libxml2" ] + }, + "build": { + "sub_component": [ + "//testservice:testservice", + "//testservice/sa_profile:testservice_sa_profile", + "//testservice:testclient", + "//testservice/etc:test_service_init" + ], + "inner_kits": [ + ], + "test": [ + ] + } + } + } + ``` -4. 将待转换的文件test.h文件拷贝到napi_generator/src/cli/h2sa/src/src/gen目录下 +3. 步骤 1 修改testservice/sa_profile下的文件以及testservice/etc/test_service.cfg文件, 将testservice/sa_profile/9016.xml文件重命名为9016.json,并将内容修改为json格式,修改后的9016.json文件如下所示: -5. 在napi_generator/src/cli/h2sa/src/src/gen目录下执行命令生成service框架代码: + ``` + { + "process":"testservice_sa", + "systemability":[ + { + "name":9016, + "libpath":"libtestservice.z.so", + "run-on-create":false, + "auto-restart":true, + "distributed":false, + "dump-level":1 + } + ] + } + ``` - ~~~ - node main.js -f test.h - ~~~ + 修改testservice/sa_profile/BUILD.gn文件:将sources = [ "9016.xml" ]修改为sources = [ "9016.json" ] - 其中,参数详情如下: -f,定义远程服务的.h文件; -l, 日志级别(0-3),默认为1; -o,生成框架代码输入到指定路径下; -s,指定serviceID。 -v,指定版本(3.2和4.1,默认版本为3.2) + 修改testservice/etc/test_service.cfg文件:将"path"内的testservice_sa.xml修改为testservice_sa.json -6. 输出testservice文件夹 +#### roadMap + +| 时间点 | 预期任务 | 验收标准 | 完成情况 | +| :----- | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- | +| 9月份 | 1,代码去重方案提供(不同版本模板,proxy-stub框架,hidumper框架,hitrace);
2,适配5.0release版本,增加代码中hidump、hitrace等日志跟踪定位工具的使用; | 1,设计文档;
2,适配5.0时,可以编译出对应版本的工具,且编译验证成功 | | +| 10月份 | 增加testapp调用 sa接口,包括死亡监听; | testapp | | - ~~~ - /xxxservice - ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 - ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 - ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 - │ ├── BUILD.gn - │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 - ├── include - │ ├── test_service.h # 服务端头文件 - │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 - │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 - ├── interface - │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 - ├── sa_profile - │ ├── 9000.json - │ └── BUILD.gn - └── src - ├── i_test_service.cpp - ├── test_client.cpp - ├── test_service.cpp - ├── test_service_proxy.cpp - └── test_service_stub.cpp - ~~~ diff --git a/src/cli/h2sa/Usage.md b/src/cli/h2sa/Usage.md index 551be34a..7f0b1ddd 100644 --- a/src/cli/h2sa/Usage.md +++ b/src/cli/h2sa/Usage.md @@ -77,6 +77,29 @@ h2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框 ![](./docs/figures/h2sa_outRes.png) + ~~~ + ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 + ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 + ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 + │ ├── BUILD.gn + │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 + ├── include + │ ├── test_service.h # 服务端头文件 + │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 + │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 + ├── interface + │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 + ├── sa_profile + │ ├── 9000.json # 服务配置文件 + │ └── BUILD.gn + └── src + ├── i_test_service.cpp # 接口实现文件 + ├── test_client.cpp # 客户端程序 + ├── test_service.cpp # 服务端程序 + ├── test_service_proxy.cpp # 客户端代理实现 + └── test_service_stub.cpp # 服务端 stub 实现 + ~~~ + #### 生成物的应用和验证 1. 编译步骤:生成的testservice文件夹放在对应版本的源码根目录下 From 36525d1a6a76943f46833183d9a3193bed3ca8cb Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 11 Sep 2024 11:18:25 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- .../{Develop_Guide_sa.md => docs/guide/h2sa_Develop_Guide.md} | 0 src/cli/h2sa/{ => docs/usage}/h2sa_README_ZH.md | 0 src/cli/h2sa/{Usage.md => h2sa_usage.md} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/cli/h2sa/{Develop_Guide_sa.md => docs/guide/h2sa_Develop_Guide.md} (100%) rename src/cli/h2sa/{ => docs/usage}/h2sa_README_ZH.md (100%) rename src/cli/h2sa/{Usage.md => h2sa_usage.md} (100%) diff --git a/src/cli/h2sa/Develop_Guide_sa.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md similarity index 100% rename from src/cli/h2sa/Develop_Guide_sa.md rename to src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md diff --git a/src/cli/h2sa/h2sa_README_ZH.md b/src/cli/h2sa/docs/usage/h2sa_README_ZH.md similarity index 100% rename from src/cli/h2sa/h2sa_README_ZH.md rename to src/cli/h2sa/docs/usage/h2sa_README_ZH.md diff --git a/src/cli/h2sa/Usage.md b/src/cli/h2sa/h2sa_usage.md similarity index 100% rename from src/cli/h2sa/Usage.md rename to src/cli/h2sa/h2sa_usage.md From a1537d1adaa1481366adfb954b1bdeba7953fa9b Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 11 Sep 2024 15:45:45 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md | 153 ++++-------------- src/cli/h2sa/{ => docs/usage}/h2sa_usage.md | 2 +- 2 files changed, 29 insertions(+), 126 deletions(-) rename src/cli/h2sa/{ => docs/usage}/h2sa_usage.md (96%) diff --git a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md index db486bfd..748087f4 100644 --- a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md +++ b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md @@ -4,7 +4,7 @@ ​ 当开发人员为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。 Service代码生成工具能够帮助用户生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。用户可基于框架代码专注于业务功能的编写。 -![image](./docs/figures/service_frame_structure.png) +![image](../figures/service_frame_structure.png) --- @@ -39,142 +39,45 @@ h2sa ### 运行逻辑 -![image](./docs/figures/service_runLogic.png) +![image](../figures/service_runLogic.png) -### 适配其它版本的方法 +main.js为脚本入口,其中使用stdio.getopt获取参数,其中,参数详情如下: -#### 场景说明 +​ -f,定义远程服务的.h文件; -为了实现工具生成的接口被其它子系统或者应用调用,需将生成的代码经系统框架开发者二次开发后编译集成到OpenHarmony系统中,使其生成动态库,供OpenHarmony应用层调用。此处介绍如何将工具生成的源码集成到OpenHarmony 4.1 relsease,可基于此方法集成OpenHarmony 5.0 relsease。 +​ -l, 日志级别(0-3),默认为1; -#### 修改编译文件 +​ -o, 生成框架代码输入到指定路径下; -1. 修改testservice/BUILD.gn文件,将utils/native 改为 commonlibrary/c_utils,将samgr_standard改为samgr,− 将hiviewdfx_hilog_native改为hilog,在ohos_shared_library("testservice")中include_dirs内新增"//base/startup/init/interfaces/innerkits/include/syspara",将ohos_shared_library("testservice")中的deps删除,并删除external_deps中的"startup_l2:syspara",同时在external_deps中新增"c_utils:utils", 将ohos_executable("testclient")中的deps删除,同时在external_deps中新增"c_utils:utils"。修改后的BUILD.gn文件内容如下所示: +​ -s, 指定serviceID。 - - ``` - import("//build/ohos.gni") - - ohos_shared_library("testservice") { - sources = [ - "//testservice/src/i_test_service.cpp", - "//testservice/src/test_service_stub.cpp", - "//testservice/src/test_service.cpp" - ] - include_dirs = [ - "//testservice/include", - "//testservice/interface", - "//commonlibrary/c_utils/base/include", - "//base/startup/init/interfaces/innerkits/include/syspara", - ] - - external_deps = [ - "hilog:libhilog", - "ipc:ipc_core", - "safwk:system_ability_fwk", - "samgr:samgr_proxy", - "c_utils:utils", - ] - - part_name = "testservice_part" - subsystem_name = "testservice" - } - - ohos_executable("testclient") { - sources = [ - "//testservice/src/i_test_service.cpp", - "//testservice/src/test_service_proxy.cpp", - "//testservice/src/test_client.cpp" - ] - - include_dirs = [ - "//testservice/include", - "//testservice/interface", - "//commonlibrary/c_utils/base/include", - ] - - external_deps = [ - "hilog:libhilog", - "ipc:ipc_core", - "samgr:samgr_proxy", - "c_utils:utils", - ] - - part_name = "testservice_part" - subsystem_name = "testservice" - } - ``` +​ -v, 指定版本(3.2和4.1,默认版本为3.2) -2. 修改testservice/bundle.json文件,将"name": "@ohos/testservice"修改为 "name": "@ohos/testservice_part";将"samgr_standard"改为"samgr","utils_base"修改为"c_utils";将"hiviewdfx_hilog_native"修改为"hilog";− 将"deps":"components"下的"starup_l2"删除。修改后的bundle.json文件内容如下所示: +~~~ +let ops = stdio.getopt({ + 'filename': { key: 'f', args: 1, description: '.h file', default: '' }, + 'out': { key: 'o', args: 1, description: 'output directory', default: '.' }, + 'loglevel': { key: 'l', args: 1, description: 'Log Level: 0~3', default: '1' }, + 'serviceId': { key: 's', args: 1, description: 'service register id: 9000~16777214', default: '9000' }, + 'versionTag': { key: 'v', args: 1, description: 'version tag: 4.1 / 3.2', default: '3.2' } +}); +~~~ - ``` - { - "name": "@ohos/testservice_part", - "description": "system ability framework test", - "homePage": "https://gitee.com/", - "version": "4.1", - "license": "Apache License 2.0", - "repository": "", - "publishAs": "code-segment", - "segment": { - "destPath": "testservice" - }, - "dirs": {}, - "scripts": {}, - "component": { - "name": "testservice_part", - "subsystem": "testservice", - "adapted_system_type": [ - "standard" - ], - "rom": "2048KB", - "ram": "~4096KB", - "deps": { - "components": [ - "hilog", - "ipc", - "samgr", - "c_utils", - "safwk" - ], - "third_party": [ "libxml2" ] - }, - "build": { - "sub_component": [ - "//testservice:testservice", - "//testservice/sa_profile:testservice_sa_profile", - "//testservice:testclient", - "//testservice/etc:test_service_init" - ], - "inner_kits": [ - ], - "test": [ - ] - } - } - } - ``` +### 开发指导 -3. 步骤 1 修改testservice/sa_profile下的文件以及testservice/etc/test_service.cfg文件, 将testservice/sa_profile/9016.xml文件重命名为9016.json,并将内容修改为json格式,修改后的9016.json文件如下所示: +#### 适配新版本 - ``` - { - "process":"testservice_sa", - "systemability":[ - { - "name":9016, - "libpath":"libtestservice.z.so", - "run-on-create":false, - "auto-restart":true, - "distributed":false, - "dump-level":1 - } - ] - } - ``` +若当前工具不能满足需要,用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,若用户需要适配其他版本,用户需修改以下文件进行适配: - 修改testservice/sa_profile/BUILD.gn文件:将sources = [ "9016.xml" ]修改为sources = [ "9016.json" ] +**9月份会进行代码去重整改,预估适配方式如下,整改后如有出入,会进行修改** - 修改testservice/etc/test_service.cfg文件:将"path"内的testservice_sa.xml修改为testservice_sa.json +1.在main.js中,在allowedVersion数组中加入适配的版本号,如4.1统一为v4_1, 5.0统一为v5_0。 + +2.在templete目录下,以适配5.0源码为例,IdlInterfaceTemplete目录下新建v5_0文件夹,在v5_0文件夹下新增对应的bundle.json模板,对应的BUILD.gn模板;新增5.0版本的bundle.json,BUILD.gn模板路径。 + +3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 + +若适配新版本需要增加其他配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,最后在generate.js中生成最终配置文件。 #### roadMap diff --git a/src/cli/h2sa/h2sa_usage.md b/src/cli/h2sa/docs/usage/h2sa_usage.md similarity index 96% rename from src/cli/h2sa/h2sa_usage.md rename to src/cli/h2sa/docs/usage/h2sa_usage.md index 7f0b1ddd..7ce1c33b 100644 --- a/src/cli/h2sa/h2sa_usage.md +++ b/src/cli/h2sa/docs/usage/h2sa_usage.md @@ -75,7 +75,7 @@ h2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框 1. 输出testservice文件夹,其中的文件如下所示: - ![](./docs/figures/h2sa_outRes.png) + ![](../figures/h2sa_outRes.png) ~~~ ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 From 8c18c48d3fcee9ee539d4838b7ee4390d81868d8 Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 11 Sep 2024 15:49:25 +0800 Subject: [PATCH 07/15] codecheck Signed-off-by: huruitao --- src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md index 748087f4..d00e2997 100644 --- a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md +++ b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md @@ -67,7 +67,7 @@ let ops = stdio.getopt({ #### 适配新版本 -若当前工具不能满足需要,用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,若用户需要适配其他版本,用户需修改以下文件进行适配: +若当前工具不能满足需要,用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,若用户需要适配其它版本,用户需修改以下文件进行适配: **9月份会进行代码去重整改,预估适配方式如下,整改后如有出入,会进行修改** @@ -77,7 +77,7 @@ let ops = stdio.getopt({ 3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 -若适配新版本需要增加其他配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,最后在generate.js中生成最终配置文件。 +若适配新版本需要增加其它配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,最后在generate.js中生成最终配置文件。 #### roadMap From 04a855fca8e300ca78bd33fc3b4a51e4c0cb1fd5 Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 11 Sep 2024 17:35:30 +0800 Subject: [PATCH 08/15] codecheck Signed-off-by: huruitao --- src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md index d00e2997..b3d77820 100644 --- a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md +++ b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md @@ -77,7 +77,7 @@ let ops = stdio.getopt({ 3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 -若适配新版本需要增加其它配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,最后在generate.js中生成最终配置文件。 +若适配新版本需要增加其它配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 #### roadMap From 9fcd8beaf12c27fa826138c2f7dd032192e286d2 Mon Sep 17 00:00:00 2001 From: huruitao Date: Fri, 13 Sep 2024 17:59:36 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- src/cli/h2sa/docs/figures/service_file.png | Bin 0 -> 35145 bytes src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md | 35 ++- src/cli/h2sa/docs/usage/h2sa_usage.md | 232 ------------------ src/cli/h2sa/docs/usage/usage.md | 193 +++++++++++++++ src/cli/h2sa/examples/sample.h | 117 --------- src/cli/h2sa/{src => }/package.json | 0 src/cli/h2sa/src/{src => }/gen/analyze.js | 0 .../h2sa/src/{src => }/gen/fileTemplate.js | 0 src/cli/h2sa/src/{src => }/gen/generate.js | 0 .../h2sa/src/{src => }/gen/header_parser.py | 0 src/cli/h2sa/src/{src => }/gen/main.js | 0 src/cli/h2sa/{examples => src/gen}/test.h | 0 src/cli/h2sa/src/{src => }/tools/FileRW.js | 0 src/cli/h2sa/src/{src => }/tools/NapiLog.js | 0 src/cli/h2sa/src/{src => }/tools/common.js | 0 src/cli/h2sa/src/{src => }/tools/re.js | 0 src/cli/h2sa/src/{src => }/tools/tool.js | 0 17 files changed, 210 insertions(+), 367 deletions(-) create mode 100644 src/cli/h2sa/docs/figures/service_file.png delete mode 100644 src/cli/h2sa/docs/usage/h2sa_usage.md create mode 100644 src/cli/h2sa/docs/usage/usage.md delete mode 100644 src/cli/h2sa/examples/sample.h rename src/cli/h2sa/{src => }/package.json (100%) rename src/cli/h2sa/src/{src => }/gen/analyze.js (100%) rename src/cli/h2sa/src/{src => }/gen/fileTemplate.js (100%) rename src/cli/h2sa/src/{src => }/gen/generate.js (100%) rename src/cli/h2sa/src/{src => }/gen/header_parser.py (100%) rename src/cli/h2sa/src/{src => }/gen/main.js (100%) rename src/cli/h2sa/{examples => src/gen}/test.h (100%) rename src/cli/h2sa/src/{src => }/tools/FileRW.js (100%) rename src/cli/h2sa/src/{src => }/tools/NapiLog.js (100%) rename src/cli/h2sa/src/{src => }/tools/common.js (100%) rename src/cli/h2sa/src/{src => }/tools/re.js (100%) rename src/cli/h2sa/src/{src => }/tools/tool.js (100%) diff --git a/src/cli/h2sa/docs/figures/service_file.png b/src/cli/h2sa/docs/figures/service_file.png new file mode 100644 index 0000000000000000000000000000000000000000..18b6456d2073ea375fd4cff92707c384ce89e632 GIT binary patch literal 35145 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 literal 0 HcmV?d00001 diff --git a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md index b3d77820..439ab2b6 100644 --- a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md +++ b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md @@ -1,14 +1,14 @@ -## Develop guide +## Develop Guide -### Service代码生成工具使用场景 +### service代码生成工具使用场景 -​ 当开发人员为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。 Service代码生成工具能够帮助用户生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。用户可基于框架代码专注于业务功能的编写。 +​ 当开发人员为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。 Service代码生成工具能够帮助用户生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。用户可基于框架代码专注于业务功能的编写。 -![image](../figures/service_frame_structure.png) +![image](../figures/service_file.png) --- -### Service工具代码框架说明 +### service工具代码框架说明 ~~~ napi_generator\src\cli\h2sa @@ -43,15 +43,15 @@ h2sa main.js为脚本入口,其中使用stdio.getopt获取参数,其中,参数详情如下: -​ -f,定义远程服务的.h文件; + -f,定义远程服务的.h文件; -​ -l, 日志级别(0-3),默认为1; + -l, 日志级别(0-3),默认为1; -​ -o, 生成框架代码输入到指定路径下; + -o, 生成框架代码输入到指定路径下; -​ -s, 指定serviceID。 - + -s, 指定serviceID。 - -​ -v, 指定版本(3.2和4.1,默认版本为3.2) + -v, 指定版本(3.2和4.1,默认版本为3.2) ~~~ let ops = stdio.getopt({ @@ -67,7 +67,7 @@ let ops = stdio.getopt({ #### 适配新版本 -若当前工具不能满足需要,用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,若用户需要适配其它版本,用户需修改以下文件进行适配: +用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,需要适配其它版本时,可修改以下文件进行适配: **9月份会进行代码去重整改,预估适配方式如下,整改后如有出入,会进行修改** @@ -77,12 +77,11 @@ let ops = stdio.getopt({ 3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 -若适配新版本需要增加其它配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 +4.适配新版本需要增加其它配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 -#### roadMap - -| 时间点 | 预期任务 | 验收标准 | 完成情况 | -| :----- | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- | -| 9月份 | 1,代码去重方案提供(不同版本模板,proxy-stub框架,hidumper框架,hitrace);
2,适配5.0release版本,增加代码中hidump、hitrace等日志跟踪定位工具的使用; | 1,设计文档;
2,适配5.0时,可以编译出对应版本的工具,且编译验证成功 | | -| 10月份 | 增加testapp调用 sa接口,包括死亡监听; | testapp | | +#### RoadMap +| 时间点 | 预期任务 | 验收标准 | 完成情况 | +| :----- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------- | +| 9月份 | 1,代码去重方案提供(不同版本模板,proxy-stub框架,hidumper框架,hitrace);
2,适配5.0release版本,增加代码中hidump、hitrace等日志跟踪定位工具的使用; | 1,设计文档;
2,适配5.0时,可以编译出对应版本的工具,且编译验证成功 | 预计2024.9.24 | +| 10月份 | 增加testapp调用 sa接口,包括死亡监听; | 杀掉服务后,有信息 | | \ No newline at end of file diff --git a/src/cli/h2sa/docs/usage/h2sa_usage.md b/src/cli/h2sa/docs/usage/h2sa_usage.md deleted file mode 100644 index 7ce1c33b..00000000 --- a/src/cli/h2sa/docs/usage/h2sa_usage.md +++ /dev/null @@ -1,232 +0,0 @@ -### h2sa工具 - -## 简介 - -h2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。实现Service远程调用接口需要开发人员熟悉IPC通信框架,了解proxy/stub的继承与实现方式,掌握C++类型转为MessageParcel数据包的各种API方法,有一定的学习成本。而Service代码生成工具能够帮助使用者生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。 - -## 约束 - -系统:建议Ubuntu 20.04或者Windows 10 - -依赖版本:VS Code 1.62.0 - -## 使用方法 - -#### 命令行 - -1. 安装python库 CppHeaderParser - - ~~~ - pip install CppHeaderParser - ~~~ - -2. 安装typescript:在napi_generator/src/cli/h2sa/src/src目录下执行命令 - - ~~~ - npm i typescript - ~~~ - -3. 安装stdio:在napi_generator/src/cli/h2sa/src目录下执行命令 - - ~~~ - npm i stdio - ~~~ - -4. 将待转换的文件test.h文件拷贝到napi_generator/src/cli/h2sa/src/src/gen目录下 - - ~~~cpp - napi_generator/src/cli/h2sa/examples/test.h - #ifndef TEST_H - #define TEST_H - - namespace OHOS { - namespace Example { - /** - * @brief service服务,提供IPC调用接口 - * @ServiceClass - */ - class test { - public: - int testFunc(int v1, int v2, bool v3); - }; - } // namespace Example - } // namespace OHOS - #endif // TEST_H - ~~~ - - 注意:.h文件中待生成的主class必须加注释:@brief service服务,提供IPC调用接口 ,如下所示: - - ```cpp - /** - * @brief service服务,提供IPC调用接口 - * @ServiceClass - */ - ``` - -5. 在napi_generator/src/cli/h2sa/src/src/gen目录下执行命令生成service框架代码: - - ~~~ - node main.js -f test.h - ~~~ - - 其中,参数详情如下: -f,定义远程服务的.h文件; -l, 日志级别(0-3),默认为1; -o,生成框架代码输入到指定路径下; -s,指定serviceID。 -v,指定版本(3.2和4.1,默认版本为3.2) - -#### 生成物 - -1. 输出testservice文件夹,其中的文件如下所示: - - ![](../figures/h2sa_outRes.png) - - ~~~ - ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 - ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 - ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 - │ ├── BUILD.gn - │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 - ├── include - │ ├── test_service.h # 服务端头文件 - │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 - │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 - ├── interface - │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 - ├── sa_profile - │ ├── 9000.json # 服务配置文件 - │ └── BUILD.gn - └── src - ├── i_test_service.cpp # 接口实现文件 - ├── test_client.cpp # 客户端程序 - ├── test_service.cpp # 服务端程序 - ├── test_service_proxy.cpp # 客户端代理实现 - └── test_service_stub.cpp # 服务端 stub 实现 - ~~~ - -#### 生成物的应用和验证 - -1. 编译步骤:生成的testservice文件夹放在对应版本的源码根目录下 - -2. 修改系统公共文件 - - ##### 基础配置 - - 1. 服务配置 - - 在foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include/ - - system_ability_definition.h增加以下一行: - - ``` - TEST_SERVICE_ID = 9016, - ``` - - 其中,TEST_SERVICE_ID宏值与用户定义的serviceID一致。 - - 2. 子系统配置 - - 在build/subsystem_config.json中增加以下内容。 - - ``` - "testservice": { - "path":"testservice", - "name": "testservice" - } - ``` - - 3. 产品配置,如rk3568 - - 在vendor/kaihong/rk3568/config.json中增加以下内容: - - ``` - { - "subsystem": "testservice", - "components": [ - { - "component": "testservice_part", - "features": [] - } - ] - } - ``` - - 4. 权限配置 - - 在相应的产品目录的vendor/kaihong/rk3568/security_config/high_privilege_process_list.json中增加以下内容: - - ``` - { - "name": "testservice", - "uid": "system", - "gid": ["root", "system"] - } - ``` - - ##### selinux权限配置 - - 上述基础配置时关闭了selinux 权限配置,用户新增服务时需根据自身需求配置selinux 权限 。 - - 若要配置selinux权限,首先应将vendor/hihope/rk3568/config.json中"build_selinux"属性改为true,然后修改以下文件: - - 1. testservice/etc/sample_service.cfg - - ``` - "secon" : "u:r:testservice:s0" - ``` - - 2. base/security/selinux_adapter/sepolicy/base/public/service_contexts - - ``` - 9016 u:object_r:sa_testservice:s0 - ``` - - 3. base/security/selinux_adapter/sepolicy/base/public/service.te - - ``` - type sa_testservice, sa_service_attr; - ``` - - 4. base/security/selinux_adapter/sepolicy/ohos_policy/startup/init/system/init.te - - ``` - allow init testservice:process { getattr rlimitinh siginh transition }; - ``` - - 5. base/security/selinux/sepolicy/base/public/type.te - - ``` - type testservice, sadomain, domain; - ``` - - 6. /base/security/selinux/sepolicy/base/te目录下增加新service的te文件,新增文件名即为服务名,例如:testservice.te - - ``` - allow testservice init_param:file { map open read }; - allow testservice sa_testservice:samgr_class { add get }; - ``` - -3. 编码完成后,执行镜像编译命令 - - ~~~ - ./build.sh --product-name 产品名 - - 如:若编译Hi3516DV300开发板,则执行 - ./build.sh --product-name Hi3516DV300 - - 若编译rk3568开发板,则执行 - ./build.sh --product-name rk3568 - ~~~ - -4. 烧录镜像 - -5. 运行验证 - - > 验证一: shell登录开发板。 查看服务端进程是否已正常启动 - > - > ~~~ - > ps -ef | grep testservice - > system 288 1 0 00:02:13 ? 00:00:00 testservice_sa --- 服务进程已正常运行 - > ~~~ - > - > 验证二:运行客户端 - > - > ~~~ - > /system/bin/testclient - > ~~~ \ No newline at end of file diff --git a/src/cli/h2sa/docs/usage/usage.md b/src/cli/h2sa/docs/usage/usage.md new file mode 100644 index 00000000..6ae84d6f --- /dev/null +++ b/src/cli/h2sa/docs/usage/usage.md @@ -0,0 +1,193 @@ +### Usage Guide + +## 简介 + +h2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。实现Service远程调用接口需要开发人员熟悉IPC通信框架,了解proxy/stub的继承与实现方式,掌握C++类型转为MessageParcel数据包的各种API方法,有一定的学习成本。而Service代码生成工具能够帮助使用者生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。 + +## 约束 + +系统:建议Ubuntu 20.04或者Windows 10 + +依赖版本:VS Code 1.62.0 + +## 使用方法 + +#### 命令行 + +1. 安装python库 CppHeaderParser + + ~~~ + pip install CppHeaderParser + ~~~ + +2. 安装typescript:在napi_generator/src/cli/h2sa/src目录下执行命令 + + ~~~ + npm i typescript + ~~~ + +3. 安装stdio:在napi_generator/src/cli/h2sa目录下执行命令 + + ~~~ + npm i stdio + ~~~ + +4. 在napi_generator/src/cli/h2sa/src/gen目录下执行命令生成service框架代码: + + ~~~ + node main.js -f test.h + ~~~ + + 其中,参数详情如下: + -f,定义远程服务的.h文件; + -l,可选参数,日志级别(0-3),默认为1; + -o,可选参数,生成框架代码输入到指定路径下; + -s,可选参数,指定serviceID。 + -v,可选参数,指定版本(3.2和4.1,默认版本为3.2) + +#### 生成物 + +1. 输出testservice文件夹,其中的文件如下所示: + + ![](../figures/h2sa_outRes.png) + + ~~~ + ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 + ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 + ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 + │ ├── BUILD.gn + │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 + ├── include + │ ├── test_service.h # 服务端头文件 + │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 + │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 + ├── interface + │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 + ├── sa_profile + │ ├── 9000.json # 服务配置文件 + │ └── BUILD.gn + └── src + ├── i_test_service.cpp # 接口实现文件 + ├── test_client.cpp # 客户端程序 + ├── test_service.cpp # 服务端程序 + ├── test_service_proxy.cpp # 客户端代理实现 + └── test_service_stub.cpp # 服务端 stub 实现 + ~~~ + +#### 应用和验证 + +1. 将生成的testservice文件夹放在对应版本的源码根目录下 + +2. 修改服务配置文件 + + 在foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include/system_ability_definition.h增加以下一行: + + ``` + TEST_SERVICE_ID = {serviceID}, //保证ID没有重复即可,例如:9016 + ``` + +3. 修改子系统配置文件 + + 在build/subsystem_config.json中增加以下内容。 + + ``` + "testservice": { + "path":"testservice", + "name": "testservice" + } + ``` + +4. 修改产品配置,如rk3568 + + 在vendor/kaihong/rk3568/config.json中增加以下内容: + + ``` + { + "subsystem": "testservice", + "components": [ + { + "component": "testservice_part", + "features": [] + } + ] + } + ``` + +5. 修改权限配置 + + 在相应的产品目录的vendor/kaihong/rk3568/security_config/high_privilege_process_list.json中增加以下内容: + + ``` + { + "name": "testservice", + "uid": "system", + "gid": ["root", "system"] + } + ``` + +6. selinux权限配置 + + vendor/hihope/rk3568/config.json中"build_selinux"属性若为true, 即要配置selinux权限,应修改以下文件;若为false,无需修改 + + > 1. testservice/etc/sample_service.cfg + > + > ``` + > "secon" : "u:r:testservice:s0" + > ``` + > + > 2. base/security/selinux_adapter/sepolicy/base/public/service_contexts + > + > ``` + > 9016 u:object_r:sa_testservice:s0 + > ``` + > + > 3. base/security/selinux_adapter/sepolicy/base/public/service.te + > + > ``` + > type sa_testservice, sa_service_attr; + > ``` + > + > 4. base/security/selinux_adapter/sepolicy/ohos_policy/startup/init/system/init.te + > + > ``` + > allow init testservice:process { getattr rlimitinh siginh transition }; + > ``` + > + > 5. base/security/selinux/sepolicy/base/public/type.te + > + > ``` + > type testservice, sadomain, domain; + > ``` + > + > 6. /base/security/selinux/sepolicy/base/te目录下增加新service的te文件,新增文件名即为服务名,例如:testservice.te + > + > ``` + > allow testservice init_param:file { map open read }; + > allow testservice sa_testservice:samgr_class { add get }; + > ``` + +7. 编码完成后,执行镜像编译命令 + + ~~~ + ./build.sh --product-name 产品名 + + 若编译rk3568开发板,则执行 + ./build.sh --product-name rk3568 + ~~~ + +8. 烧录镜像 + +9. 运行验证 + + >验证一: shell登录开发板。 查看服务端进程是否已正常启动 + > + >~~~ + >ps -ef | grep testservice + >system 288 1 0 00:02:13 ? 00:00:00 testservice_sa --- 服务进程已正常运行 + >~~~ + > + >验证二:运行客户端 + > + >~~~ + >/system/bin/testclient + >~~~ \ No newline at end of file diff --git a/src/cli/h2sa/examples/sample.h b/src/cli/h2sa/examples/sample.h deleted file mode 100644 index 26125694..00000000 --- a/src/cli/h2sa/examples/sample.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -#ifndef EXAM_H -#define EXAM_H - -#include -#include -#include -#include - -using std::string; - -namespace OHOS { -namespace Example { -class Basic { -public: - std::string basicName; - - int getBasicId() - { - return this->basicId; - } - void setBasicId (int id) - { - this->basicId = id; - } - -private: - int basicId; -}; - -class Human : public Basic { -public: - bool getOpFlag() - { - return this->opFlag; - }; - void setOpFlag (bool flag) - { - this->opFlag = flag; - }; - std::string getOpDesc() - { - return this->opDesc; - }; - void setOpDesc(std::string desc) - { - this->opDesc = desc; - }; - int getOpSeqId() - { - return this->opSeqId; - }; - void setOpSeqId(int id) - { - opSeqId = id; - }; - - std::string opName; - int age = 0; -private: - bool opFlag; - std::string opDesc; - int opSeqId; -} - -struct Book { - int getCc() - { - return this->cc; - }; - void setCc(int cc) - { - this->cc = cc; - }; - Basic getBasicObj() - { - return this->basicObj; - }; - void setBasicObj(Basic obj) - { - this->basicObj = obj; - }; -public: - int aa; - bool bb; - Basic direcObj; -private: - int cc; - Basic basicObj; -} - -/** - * @brief service服务,提供IPC调用接口 - * @ServiceClass - */ -class Exam2 { -public: - Book getBook(Basic& basic); - int fun1 (Book v1); - int fun2 (Basic& basic, Human& human); -}; -} // namespace Example -} // namespace OHOS -#endif // EXAM_H diff --git a/src/cli/h2sa/src/package.json b/src/cli/h2sa/package.json similarity index 100% rename from src/cli/h2sa/src/package.json rename to src/cli/h2sa/package.json diff --git a/src/cli/h2sa/src/src/gen/analyze.js b/src/cli/h2sa/src/gen/analyze.js similarity index 100% rename from src/cli/h2sa/src/src/gen/analyze.js rename to src/cli/h2sa/src/gen/analyze.js diff --git a/src/cli/h2sa/src/src/gen/fileTemplate.js b/src/cli/h2sa/src/gen/fileTemplate.js similarity index 100% rename from src/cli/h2sa/src/src/gen/fileTemplate.js rename to src/cli/h2sa/src/gen/fileTemplate.js diff --git a/src/cli/h2sa/src/src/gen/generate.js b/src/cli/h2sa/src/gen/generate.js similarity index 100% rename from src/cli/h2sa/src/src/gen/generate.js rename to src/cli/h2sa/src/gen/generate.js diff --git a/src/cli/h2sa/src/src/gen/header_parser.py b/src/cli/h2sa/src/gen/header_parser.py similarity index 100% rename from src/cli/h2sa/src/src/gen/header_parser.py rename to src/cli/h2sa/src/gen/header_parser.py diff --git a/src/cli/h2sa/src/src/gen/main.js b/src/cli/h2sa/src/gen/main.js similarity index 100% rename from src/cli/h2sa/src/src/gen/main.js rename to src/cli/h2sa/src/gen/main.js diff --git a/src/cli/h2sa/examples/test.h b/src/cli/h2sa/src/gen/test.h similarity index 100% rename from src/cli/h2sa/examples/test.h rename to src/cli/h2sa/src/gen/test.h diff --git a/src/cli/h2sa/src/src/tools/FileRW.js b/src/cli/h2sa/src/tools/FileRW.js similarity index 100% rename from src/cli/h2sa/src/src/tools/FileRW.js rename to src/cli/h2sa/src/tools/FileRW.js diff --git a/src/cli/h2sa/src/src/tools/NapiLog.js b/src/cli/h2sa/src/tools/NapiLog.js similarity index 100% rename from src/cli/h2sa/src/src/tools/NapiLog.js rename to src/cli/h2sa/src/tools/NapiLog.js diff --git a/src/cli/h2sa/src/src/tools/common.js b/src/cli/h2sa/src/tools/common.js similarity index 100% rename from src/cli/h2sa/src/src/tools/common.js rename to src/cli/h2sa/src/tools/common.js diff --git a/src/cli/h2sa/src/src/tools/re.js b/src/cli/h2sa/src/tools/re.js similarity index 100% rename from src/cli/h2sa/src/src/tools/re.js rename to src/cli/h2sa/src/tools/re.js diff --git a/src/cli/h2sa/src/src/tools/tool.js b/src/cli/h2sa/src/tools/tool.js similarity index 100% rename from src/cli/h2sa/src/src/tools/tool.js rename to src/cli/h2sa/src/tools/tool.js From fa991997848d35fcbf1bb9d884fa27d30c45382a Mon Sep 17 00:00:00 2001 From: huruitao Date: Sat, 14 Sep 2024 16:59:36 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=20=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- src/cli/h2sa/docs/figures/service_file.png | Bin 35145 -> 35132 bytes src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md | 2 +- src/cli/h2sa/docs/usage/usage.md | 222 +++++------------- src/cli/h2sa/src/gen/analyze.js | 2 +- .../gen/{fileTemplate.js => file_template.js} | 0 src/cli/h2sa/src/gen/generate.js | 4 +- src/cli/h2sa/src/gen/main.js | 6 +- .../h2sa/src/tools/{FileRW.js => file_rw.js} | 0 .../src/tools/{NapiLog.js => napi_log.js} | 0 9 files changed, 63 insertions(+), 173 deletions(-) rename src/cli/h2sa/src/gen/{fileTemplate.js => file_template.js} (100%) rename src/cli/h2sa/src/tools/{FileRW.js => file_rw.js} (100%) rename src/cli/h2sa/src/tools/{NapiLog.js => napi_log.js} (100%) diff --git a/src/cli/h2sa/docs/figures/service_file.png b/src/cli/h2sa/docs/figures/service_file.png index 18b6456d2073ea375fd4cff92707c384ce89e632..282359d05b056b2d2a4570107edad9f870c2f4ee 100644 GIT binary patch literal 35132 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 literal 35145 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 diff --git a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md index 439ab2b6..3dc7c93b 100644 --- a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md +++ b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md @@ -25,7 +25,7 @@ h2sa └── src ├── gen │ ├── analyze.js //包含用于分析C++头文件的逻辑。读取头文件内容;解析文件以提取类、方法、参数等信息。 - │ ├── fileTemplate.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) + │ ├── file_template.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) │ ├── generate.js //包含核心的代码生成逻辑。调用analyze.js来获取分析结果;使用fileTemplate.js中的模板和分析结果来生成代码。 │ ├── header_parser.py //脚本,与analyze.js协同工作,用于解析C++头文件 │ └── main.js //项目的入口。初始化日志记录和其它工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 diff --git a/src/cli/h2sa/docs/usage/usage.md b/src/cli/h2sa/docs/usage/usage.md index 6ae84d6f..4467d12e 100644 --- a/src/cli/h2sa/docs/usage/usage.md +++ b/src/cli/h2sa/docs/usage/usage.md @@ -1,193 +1,83 @@ -### Usage Guide +## Develop Guide -## 简介 +### service代码生成工具使用场景 -h2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。实现Service远程调用接口需要开发人员熟悉IPC通信框架,了解proxy/stub的继承与实现方式,掌握C++类型转为MessageParcel数据包的各种API方法,有一定的学习成本。而Service代码生成工具能够帮助使用者生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。 +​ 当开发人员为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。 Service代码生成工具能够帮助用户生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。用户可基于框架代码专注于业务功能的编写。 -## 约束 +![image](../figures/service_file.png) -系统:建议Ubuntu 20.04或者Windows 10 +--- -依赖版本:VS Code 1.62.0 +### service工具代码框架说明 -## 使用方法 +~~~ +napi_generator\src\cli\h2sa -#### 命令行 +h2sa +├── docs //文档 +├── README_ZH.md //usage,使用说明 +├── package.json //Node.js打包配置文件 +└── src + ├── gen + │ ├── analyze.js //包含用于分析C++头文件的逻辑。读取头文件内容;解析文件以提取类、方法、参数等信息。 + │ ├── file_template.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) + │ ├── generate.js //包含核心的代码生成逻辑。调用analyze.js来获取分析结果;使用fileTemplate.js中的模板和分析结果来生成代码。 + │ ├── header_parser.py //脚本,与analyze.js协同工作,用于解析C++头文件 + │ └── test.h //生成sa的提示文件 + │ └── main.js //项目的入口。初始化日志记录和其它工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 + └── tools + ├── common.js //包含整个项目中使用的通用函数和常量 + ├── file_rw.js //包含文件读写操作的JavaScript模块 + ├── napi_log.js //日志记录模块 + ├── re.js //包含正则表达式相关功能的模块 + └── tool.js //包含一些辅助工具函数 +~~~ -1. 安装python库 CppHeaderParser +### 运行逻辑 - ~~~ - pip install CppHeaderParser - ~~~ +![image](../figures/service_runLogic.png) -2. 安装typescript:在napi_generator/src/cli/h2sa/src目录下执行命令 +main.js为脚本入口,其中使用stdio.getopt获取参数,其中,参数详情如下: - ~~~ - npm i typescript - ~~~ - -3. 安装stdio:在napi_generator/src/cli/h2sa目录下执行命令 - - ~~~ - npm i stdio - ~~~ - -4. 在napi_generator/src/cli/h2sa/src/gen目录下执行命令生成service框架代码: - - ~~~ - node main.js -f test.h - ~~~ - - 其中,参数详情如下: -f,定义远程服务的.h文件; - -l,可选参数,日志级别(0-3),默认为1; - -o,可选参数,生成框架代码输入到指定路径下; - -s,可选参数,指定serviceID。 - -v,可选参数,指定版本(3.2和4.1,默认版本为3.2) -#### 生成物 + -l, 日志级别(0-3),默认为1; -1. 输出testservice文件夹,其中的文件如下所示: + -o, 生成框架代码输入到指定路径下; - ![](../figures/h2sa_outRes.png) + -s, 指定serviceID。 - - ~~~ - ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 - ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 - ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 - │ ├── BUILD.gn - │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 - ├── include - │ ├── test_service.h # 服务端头文件 - │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 - │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 - ├── interface - │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 - ├── sa_profile - │ ├── 9000.json # 服务配置文件 - │ └── BUILD.gn - └── src - ├── i_test_service.cpp # 接口实现文件 - ├── test_client.cpp # 客户端程序 - ├── test_service.cpp # 服务端程序 - ├── test_service_proxy.cpp # 客户端代理实现 - └── test_service_stub.cpp # 服务端 stub 实现 - ~~~ + -v, 指定版本(3.2和4.1,默认版本为3.2) -#### 应用和验证 +~~~ +let ops = stdio.getopt({ + 'filename': { key: 'f', args: 1, description: '.h file', default: '' }, + 'out': { key: 'o', args: 1, description: 'output directory', default: '.' }, + 'loglevel': { key: 'l', args: 1, description: 'Log Level: 0~3', default: '1' }, + 'serviceId': { key: 's', args: 1, description: 'service register id: 9000~16777214', default: '9000' }, + 'versionTag': { key: 'v', args: 1, description: 'version tag: 4.1 / 3.2', default: '3.2' } +}); +~~~ -1. 将生成的testservice文件夹放在对应版本的源码根目录下 +### 开发指导 -2. 修改服务配置文件 +#### 适配新版本 - 在foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include/system_ability_definition.h增加以下一行: +用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,需要适配其它版本时,可修改以下文件进行适配: - ``` - TEST_SERVICE_ID = {serviceID}, //保证ID没有重复即可,例如:9016 - ``` +**9月份会进行代码去重整改,预估适配方式如下,整改后如有出入,会进行修改** -3. 修改子系统配置文件 +1.在main.js中,在allowedVersion数组中加入适配的版本号,如4.1统一为v4_1, 5.0统一为v5_0。 - 在build/subsystem_config.json中增加以下内容。 +2.在file_template.js中,以适配5.0源码为例,新增v5_0版本对应的bundle.json模板,对应的BUILD.gn模板;新增5.0版本的bundle.json,BUILD.gn模板路径。 - ``` - "testservice": { - "path":"testservice", - "name": "testservice" - } - ``` +3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 -4. 修改产品配置,如rk3568 +4.适配新版本需要增加其它配置,可在file_template.js中增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 - 在vendor/kaihong/rk3568/config.json中增加以下内容: +#### RoadMap - ``` - { - "subsystem": "testservice", - "components": [ - { - "component": "testservice_part", - "features": [] - } - ] - } - ``` - -5. 修改权限配置 - - 在相应的产品目录的vendor/kaihong/rk3568/security_config/high_privilege_process_list.json中增加以下内容: - - ``` - { - "name": "testservice", - "uid": "system", - "gid": ["root", "system"] - } - ``` - -6. selinux权限配置 - - vendor/hihope/rk3568/config.json中"build_selinux"属性若为true, 即要配置selinux权限,应修改以下文件;若为false,无需修改 - - > 1. testservice/etc/sample_service.cfg - > - > ``` - > "secon" : "u:r:testservice:s0" - > ``` - > - > 2. base/security/selinux_adapter/sepolicy/base/public/service_contexts - > - > ``` - > 9016 u:object_r:sa_testservice:s0 - > ``` - > - > 3. base/security/selinux_adapter/sepolicy/base/public/service.te - > - > ``` - > type sa_testservice, sa_service_attr; - > ``` - > - > 4. base/security/selinux_adapter/sepolicy/ohos_policy/startup/init/system/init.te - > - > ``` - > allow init testservice:process { getattr rlimitinh siginh transition }; - > ``` - > - > 5. base/security/selinux/sepolicy/base/public/type.te - > - > ``` - > type testservice, sadomain, domain; - > ``` - > - > 6. /base/security/selinux/sepolicy/base/te目录下增加新service的te文件,新增文件名即为服务名,例如:testservice.te - > - > ``` - > allow testservice init_param:file { map open read }; - > allow testservice sa_testservice:samgr_class { add get }; - > ``` - -7. 编码完成后,执行镜像编译命令 - - ~~~ - ./build.sh --product-name 产品名 - - 若编译rk3568开发板,则执行 - ./build.sh --product-name rk3568 - ~~~ - -8. 烧录镜像 - -9. 运行验证 - - >验证一: shell登录开发板。 查看服务端进程是否已正常启动 - > - >~~~ - >ps -ef | grep testservice - >system 288 1 0 00:02:13 ? 00:00:00 testservice_sa --- 服务进程已正常运行 - >~~~ - > - >验证二:运行客户端 - > - >~~~ - >/system/bin/testclient - >~~~ \ No newline at end of file +| 时间点 | 预期任务 | 验收标准 | 完成情况 | +| :----- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------- | +| 9月份 | 1,代码去重方案提供(不同版本模板,proxy-stub框架,hidumper框架,hitrace);
2,适配5.0release版本,增加代码中hidump、hitrace等日志跟踪定位工具的使用; | 1,设计文档;
2,适配5.0时,可以编译出对应版本的工具,且编译验证成功 | 预计2024.9.24 | +| 10月份 | 增加testapp调用 sa接口,包括死亡监听; | 杀掉服务后,有信息 | | \ No newline at end of file diff --git a/src/cli/h2sa/src/gen/analyze.js b/src/cli/h2sa/src/gen/analyze.js index 514ab2bf..d8c41557 100644 --- a/src/cli/h2sa/src/gen/analyze.js +++ b/src/cli/h2sa/src/gen/analyze.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const { NapiLog } = require('../tools/NapiLog'); +const { NapiLog } = require('../tools/napi_log'); const fs = require('fs'); const os = require('os'); const { AllParseFileList } = require('../tools/common'); diff --git a/src/cli/h2sa/src/gen/fileTemplate.js b/src/cli/h2sa/src/gen/file_template.js similarity index 100% rename from src/cli/h2sa/src/gen/fileTemplate.js rename to src/cli/h2sa/src/gen/file_template.js diff --git a/src/cli/h2sa/src/gen/generate.js b/src/cli/h2sa/src/gen/generate.js index 43ecb20c..01d62405 100644 --- a/src/cli/h2sa/src/gen/generate.js +++ b/src/cli/h2sa/src/gen/generate.js @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const { NapiLog } = require('../tools/NapiLog'); +const { NapiLog } = require('../tools/napi_log'); const { replaceAll, getTab } = require('../tools/tool'); const re = require('../tools/re'); const { iServiceHTemplate, proxyHTemplate, stubHTemplate, serviceHTemplate, proxyCppTemplate, proxyFuncTemplate, stubCppTemplate, stubInnerFuncTemplate, serviceCppTemplate, serviceFuncImplTemplate, clientCppTemplate, buildGnTemplate, buildGnTemplate41, bundleJsonTemplate, bundleJsonTemplate41, profileGnTemplate, profileGnTemplate41, profileJsonTemplate, - profileXmlTemplate, serviceCfgTemplate, serviceCfgTemplate41, serviceCfgGnTemplate, iServiceCppTemplate } = require('./fileTemplate'); + profileXmlTemplate, serviceCfgTemplate, serviceCfgTemplate41, serviceCfgGnTemplate, iServiceCppTemplate } = require('./file_template'); const { DATA_W_MAP, DATA_R_MAP, VECTOR_W_MAP, VECTOR_R_MAP, getParcelType, AllParseFileList, MarshallInfo, ProcessingClassList } = require('../tools/common'); const numericTypes = ['short', 'int', 'long', 'long long', 'float', 'double']; diff --git a/src/cli/h2sa/src/gen/main.js b/src/cli/h2sa/src/gen/main.js index 4f2cac82..2e2c20fd 100644 --- a/src/cli/h2sa/src/gen/main.js +++ b/src/cli/h2sa/src/gen/main.js @@ -17,17 +17,17 @@ const stdio = require('stdio'); const fs = require('fs'); const re = require('../tools/re'); -const { NapiLog } = require('../tools/NapiLog'); +const { NapiLog } = require('../tools/napi_log'); const { print } = require('../tools/tool'); const analyze = require('./analyze'); const gen = require('./generate'); -const { writeFile, createFolder } = require('../tools/FileRW'); +const { writeFile, createFolder } = require('../tools/file_rw'); let ops = stdio.getopt({ 'filename': { key: 'f', args: 1, description: '.h file', default: '' }, 'out': { key: 'o', args: 1, description: 'output directory', default: '.' }, 'loglevel': { key: 'l', args: 1, description: 'Log Level: 0~3', default: '1' }, - 'serviceId': { key: 's', args: 1, description: 'service register id: 9000~16777214', default: '9000' }, + 'serviceId': { key: 's', args: 1, description: 'service register id: 9000~16777214', default: '19000' }, 'versionTag': { key: 'v', args: 1, description: 'version tag: 4.1 / 3.2', default: '3.2' } }); diff --git a/src/cli/h2sa/src/tools/FileRW.js b/src/cli/h2sa/src/tools/file_rw.js similarity index 100% rename from src/cli/h2sa/src/tools/FileRW.js rename to src/cli/h2sa/src/tools/file_rw.js diff --git a/src/cli/h2sa/src/tools/NapiLog.js b/src/cli/h2sa/src/tools/napi_log.js similarity index 100% rename from src/cli/h2sa/src/tools/NapiLog.js rename to src/cli/h2sa/src/tools/napi_log.js From 0b181a6a69d2f2bf7e56fa5552fce5e26149e182 Mon Sep 17 00:00:00 2001 From: huruitao Date: Sat, 14 Sep 2024 17:33:59 +0800 Subject: [PATCH 11/15] fix Signed-off-by: huruitao --- src/cli/h2sa/docs/usage/usage.md | 229 +++++++++++++++++++++++-------- 1 file changed, 172 insertions(+), 57 deletions(-) diff --git a/src/cli/h2sa/docs/usage/usage.md b/src/cli/h2sa/docs/usage/usage.md index 4467d12e..695aeefb 100644 --- a/src/cli/h2sa/docs/usage/usage.md +++ b/src/cli/h2sa/docs/usage/usage.md @@ -1,83 +1,198 @@ -## Develop Guide +### Usage Guide -### service代码生成工具使用场景 +## 简介 -​ 当开发人员为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。 Service代码生成工具能够帮助用户生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。用户可基于框架代码专注于业务功能的编写。 +h2sa工具,即SERVICE框架生成工具,当开发者为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系统IPC通信框架编写一套远程接口调用实现。实现Service远程调用接口需要开发人员熟悉IPC通信框架,了解proxy/stub的继承与实现方式,掌握C++类型转为MessageParcel数据包的各种API方法,有一定的学习成本。而Service代码生成工具能够帮助使用者生成框架代码,提升开发效率。用户只需提供一个定义远程方法的.h头文件,工具会自动生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。 -![image](../figures/service_file.png) +## 约束 ---- +系统:建议Ubuntu 20.04或者Windows 10 -### service工具代码框架说明 +依赖版本:VS Code 1.62.0 -~~~ -napi_generator\src\cli\h2sa +## 使用方法 -h2sa -├── docs //文档 -├── README_ZH.md //usage,使用说明 -├── package.json //Node.js打包配置文件 -└── src - ├── gen - │ ├── analyze.js //包含用于分析C++头文件的逻辑。读取头文件内容;解析文件以提取类、方法、参数等信息。 - │ ├── file_template.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) - │ ├── generate.js //包含核心的代码生成逻辑。调用analyze.js来获取分析结果;使用fileTemplate.js中的模板和分析结果来生成代码。 - │ ├── header_parser.py //脚本,与analyze.js协同工作,用于解析C++头文件 - │ └── test.h //生成sa的提示文件 - │ └── main.js //项目的入口。初始化日志记录和其它工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 - └── tools - ├── common.js //包含整个项目中使用的通用函数和常量 - ├── file_rw.js //包含文件读写操作的JavaScript模块 - ├── napi_log.js //日志记录模块 - ├── re.js //包含正则表达式相关功能的模块 - └── tool.js //包含一些辅助工具函数 -~~~ +#### 命令行 -### 运行逻辑 +1. 安装python库 CppHeaderParser -![image](../figures/service_runLogic.png) + ~~~ + pip install CppHeaderParser + ~~~ -main.js为脚本入口,其中使用stdio.getopt获取参数,其中,参数详情如下: +2. 安装typescript:在napi_generator/src/cli/h2sa/src目录下执行命令 - -f,定义远程服务的.h文件; + ~~~ + npm i typescript + ~~~ - -l, 日志级别(0-3),默认为1; +3. 安装stdio:在napi_generator/src/cli/h2sa目录下执行命令 - -o, 生成框架代码输入到指定路径下; + ~~~ + npm i stdio + ~~~ - -s, 指定serviceID。 - +4. 在napi_generator/src/cli/h2sa/src/gen目录下执行命令生成service框架代码: - -v, 指定版本(3.2和4.1,默认版本为3.2) + ~~~ + node main.js -f test.h + ~~~ -~~~ -let ops = stdio.getopt({ - 'filename': { key: 'f', args: 1, description: '.h file', default: '' }, - 'out': { key: 'o', args: 1, description: 'output directory', default: '.' }, - 'loglevel': { key: 'l', args: 1, description: 'Log Level: 0~3', default: '1' }, - 'serviceId': { key: 's', args: 1, description: 'service register id: 9000~16777214', default: '9000' }, - 'versionTag': { key: 'v', args: 1, description: 'version tag: 4.1 / 3.2', default: '3.2' } -}); -~~~ +其中,参数详情如下: -### 开发指导 +-f,定义远程服务的.h文件; -#### 适配新版本 +-l,可选参数,日志级别(0-3),默认为1; -用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,需要适配其它版本时,可修改以下文件进行适配: +-o,可选参数,生成框架代码输入到指定路径下; -**9月份会进行代码去重整改,预估适配方式如下,整改后如有出入,会进行修改** +-s,可选参数,指定serviceID,默认为19000; -1.在main.js中,在allowedVersion数组中加入适配的版本号,如4.1统一为v4_1, 5.0统一为v5_0。 +-v,可选参数,指定版本(3.2和4.1,默认版本为3.2) -2.在file_template.js中,以适配5.0源码为例,新增v5_0版本对应的bundle.json模板,对应的BUILD.gn模板;新增5.0版本的bundle.json,BUILD.gn模板路径。 +#### 生成物 -3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 +1. 输出testservice文件夹,其中的文件如下所示: -4.适配新版本需要增加其它配置,可在file_template.js中增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 + ![](../figures/h2sa_outRes.png) -#### RoadMap + ~~~ + ├── BUILD.gn # 整个服务的编译文件,包含2个内容:1)服务端程序动态库编译 2)客户端可执行程序编译 + ├── bundle.json # 将服务包装成一个OpenHarmoney子系统组件,提供相关信息 + ├── etc # 服务启动配置目录,如果服务不需要开机自动启动,可以删除此目录。 + │ ├── BUILD.gn + │ └── test_service.cfg # 服务自启动配置文件,编译烧录后会在/ect/init/下生成xxx_service.cfg启动文件 + ├── include + │ ├── test_service.h # 服务端头文件 + │ ├── test_service_proxy.h # proxy 客户端头文件,为开发人员封装remote请求发送的处理 + │ └── test_service_stub.h # stub 服务端头文件,为开发人员封装remote请求接收的处理 + ├── interface + │ └── i_test_service.h # 由用户提供的.h文件生成的remote接口文件,stub和proxy都基于此文件实现接口。 + ├── sa_profile + │ ├── 19000.json # 服务配置文件 + │ └── BUILD.gn + └── src + ├── i_test_service.cpp # 接口实现文件 + ├── test_client.cpp # 客户端程序 + ├── test_service.cpp # 服务端程序 + ├── test_service_proxy.cpp # 客户端代理实现 + └── test_service_stub.cpp # 服务端 stub 实现 + ~~~ -| 时间点 | 预期任务 | 验收标准 | 完成情况 | -| :----- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------- | -| 9月份 | 1,代码去重方案提供(不同版本模板,proxy-stub框架,hidumper框架,hitrace);
2,适配5.0release版本,增加代码中hidump、hitrace等日志跟踪定位工具的使用; | 1,设计文档;
2,适配5.0时,可以编译出对应版本的工具,且编译验证成功 | 预计2024.9.24 | -| 10月份 | 增加testapp调用 sa接口,包括死亡监听; | 杀掉服务后,有信息 | | \ No newline at end of file +#### 应用和验证 + +1. 将生成的testservice文件夹放在对应版本的源码根目录下 + +2. 修改服务配置文件 + + 在foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include/system_ability_definition.h增加以下一行: + + ``` + TEST_SERVICE_ID = {serviceID}, //保证ID与参数-s的值一致且没有重复,例如:默认值19000 + ``` + +3. 修改子系统配置文件 + + 在build/subsystem_config.json中增加以下内容。 + + ``` + "testservice": { + "path":"testservice", + "name": "testservice" + } + ``` + +4. 修改产品配置,如rk3568 + + 在vendor/hihope/rk3568/config.json中增加以下内容: + + ``` + { + "subsystem": "testservice", + "components": [ + { + "component": "testservice_part", + "features": [] + } + ] + } + ``` + +5. 修改权限配置 + + 在相应的产品目录的vendor/hihope/rk3568/security_config/high_privilege_process_list.json中增加以下内容: + + ``` + { + "name": "testservice", + "uid": "system", + "gid": ["root", "system"] + } + ``` + +6. selinux权限配置 + + vendor/hihope/rk3568/config.json中"build_selinux"属性若为true, 即要配置selinux权限,应修改以下文件;若为false,无需修改 + + > 1. testservice/etc/sample_service.cfg + > + > ``` + > "secon" : "u:r:testservice:s0" + > ``` + > + > 2. base/security/selinux_adapter/sepolicy/base/public/service_contexts + > + > ``` + > 9016 u:object_r:sa_testservice:s0 + > ``` + > + > 3. base/security/selinux_adapter/sepolicy/base/public/service.te + > + > ``` + > type sa_testservice, sa_service_attr; + > ``` + > + > 4. base/security/selinux_adapter/sepolicy/ohos_policy/startup/init/system/init.te + > + > ``` + > allow init testservice:process { getattr rlimitinh siginh transition }; + > ``` + > + > 5. base/security/selinux/sepolicy/base/public/type.te + > + > ``` + > type testservice, sadomain, domain; + > ``` + > + > 6. /base/security/selinux/sepolicy/base/te目录下增加新service的te文件,新增文件名即为服务名,例如:testservice.te + > + > ``` + > allow testservice init_param:file { map open read }; + > allow testservice sa_testservice:samgr_class { add get }; + > ``` + +7. 编码完成后,执行镜像编译命令 + + ~~~ + ./build.sh --product-name 产品名 + + 若编译rk3568开发板,则执行 + ./build.sh --product-name rk3568 + ~~~ + +8. 烧录镜像 + +9. 运行验证 + + >验证一: shell登录开发板。 查看服务端进程是否已正常启动 + > + >~~~ + >ps -ef | grep testservice + >system 288 1 0 00:02:13 ? 00:00:00 testservice_sa --- 服务进程已正常运行 + >~~~ + > + >验证二:运行客户端 + > + >~~~ + >/system/bin/testclient + >~~~ \ No newline at end of file From 7e7407b20d39c348bd9aff2bf8d186c21c64b09c Mon Sep 17 00:00:00 2001 From: huruitao Date: Sat, 14 Sep 2024 17:39:02 +0800 Subject: [PATCH 12/15] fix Signed-off-by: huruitao --- src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md index 3dc7c93b..4467d12e 100644 --- a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md +++ b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md @@ -14,25 +14,21 @@ napi_generator\src\cli\h2sa h2sa -├── docs //文档,(后续文档会整理在一起) -├── examples //样例,测试h文件 -│ ├── sample.h -│ └── test.h -├── h2sa_DEVELOP_README_ZH.md //开发文档 +├── docs //文档 ├── README_ZH.md //usage,使用说明 +├── package.json //Node.js打包配置文件 └── src - ├── package.json //Node.js打包配置文件 - └── src - ├── gen - │ ├── analyze.js //包含用于分析C++头文件的逻辑。读取头文件内容;解析文件以提取类、方法、参数等信息。 - │ ├── file_template.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) - │ ├── generate.js //包含核心的代码生成逻辑。调用analyze.js来获取分析结果;使用fileTemplate.js中的模板和分析结果来生成代码。 - │ ├── header_parser.py //脚本,与analyze.js协同工作,用于解析C++头文件 - │ └── main.js //项目的入口。初始化日志记录和其它工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 - └── tools + ├── gen + │ ├── analyze.js //包含用于分析C++头文件的逻辑。读取头文件内容;解析文件以提取类、方法、参数等信息。 + │ ├── file_template.js //包含生成代码时使用的模板字符串。模板中的占位符将在代码生成过程中被实际的数据替换,以生成所需的代码文件。(之后换成inl或者tmpl模板文件,并分出不同版本的文件夹,不同类型的文件) + │ ├── generate.js //包含核心的代码生成逻辑。调用analyze.js来获取分析结果;使用fileTemplate.js中的模板和分析结果来生成代码。 + │ ├── header_parser.py //脚本,与analyze.js协同工作,用于解析C++头文件 + │ └── test.h //生成sa的提示文件 + │ └── main.js //项目的入口。初始化日志记录和其它工具;解析命令行参数,以确定用户想要执行的操作;调用generate.js来启动代码生成过程。 + └── tools ├── common.js //包含整个项目中使用的通用函数和常量 - ├── FileRW.js //包含文件读写操作的JavaScript模块 - ├── NapiLog.js //日志记录模块 + ├── file_rw.js //包含文件读写操作的JavaScript模块 + ├── napi_log.js //日志记录模块 ├── re.js //包含正则表达式相关功能的模块 └── tool.js //包含一些辅助工具函数 ~~~ @@ -73,11 +69,11 @@ let ops = stdio.getopt({ 1.在main.js中,在allowedVersion数组中加入适配的版本号,如4.1统一为v4_1, 5.0统一为v5_0。 -2.在templete目录下,以适配5.0源码为例,IdlInterfaceTemplete目录下新建v5_0文件夹,在v5_0文件夹下新增对应的bundle.json模板,对应的BUILD.gn模板;新增5.0版本的bundle.json,BUILD.gn模板路径。 +2.在file_template.js中,以适配5.0源码为例,新增v5_0版本对应的bundle.json模板,对应的BUILD.gn模板;新增5.0版本的bundle.json,BUILD.gn模板路径。 3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 -4.适配新版本需要增加其它配置,可在templete目录下增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 +4.适配新版本需要增加其它配置,可在file_template.js中增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 #### RoadMap From ec5d448701c6c954603e59b52032a72056d8a649 Mon Sep 17 00:00:00 2001 From: huruitao Date: Sat, 14 Sep 2024 18:01:22 +0800 Subject: [PATCH 13/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huruitao --- src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md index 4467d12e..45a7c20c 100644 --- a/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md +++ b/src/cli/h2sa/docs/guide/h2sa_Develop_Guide.md @@ -65,13 +65,11 @@ let ops = stdio.getopt({ 用户可对工具进行二次开发。例如:当前工具适配的源码版本是4.1,需要适配其它版本时,可修改以下文件进行适配: -**9月份会进行代码去重整改,预估适配方式如下,整改后如有出入,会进行修改** - 1.在main.js中,在allowedVersion数组中加入适配的版本号,如4.1统一为v4_1, 5.0统一为v5_0。 -2.在file_template.js中,以适配5.0源码为例,新增v5_0版本对应的bundle.json模板,对应的BUILD.gn模板;新增5.0版本的bundle.json,BUILD.gn模板路径。 +2.在file_template.js中,以适配5.0源码为例,参考bundleJsonTemplate41,buildGnTemplate41 新增v5_0版本对应的bundle.json模板、BUILD.gn模板;在module.exports中新增5.0版本的bundle.json,BUILD.gn模板对应的变量名。 -3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码:当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 +3.在generate.js中,在doGenerate方法、genFilesByTemplate方法、genFileNames方法中修改相应代码;当rootInfo.version为v5_0时,替换对应的BUILD.gn, bundle.json模板路径。 4.适配新版本需要增加其它配置,可在file_template.js中增加配置模板,并增加配置文件模板的路径,在generate.js中生成配置文件。 From f63175beb12843c18c52ecb2b7ef440418f7f992 Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 18 Sep 2024 08:46:21 +0800 Subject: [PATCH 14/15] codecheck Signed-off-by: huruitao --- src/cli/h2sa/src/tools/file_rw.js | 4 ++-- src/cli/h2sa/src/tools/napi_log.js | 6 +++--- src/cli/h2sa/src/tools/tool.js | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cli/h2sa/src/tools/file_rw.js b/src/cli/h2sa/src/tools/file_rw.js index df7b44b7..a4be34ed 100644 --- a/src/cli/h2sa/src/tools/file_rw.js +++ b/src/cli/h2sa/src/tools/file_rw.js @@ -15,8 +15,8 @@ const fs = require('fs'); function utf8ArrayToStr(array) { - var out, i, len, c; - var char2, char3; + let out, i, len, c; + let char2, char3; out = ''; len = array.length; diff --git a/src/cli/h2sa/src/tools/napi_log.js b/src/cli/h2sa/src/tools/napi_log.js index 947eb213..689b11ae 100644 --- a/src/cli/h2sa/src/tools/napi_log.js +++ b/src/cli/h2sa/src/tools/napi_log.js @@ -32,9 +32,9 @@ NapiLog.LEV_DEBUG = 2; NapiLog.LEV_INFO = 3; const LEV_STR = ['[NON]', '[ERR]', '[DBG]', '[INF]']; -var logLevel = NapiLog.LEV_ERROR; -var logFileName = null; -var logResultMessage = [true, '']; +let logLevel = NapiLog.LEV_ERROR; +let logFileName = null; +let logResultMessage = [true, '']; function getDateString() { let nowDate = new Date(); diff --git a/src/cli/h2sa/src/tools/tool.js b/src/cli/h2sa/src/tools/tool.js index 87d1d234..3617508f 100644 --- a/src/cli/h2sa/src/tools/tool.js +++ b/src/cli/h2sa/src/tools/tool.js @@ -28,7 +28,7 @@ function print(...args) { } String.prototype.format = function (...args) { - var result = this; + let result = this; let reg = new RegExp('%[sd]{1}'); for (let i = 0; i < args.length; i++) { let p = result.search(reg); @@ -57,7 +57,7 @@ function replaceAll(s, sfrom, sto) { function getTab(tabLv) { let tab = ''; - for (var i = 0; i < tabLv; ++i) { + for (let i = 0; i < tabLv; ++i) { tab += ' '; } return tab; From 9d24aab23ca178ba5eff079d2f672cd4279696ce Mon Sep 17 00:00:00 2001 From: huruitao Date: Wed, 18 Sep 2024 11:58:57 +0800 Subject: [PATCH 15/15] codecheck Signed-off-by: huruitao --- src/cli/h2sa/src/tools/file_rw.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/cli/h2sa/src/tools/file_rw.js b/src/cli/h2sa/src/tools/file_rw.js index a4be34ed..4e7b0616 100644 --- a/src/cli/h2sa/src/tools/file_rw.js +++ b/src/cli/h2sa/src/tools/file_rw.js @@ -15,8 +15,12 @@ const fs = require('fs'); function utf8ArrayToStr(array) { - let out, i, len, c; - let char2, char3; + let out; + let i; + let len; + let c; + let char2; + let char3; out = ''; len = array.length;