提交 47be47b0 编写于 作者: L laiguizhong

按模板修改md

Signed-off-by: Nlaiguizhong <laiguizhong@huawei.com>
上级 4555b0ef
# appspawn应用孵化组件<a name="ZH-CN_TOPIC_0000001063680582"></a> # appspawn应用孵化组件<a name="ZH-CN_TOPIC_0000001063680582"></a>
## 小型系统 ## 概述
### 基本概念 ### 功能简介
appspawn被init启动后,向IPC框架注册服务名称,之后等待接收进程间消息,根据消息解析结果启动应用服务并赋予其对应权限。 应用孵化器,负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。
appspawn注册的服务名称为“appspawn”,可通过包含“interfaces/innerkits/include/appspawn_msg.h“头文件,获取服务名称对应的宏APPSPAWN_SOCKET_NAME定义。在安全子系统限制规则下,目前仅Ability Manager Service有权限可以向appspawn发送的进程间消息。 ### 基本概念
appspawn接收的消息为json格式,如下所示: appspawn注册的服务名称为“appspawn”。appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppParameter的结构体,定义路径为:“interfaces/innerkits/include/appspawn_msg.h“。
```
"{"bundleName":"testvalid1","identityID":"1234","uID":1000,"gID":1000,"capability":[0]}" **表 1** 字段说明
``` | 字段名 | 说明 |
| -------- | -------- |
**表 1** 小型系统字段说明 | processName | 即将启动的应用服务进程名,最大256字节。 |
| 字段名 | 说明 | | bundleName | 即将启动的应用程序包名,最大256字节。 |
| -------- | -------- | | soPath | 即应用程序指定的动态库的路径,最大256字节。 |
| bundleName | 即将启动的应用服务进程名,长度≥7字节,≤127字节。 | | uid | 即将启动的应用进程的uid。 |
| identityID | AMS为新进程生成的标识符,由appspawn透传给新进程,长度≥1字节,≤24字节。 | | gid | 即将启动的应用进程的gid。 |
| uID | 即将启动的应用服务进程的uID。 | | gidTable | 即将启动的应用进程组信息,长度由gidCount指定,最大支持64个进程组,必须为正值。 |
| gID | 即将启动的应用服务进程的gID。 | | gidCount | 即将启动的应用进程组个数。 |
| capability | 即将启动的应用服务进程所需的capability权限,数量≤10个。 | | accessTokenId | 即应用进程权限控制的token id。 |
| apl | 即应用进程权限控制的apl,最大32字节. |
## 标准系统 | renderCmd | 即图形图像渲染命令, 最大1024字节。 |
| flags | 即冷启动标志位。 |
### 基本概念<a name="section56901555912"></a> | pid | 即渲染进程pid,查询渲染进程退出状态。 |
| AppOperateType | 即App操作类型,0: 默认状态; 1:获取渲染终止状态。 |
appspawn注册的服务名称为“appspawn”。appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppParameter的结构体,定义路径为:“interfaces/innerkits/include/appspawn_msg.h“。
### 约束与限制
仅限标准系统下使用
**表 2** 标准系统字段说明
| 字段名 | 说明 | ## 开发指导
| -------- | -------- |
| processName | 即将启动的应用服务进程名,最大256字节。 | ### 场景介绍
| bundleName | 即将启动的应用程序包名,最大256字节。 |
| soPath | 即应用程序指定的动态库的路径,最大256字节。 | - 安全控制
| uid | 即将启动的应用进程的uid。 |
| gid | 即将启动的应用进程的gid。 | 支持为app设置SELinux标签。
| gidTable | 即将启动的应用进程组信息,长度由gidCount指定,最大支持64个进程组,必须为正值。 |
| gidCount | 即将启动的应用进程组个数。 | SELinux标签接口代码如下:
| accessTokenId | 即应用进程权限控制的token id。 | ```c++
| apl | 即应用进程权限控制的apl,最大32字节. | AppSpawnClientExt *appProperty = (AppSpawnClientExt *)client;
| renderCmd | 即图形图像渲染命令, 最大1024字节。 | HapContext hapContext;
| flags | 即冷启动标志位。 | ret = hapContext.HapDomainSetcontext(appProperty->property.apl, appProperty->property.processName);
| pid | 即渲染进程pid,查询渲染进程退出状态。 | if (ret != 0) {
| AppOperateType | 即App操作类型,0: 默认状态; 1:获取渲染终止状态。 | APPSPAWN_LOGE("AppSpawnServer::Failed to hap domain set context, errno = %d %s",
errno, appProperty->property.apl);
### 功能简介<a name="section56901555911"></a> } else {
APPSPAWN_LOGI("AppSpawnServer::Success to hap domain set context, ret = %d", ret);
- 安全控制 }
```
支持为app设置SELinux标签。 - 应用进程控制
SELinux标签接口代码如下: - 支持为app设置AccessToken。
```c++ - 支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。
AppSpawnClientExt *appProperty = (AppSpawnClientExt *)client;
HapContext hapContext; AccessToken接口代码如下:
ret = hapContext.HapDomainSetcontext(appProperty->property.apl, appProperty->property.processName); ```
if (ret != 0) { AppSpawnClientExt *appProperty = (AppSpawnClientExt *)client;
APPSPAWN_LOGE("AppSpawnServer::Failed to hap domain set context, errno = %d %s", int32_t ret = SetSelfTokenID(appProperty->property.accessTokenId);
errno, appProperty->property.apl); APPSPAWN_LOGI("AppSpawnServer::set access token id = %d, ret = %d %d", appProperty->property.accessTokenId, ret, getuid());
} else { ```
APPSPAWN_LOGI("AppSpawnServer::Success to hap domain set context, ret = %d", ret);
} - 冷启动
```
- 应用进程控制 支持通过aa命令冷启动应用。
```
- 支持为app设置AccessToken。 param set appspawn.cold.boot true // 打开冷启动开关
- 支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。 aa start -d 12345 -a $name -b $package -C
参考:
AccessToken接口代码如下: aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C
``` ```
AppSpawnClientExt *appProperty = (AppSpawnClientExt *)client;
int32_t ret = SetSelfTokenID(appProperty->property.accessTokenId); - 应用沙盒
APPSPAWN_LOGI("AppSpawnServer::set access token id = %d, ret = %d %d", appProperty->property.accessTokenId, ret, getuid());
``` 应用独立运行于自身沙盒环境。应用沙盒中,只保留应用依赖的库或文件,同时,应用之间数据的也进行隔离。
- 冷启动 ### 接口说明
支持通过aa命令冷启动应用。 接口定义路径: “/interfaces/innerkits/include/client_socket.h“,接口说明参见表2。
``` **表 2** 接口说明
param set appspawn.cold.boot true // 打开冷启动开关 | 接口名 | 说明 |
aa start -d 12345 -a $name -b $package -C | -------- | -------- |
参考: | CreateClient | 创建client。 |
aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C | CloseClient | 关闭client。 |
``` | ConnectSocket | 向appspawn服务发起连接请求。 |
| WriteSocketMessage | 发送消息到appspawn服务。 |
- 应用沙盒 | ReadSocketMessage | 接收来自appspawn服务的消息。 |
应用独立运行于自身沙盒环境。 ### 开发步骤
沙盒配置项: 沙盒配置说明:
1. 应用沙盒的配置入口,在json中配置。
2. 根据应用需要,结合沙盒目录化的规范,在下列三个json文件中,添加应用依赖的目录或文件。 ```json
沙盒配置文件如下: {
```c++ "common" : [{ // 应用沙盒通用挂载项
namespace { "top-sandbox-switch": "ON", // 沙盒总开关 ON: 打开, OFF: 关闭
#ifdef __aarch64__ "app-base" : [{
const std::string APP_JSON_CONFIG("/system/etc/sandbox/appdata-sandbox64.json"); "sandbox-root" : "/mnt/sandbox/<PackageName>", // 沙盒根路径
#else "mount-paths" : [{
const std::string APP_JSON_CONFIG("/system/etc/sandbox/appdata-sandbox.json"); "src-path" : "/config", // mount的源目录
#endif "sandbox-path" : "/config", // 沙盒挂载路径
const std::string PRODUCT_JSON_CONFIG("/system/etc/sandbox/product-sandbox.json"); "sandbox-flags" : [ "bind", "rec" ], // 挂载方式
} "check-action-status": "false" // false 不检查当前项挂载结果, true 检查当前项挂载结果
``` }
沙盒流程: ],
1. 读取/修改沙盒配置文件。 "symbol-links" : [{ // link 的目录项
2. 解析json文件中的配置项。 "target-name" : "/system/bin", // link 的源目录
3. 调用mount与link的函数实现挂载和隔离。 "link-name" : "/bin", // 链接名称
"check-action-status": "false"
json文件中配置项如下: }
```json ]
{ }],
"src-path" : "/sys_prod", // 应用独有配置参考
"sandbox-path" : "/sys_prod", "individual" : [{ // 个别应用单独挂载项
"sandbox-flags" : [ "bind", "rec" ], "com.ohos.medialibrary.MediaLibraryDataA" : [{ // 应用名
"check-action-status": "false" "sandbox-switch": "ON", // ON: 挂载沙盒路径, OFF: 挂载根路径
} "sandbox-root" : "/mnt/sandbox/<PackageName>", // 沙盒根路径
{ "mount-paths" : [{
"target-name" : "/system/bin", "src-path" : "/storage/media/<currentUserId>",
"link-name" : "/bin", "sandbox-path" : "/storage/media",
"check-action-status": "false" "sandbox-flags" : [ "bind", "rec" ],
} "check-action-status": "false"
``` }
],
调用mount与link的函数。即,将src-path挂载至sandbox-path路径下。 "symbol-links" : []
```c++ }]
int SandboxUtils::DoAllMntPointsMount(const ClientSocket::AppProperty *appProperty, nlohmann::json &appConfig); }]
int SandboxUtils::DoAllSymlinkPointslink(const ClientSocket::AppProperty *appProperty, nlohmann::json &appConfig); }
``` ```
### 开发指导<a name="section56901555913"></a>
参考沙盒配置说明,修改配置文件。
接口定义路径: “/interfaces/innerkits/include/client_socket.h“,接口说明参见表3。
- 进入设备下:/system/etc/sandbox/路径下,直接修改对应沙盒配置文件, 重新启动。
#### 接口说明<a name="section56901555914"></a> - 代码路径下:base/startup/appspawn_standard, 修改对应沙盒配置文件。
**表 2** 标准系统接口说明 **表 3** 沙盒配置文件解释
| 接口名 | 说明 |
| -------- | -------- | | 沙盒配置文件 | 解释 |
| CreateClient | 创建client。 | | -------- | -------- |
| CloseClient | 关闭client。 | | appdata-sandbox64.json | 64位系统的沙盒配置 |
| ConnectSocket | 向appspawn服务发起连接请求。 | | appdata-sandbox.json | 32位系统的沙盒配置 |
| WriteSocketMessage | 发送消息到appspawn服务。 | | product-sandbox.json | 应用沙盒的产品差异化配置 |
| ReadSocketMessage | 接收来自appspawn服务的消息。 |
### 开发实例
以launcher应用新增独有配置应用为例:
#### 开发实例<a name="section56901555915"></a> ```c++
"com.ohos.launcher" : [{
接口使用参考: "sandbox-switch": "ON",
```c++ "sandbox-root" : "/mnt/sandbox/<PackageName>",
std::shared_ptr<AppSpawn::ClientSocket> clientSocket = std::make_unique<AppSpawn::ClientSocket>("AppSpawn"); "mount-paths" : [{
if (clientSocket == nullptr) { "src-path" : "/data/app/el1/bundle/public/",
return -1; "sandbox-path" : "/data/bundles/",
} "sandbox-flags" : [ "bind", "rec" ],
if (clientSocket->CreateClient() != ERR_OK) { "check-action-status": "true"
return -1; }
} ],
if (clientSocket->ConnectSocket() != ERR_OK) { "symbol-links" : []
return -1;; }],
} ```
// property 构造AppProperty
clientSocket->WriteSocketMessage((void *)&property, sizeof(AppSpawn::AppProperty)); ## 常见问题
// 读结果
int pid; ### 冷启动应用失败
clientSocket->ReadSocketMessage((void *)&pid, sizeof(pid));
// 如果失败,返回pid小于等于0;否则返回应用的进程id &emsp;**现象描述**
``` <br>&emsp;&emsp;通过aa start -d 12345 -a $name -b $package -C命令冷启动应用, 应用拉起失败。
### 常见问题<a name="section56901555916"></a> &emsp;**解决方法**
<br>&emsp;&emsp;1. 需要设置 param set appspawn.cold.boot true生效。
#### 冷启动应用失败<a name="section56901555917"></a>
&emsp;**现象描述**
<br>&emsp;&emsp;通过命令冷启动应用失败。
&emsp;**解决方法**
<br>&emsp;&emsp;1. 确认是否打开冷启动设置。
<br>&emsp;&emsp;2. 确认冷启动命令是否正确。 <br>&emsp;&emsp;2. 确认冷启动命令是否正确。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册