Merge branch 'master' of gitee.com:openharmony/startup_appspawn into native_test_fix

Signed-off-by: 王达 <5721411+wang_da123@user.noreply.gitee.com>
This commit is contained in:
王达 2024-03-29 13:05:55 +00:00 committed by Gitee
commit 6e9a0bbd9f
7 changed files with 702 additions and 6 deletions

View File

@ -27,6 +27,7 @@
"--sandbox-switch on --bundle-name com.ohos.appspawn.startup --app-operate-type operate ",
"--render-command command --app-launch-type singleton --app-visible true"],
"importance" : -20,
"critical" : [1, 4, 240],
"uid" : "root",
"gid" : ["root"],
"socket" : [{

View File

@ -58,8 +58,8 @@ static BOOL Initialize(Service *service, Identity identity)
AppSpawnService *spawnService = (AppSpawnService *)service;
spawnService->identity = identity;
APPSPAWN_LOGI("[appspawn] initialize, identity<%d, %d, %p>", \
identity.serviceId, identity.featureId, identity.queueId);
APPSPAWN_LOGI("[appspawn] initialize, identity<%d, %d>", \
identity.serviceId, identity.featureId);
return TRUE;
}
@ -186,7 +186,7 @@ void AppSpawnInit(void)
return;
}
APPSPAWN_LOGI("[appspawn] register service succeed. %p.", &g_appSpawnService);
APPSPAWN_LOGI("[appspawn] register service succeed.");
if (SAMGR_GetInstance()->RegisterDefaultFeatureApi(APPSPAWN_SERVICE_NAME, \
GET_IUNKNOWN(g_appSpawnService)) != TRUE) {

193
service/hnp/README_zh.md Normal file
View File

@ -0,0 +1,193 @@
# Native包管理开发指导
## 场景介绍
Native包管理功能模块提供了对Native软件的打包、安装、卸载及运行管控报告的能力。
## 接口说明
针对安装卸载功能提供了以下API调用接口。打包功能使用sdk hnpcli命令行执行。
| 接口名 | 描述 |
| :----------------------------------------------------------- | :--------------------------------------- |
| [NativeInstallHnp](api_hnp.md#nativeinstallhnp)| 安装Native软件包 |
|[NativeUnInstallHnp]((api_hnp.md#nativeuninstallhnp))| 卸载Native软件包 |
## 开发步骤
**1. 操作前准备Native软件包**
编译后的Native软件包里通常包含以下内容
bin #可执行二进制存放路径
cfg #配置文件存放路径
lib #依赖库存放路径
... #其它
支持对可执行二进制进行软链接配置具体的配置格式如下需遵循json格式
{
"type":"hnp-config", #固定标识符“hnp-config”
"name":"xxx", #Native软件名
"version":"1.1", #版本号
"install":{
"links":[ #软链接配置信息
{
"source":"xxxxxx",
"target":"xxxxxx"
}
]
}
}
用户在配置文件中指定了软链接关系则安装时根据用户配置进行软链接设置。如果用户不使用配置文件或者配置文件中没有设置软链接则安装时默认将软件包内bin目录下的可执行二进制都进行软链接。
样例:
hnpsample软件包目录
hnpsample
|__bin
|__hnpsample
|__cfg
|__hnpsample.cfg
|__lib
|__libhnpsamplelib.z.so
配置文件hnpsample.json
{
"type":"hnp-config",
"name":"hnpsample",
"version":"1.1",
"install":{
"links":[
{
"source":"/bin/hnpsample",
"target":"hnpsample"
}
]
}
}
**2. Native软件包打包**
Native软件打包的目的是为了将Native软件打包成hnp文件以便后面上传到应用市场为支持不同操作系统linux、windows、mac当前提供了hnpcli命令集成到sdk中用户通过hnpcli命令进行打包。
hnpcli打包命令有两种使用方式。
一种是通过传入软件名和版本号进行打包:
hnpcli pack [待打包路径] [输出路径] -name [Native软件名] -v [版本号]
另一种是通过传入配置文件进行打包:
hnpcli pack [待打包路径] [输出路径] -cfg [配置文件所在路径]
打包成功后会在输出路径下生成"[Native软件名].hnp"的文件。
样例:
1. 对hnpsample软件进行打包使用命令如下
hnpcli pack ./hnpsample ./out -name hnpsample -v 1.1
或者
hnpcli pack ./hnpsample ./out -cfg hnpsample.json
2. 命令返回成功则在out目录下生成hnpsample.hnp文件
**3. Native软件包安装**
Native软件包安装就是将从应用市场下载解压出来的hnp包安装到鸿蒙PC设备上。当前提供接口调用以及hnp命令行两种方式进行安装。
1 hnp命令行安装
hnp install [系统用户ID] [hnp包所在路径] [应用软件名] <-f>
该命令执行时会将用户传入的hnp所在路径下的所有hnp进行批量安装。-f选项表示是否开启强制安装强制安装下如果发现软件已安装则会将已安装软件先卸载再安装新的。安装路径根据用户传入的应用软件名进行区分应用软件名为0则为公有软件否则是私有软件。设备上安装后的软件路径如下
公有软件:/data/app/el1/bundle/[userId]/hnppublic/
私有软件:/data/app/el1/bundle/[userId]/hnp/[packageName]/
样例:
# 安装hnpsample.hnp公有软件
所在目录./hnp_path/下。安装在系统用户ID 100 下面。
执行命令hnp install 100 ./hnp_path 0 -f
执行成功后会在以下路径下生成输出件
/data/app/el1/bundle/100/hnppublic/hnpsample.org/hnpsample_1.1
生成的软链接配置关系:
软链接文件:/data/app/el1/bundle/100/hnppublic/bin/hnpsample 指向 /data/app/el1/bundle/100/hnppublic/hnpsample.org/hnpsample_1.1/bin/hnpsample
# 安装hnpsample.hnp私有有软件应用软件为baidu
所在目录./hnp_path/下。安装在系统用户ID 100 下面。
执行命令hnp install 100 ./hnp_path baidu -f
执行成功后会在以下路径下生成输出件
/data/app/el1/bundle/100/hnp/baidu/hnpsample.org/hnpsample_1.1
生成的软链接配置关系:
软链接文件:/data/app/el1/bundle/100/hnp/baidu/bin/hnpsample 指向 /data/app/el1/bundle/100/hnp/baidu/hnpsample.org/hnpsample_1.1/bin/hnpsample
2 接口调用安装
安装接口原型:
/**
* Install native software package.
*
* @param userId Indicates id of user.
* @param hnpPath Indicates the directory path of hnp file.
* @param packageNmae Indicates name of application software.
* @param isForce Indicates whether to force install.
*
* @return 0:success;other means failure.
*/
int NativeInstallHnp(const char *userId, const char *hnpPath, const char *packageName, Bool isForce);
样例:
#include "hnp_api.h"
...
/* 安装公有软件 */
int ret = NativeInstallHnp(100, "./hnp_path", 0, true);
...
/* 安装私有软件 */
int ret = NativeInstallHnp(100, "./hnp_path", “baidu”, true);
...
执行成功后输出件和上面命令行的一样
**4. Native软件包卸载**
Native软件包卸载就是将已安装到系统上的Native软件进行卸载。当期望卸载的软件正在运行时则卸载失败。当前提供接口调用以及命令行两种方式进行卸载。
1 hnp命令行卸载
hnp uninstall [系统用户ID] [Native软件名] [软件版本号] [应用软件名]
用户需要传入指定的的软件名以及版本号进行卸载,也要告知卸载哪个系统用户下的软件以及是公有软件还是私有软件。
样例:
公有软件卸载:
hnp uninstall 100 hnpsample 1.1 0
私有软件卸载:
hnp uninstall 100 hnpsample 1.1 baidu
卸载之前已经安装的hnpsample 1.1版本的软件。100为安装所在的系统用户ID。
执行成功观察点观察以下之前安装的软件目录“hnpsample.org”是否已删除。
公有软件:
/data/app/el1/bundle/100/hnppublic/hnpsample.org
私有软件:
/data/app/el1/bundle/100/hnp/baidu/hnpsample.org
2 接口调用卸载
卸载接口原型:
/**
* Uninstall native software package.
*
* @param userId Indicates id of user.
* @param hnpName Indicates the name of native software.
* @param hnpVersion Indicates the version of native software.
* @param packageName Indicates the name of application software.
*
* @return 0:success;other means failure.
*/
int NativeUnInstallHnp(const char *userId, const char *hnpName, const char *hnpVersion, const char *packageName);
样例:
#include "hnp_api.h"
...
/* 卸载公有软件 */
int ret = NativeUnInstallHnp(100, "hnpsample", “1.1”, 0);
...
/* 卸载私有软件 */
int ret = NativeUnInstallHnp(100, "hnpsample", “1.1”, “baidu”);
...
执行成功后观察点和上面命令行执行一致。

66
service/hnp/api_hnp.md Normal file
View File

@ -0,0 +1,66 @@
# hnp_api.h
## 概述
提供支持Native软件的安装和卸载功能。
### 文件
| 名称 | 描述 |
| -------- | -------- |
| hnp_api.h | 提供支持Native软件的安装和卸载的函数。<br/>**引用文件**<br/>**库**libhnpapi.z.so |
### 结构体定义
NA
### 函数
| 名称 | 描述 |
| -------- | -------- |
| [NativeInstallHnp](#nativeinstallhnp) | 安装Native软件到设备中 |
| [NativeUnInstallHnp](#nativeuninstallhnp)| 卸载设备中已安装的Native软件 |
## 函数说明
### NativeInstallHnp
```
int NativeInstallHnp(const char *userId, const char *hnpPath, const char *packageName, Bool isForce);
```
**描述**
安装Native软件到设备中。
参数:
userId用户ID
hnpPathhnp包所在路径
packageName应用软件名
isForce是否强制安装
**返回:**
安装成功返回0失败返回错误码
### NativeUnInstallHnp
```
int NativeUnInstallHnp(const char *userId, const char *hnpName, const char *hnpVersion, const char *packageName);
```
**描述**
卸载设备中已安装的Native软件。
参数:
userId用户ID
hnpName软件名
hnpVersion版本号
packageName应用软件名;
**返回:**
卸载成功返回0失败返回错误码

View File

@ -296,7 +296,7 @@ int HnpWriteToZipHead(const char *zipFile, char *buff, int len)
return ret;
}
FILE *fp = fopen(zipFile, "w");
FILE *fp = fopen(zipFile, "wb");
if (fp == NULL) {
free(buffTmp);
HNP_LOGE("open file:%s unsuccess!", zipFile);
@ -370,4 +370,4 @@ int HnpReadFromZipHead(const char *zipFile, NativeHnpHead **hnpHead)
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,437 @@
# Native包管理错误码
> **说明:**
>
> 以下仅介绍Native包模块特有错误码。
# base公共模块错误码
## 0x801001 命令操作类型非法
**错误信息**
The cmd operate type is invalid.
**错误描述**
操作命令非法。
**可能原因**
传入非法的操作命令就会报这个错误。
**处理步骤**
检查传入的参数个数是否正确。可通过命令hnpcli help查询正确的参数格式
## 0x801101 打开文件失败
**错误信息**
Open file failed.
**错误描述**
打开文件失败会报这个错误。
**可能原因**
1. 文件不存在。
2. 没有权限
**处理步骤**
1. 检查对应的路径下文件是否存在。
2. 检查文件的访问权限,确认本进程是否有权限访问。
## 0x801102 读取文件失败
**错误信息**
Read file content failed.
**错误描述**
读取文件内容失败。
**可能原因**
1. 文件不存在。
2. 没有权限
3. 文件读出的内容大小和期望的大小不相等
**处理步骤**
1. 检查对应的路径下文件是否存在。
2. 检查文件的访问权限,确认本进程是否有权限访问。
3. 查看文件内容以及期望读出的大小,确认哪个是正确的。
## 0x801103 fseek操作失败
**错误信息**
Feek return failed.
**错误描述**
fseek设置失败。
**可能原因**
1. 文件不存在。
2. 没有权限
3. fseek系统报错
**处理步骤**
1. 检查对应的路径下文件是否存在。
2. 检查文件的访问权限,确认本进程是否有权限访问。
3. 查看fssk系统错误码进行定位。
## 0x801104 ftell操作失败
**错误信息**
ftell return failed.
**错误描述**
ftell设置失败。
**可能原因**
1. 文件不存在。
2. 没有权限
3. ftell系统报错
**处理步骤**
1. 检查对应的路径下文件是否存在。
2. 检查文件的访问权限,确认本进程是否有权限访问。
3. 查看ftell系统错误码进行定位。
## 0x801105 获取实际路径失败
**错误信息**
Get real path failed.
**错误描述**
获取实际路径失败。
**可能原因**
1. 路径不存在
**处理步骤**
1. 检查对应的路径下是否存在。
## 0x801106 获取文件大小为0
**错误信息**
Get file content size is 0.
**错误描述**
文件内容为空时会报这个错误。
**可能原因**
1. 文件内容为空
**处理步骤**
1. 检查文件内容是否为空。
## 0x801107 字符串大小超出限制
**错误信息**
The len of string exceed limit.
**错误描述**
字符串大小超出了限制。
**可能原因**
用户传入的字符串超出了限制的大小
**处理步骤**
1. 根据错误信息检查参数是否存在问题
## 0x801108 目录打开失败
**错误信息**
Open Dir failed.
**错误描述**
打开目录失败。
**可能原因**
1. 目录不存在
2. 权限问题
**处理步骤**
1. 检查传入的目录是否存在
2. 检查目录权限是否本进程能够打开
## 0x801109 sprintf拼接失败
**错误信息**
Sprintf failed.
**错误描述**
sprintf拼接失败。
**可能原因**
1. sprintf接口返回错误
**处理步骤**
1. 查看sprintf错误码并检查参数是否正确
## 0x80110a 生成压缩文件失败
**错误信息**
Create new file in zip failed.
**错误描述**
在zip压缩文件中增加文件失败。
**可能原因**
1. 压缩软件报错
**处理步骤**
1. 查看压缩软件报错原因并修复
## 0x80110b 写文件失败
**错误信息**
Write file failed.
**错误描述**
写入文件内容失败或者写入的字符数和期望的字符数不相等。
**可能原因**
1. 文件不存在
2. 权限问题
3. 写入的是压缩的内容
**处理步骤**
1. 检查传入的文件是否存在
2. 检查文件权限是否本进程能够打开
3. 使用“wb”打开文件再进行写入
## 0x80110c strcpy拷贝失败
**错误信息**
Strcpy failed.
**错误描述**
strcpy拷贝失败。
**可能原因**
1. strcpy接口返回错误
**处理步骤**
1. 查看strcpy错误码并检查参数是否正确
## 0x80110d 获取文件属性失败
**错误信息**
Get file attr failed.
**错误描述**
获取文件属性信息失败。
**可能原因**
1. 文件不存在
2. 权限问题
3. 系统接口报错
**处理步骤**
1. 检查传入的文件是否存在
2. 检查文件权限是否本进程能够打开
3. 查看具体的系统报错信息并修改
# pack打包模块错误码
## 0x801201 打包命令参数错误
**错误信息**
The cmd arg num is invalid.
**错误描述**
当参数个数检查失败时会返回当前错误。
**可能原因**
传递的有效参数个数小于4个。
**处理步骤**
检查传入的参数个数是否正确。可通过命令hnpcli help查询正确的参数格式
## 0x801202 打包时获取实际路径失败
**错误信息**
Get real path failed.
**错误描述**
当输入的地址不是有效地址时会返回该错误。
**可能原因**
传入的地址不是一个设备上实际存在的地址。
**处理步骤**
检查传入的打包目录路径、输出路径以及配置项文件路径是否存在
## 0x801203 打包命令缺少关键的参数
**错误信息**
Packet cmd miss importent arg.
**错误描述**
检查打包命令时发现缺少重要的参数会报这个错误。
**可能原因**
没有传入-name、-v这两个参数以及也没有传入-cfg参数。
**处理步骤**
检查传参,确保传入-name、-v参数或者是传入-cfg参数
## 0x801204 读配置文件流失败
**错误信息**
Read file to stream failed.
**错误描述**
读取文件到缓存出错就会报这个错误。
**可能原因**
1. 文件打开失败。权限不足
2. 文件内容为空
3. malloc申请缓存失败
**处理步骤**
1. 查看文件的访问权限,确认是否有权限读取
2. 检查文件内容是否为空
3. 查看系统内存是否不足
## 0x801205 解析json文件信息失败
**错误信息**
Parse json file failed.
**错误描述**
当解析json内容失败时会报这个错误。
**可能原因**
json文件不是按照json 的格式编写,导致解析失败。
**处理步骤**
检查json文件格式是否合规。
## 0x801206 从json内容中未找到期望的项
**错误信息**
Find expect item in json content failed。
**错误描述**
当json内容中没有对应的字段就会报这个错误。
**可能原因**
json文件配置错误少了某些关键的项。
**处理步骤**
根据日志确认缺失了哪些字段并检查json文件补充。
## 0x801207 从json内容中解析期望的数组信息失败
**错误信息**
Parse array info in json content failed。
**错误描述**
获取json中的数组信息失败会报这个错误。
**可能原因**
json文件配置错误。
**处理步骤**
检查json文件内容。
## 0x801208 组装输出文件路径失败
**错误信息**
Get output file path failed。
**错误描述**
拼接文件路径名失败时会报这个错误。
**可能原因**
sprintf拼接文件名失败
**处理步骤**
查看路径名字是否过长。
## 0x801209 压缩目录失败
**错误信息**
Compress dir failed。
**错误描述**
压缩目录失败时会报这个错误。
**可能原因**
1. 权限问题导致无法访问原目录或者输出目录
2. 压缩软件报错
**处理步骤**
1. 查看原目录和输出目录的访问权限,确定本进程是否可以访问
2. 查看对应的压缩软件错误信息进行定位

View File

@ -199,7 +199,6 @@ pid_t AppSpawnFork(int (*childFunc)(void *arg), void *args)
if (forkArg == nullptr) {
return -1;
}
printf("ThreadFunc TestFork args %p forkArg %p\n", args, forkArg);
forkArg->childFunc = childFunc;
forkArg->args = args;
int ret = pthread_create(&thread, nullptr, ThreadFunc, forkArg);