diff --git a/zh-cn/device-dev/subsystems/Readme-CN.md b/zh-cn/device-dev/subsystems/Readme-CN.md index 3b3aa42e9da22e017b01026e9173c3cf6ef6e636..8d551b413db9c2e802086313237791348b352084 100755 --- a/zh-cn/device-dev/subsystems/Readme-CN.md +++ b/zh-cn/device-dev/subsystems/Readme-CN.md @@ -76,7 +76,6 @@ - [启动恢复子系统概述](subsys-boot-overview.md) - [init启动引导组件](subsys-boot-init.md) - [appspawn应用孵化组件](subsys-boot-appspawn.md) - - [appspawn标准系统应用孵化组件](subsys-boot-appspawn-standard.md) - [bootstrap服务启动组件](subsys-boot-bootstrap.md) - [syspara系统属性组件](subsys-boot-syspara.md) - [常见问题](subsys-boot-faqs.md) diff --git a/zh-cn/device-dev/subsystems/subsys-boot-appspawn-standard.md b/zh-cn/device-dev/subsystems/subsys-boot-appspawn-standard.md deleted file mode 100644 index 8627bbf296b63d1bf48bca8df4d796eb168cd2cb..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/subsystems/subsys-boot-appspawn-standard.md +++ /dev/null @@ -1,158 +0,0 @@ -# appspawn标准系统应用孵化组件 - -## 概述 - -appspawn被init启动后,等待接收进程间消息,根据消息内容启动应用服务并赋予其对应权限。 - -### 功能简介 - -- 安全控制 -
  支持为app设置SELinux标签。 - -- 应用进程控制 - - - 支持为app设置AccessToken。 - - 支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。 - -- 冷启动 -
  支持通过aa命令冷启动应用。 - - ``` - param set appspawn.cold.boot true // 打开冷启动开关 - aa start -d 12345 -a $name -b $package -C - 参考: - aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C - -### 基本概念 - -appspawn注册的服务名称为“appspawn”。appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppProperty的结构体,定义路径为:“base/startup/appspawn_standard/interfaces/innerkits/include/sclient_socket.h“。 - -**表 1** 字段说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

字段名

-

说明

-

processName

-

即将启动的应用服务进程名,最大256字节。

-

bundleName

-

即将启动的应用程序包名,最大256字节。

-

soPath

-

应用程序指定的动态库的路径,最大256字节。

-

uid

-

即将启动的应用进程的uid,必须为正值。

-

gid

-

即将启动的应用进程的gid,必须为正值。

-

gidTable

-

即将启动的应用进程组信息,长度由gidCount指定,最大支持64个进程组,必须为正值。

-

gidCount

-

即将启动的应用进程组个数。

-

accessTokenId

-

应用进程权限控制的token id。

-

apl

-

应用进程权限控制的apl,最大32字节。

-
- -## 开发指导 - - 接口定义路径: “base/startup/appspawn_standard/interfaces/innerkits/include/client_socket.h“,表 2为接口说明。 - -### 接口说明 - -**表 2** 接口说明 - - - - - - - - - - - - - - - - - - - - -

接口名

-

说明

-

CreateClient

-

创建client。

-

CloseClient

-

关闭client。

-

ConnectSocket

-

向appspawn服务发起连接请求。

-

WriteSocketMessage

-

发送消息到appspawn服务。

-

ReadSocketMessage

-

接收来自appspawn服务的消息。

-
- -### 开发实例 - -
  接口使用参考: -``` - std::shared_ptr clientSocket = std::make_unique("AppSpawn"); - if (clientSocket == nullptr) { - return -1; - } - if (clientSocket->CreateClient() != ERR_OK) { - return -1; - } - if (clientSocket->ConnectSocket() != ERR_OK) { - return -1;; - } - // property 构造AppProperty - clientSocket->WriteSocketMessage((void *)&property, sizeof(AppSpawn::AppProperty)); - // 读结果 - int pid; - clientSocket->ReadSocketMessage((void *)&pid, sizeof(pid)); - // 如果失败,返回pid小于等于0;否则返回应用的进程id -``` - -## 常见问题 - -### 冷启动应用失败 - -   **现象描述** -
    通过命令冷启动应用失败。 - -   **解决方法** -
    1. 确认是否打开冷启动设置。 -
    2. 确认冷启动命令是否正确。 \ No newline at end of file diff --git a/zh-cn/device-dev/subsystems/subsys-boot-appspawn.md b/zh-cn/device-dev/subsystems/subsys-boot-appspawn.md old mode 100755 new mode 100644 index 0ac9b5c98ceab59faee82e1cad7b9d41af04cf08..af4475084178f129cbce95daf5822d9e2b281db7 --- a/zh-cn/device-dev/subsystems/subsys-boot-appspawn.md +++ b/zh-cn/device-dev/subsystems/subsys-boot-appspawn.md @@ -1,102 +1,173 @@ -# appspawn应用孵化组件 - +# appspawn应用孵化组件 ## 概述 -appspawn被init启动后,等待接收进程间消息,根据消息内容启动应用服务并赋予其对应权限。 +### 功能简介 + 应用孵化器,负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。 -## 功能简介 +### 基本概念 -- 安全控制
  支持为app设置SELinux标签。 + appspawn注册的服务名称为“appspawn”。appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppParameter的结构体,定义路径为:“interfaces/innerkits/include/appspawn_msg.h“。 -- 应用进程控制 - - 支持为app设置AccessToken。 - - 支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。 + **表 1** 字段说明 + | 字段名 | 说明 | + | -------- | -------- | + | processName | 即将启动的应用服务进程名,最大256字节。 | + | bundleName | 即将启动的应用程序包名,最大256字节。 | + | soPath | 即应用程序指定的动态库的路径,最大256字节。 | + | uid | 即将启动的应用进程的uid。 | + | gid | 即将启动的应用进程的gid。 | + | gidTable | 即将启动的应用进程组信息,长度由gidCount指定,最大支持64个进程组,必须为正值。 | + | gidCount | 即将启动的应用进程组个数。 | + | accessTokenId | 即应用进程权限控制的token id。 | + | apl | 即应用进程权限控制的apl,最大32字节. | + | renderCmd | 即图形图像渲染命令, 最大1024字节。 | + | flags | 即冷启动标志位。 | + | pid | 即渲染进程pid,查询渲染进程退出状态。 | + | AppOperateType | 即App操作类型,0: 默认状态; 1:获取渲染终止状态。 | -- 冷启动
支持应用通过aa命令冷启动应用。 - - ``` - param set appspawn.cold.boot true // 打开冷启动开关 - aa start -d 12345 -a $name -b $package -C - 参考命令: - aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C - ``` +### 约束与限制 +仅限标准系统下使用 +## 开发指导 -## 基本概念 +### 场景介绍 -appspawn注册的服务名称为“appspawn”。appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppProperty的结构体,定义路径为:“base/startup/appspawn_standard/interfaces/innerkits/include/sclient_socket.h”。 +- 安全控制 - **表1** 字段说明 + 支持为app设置SELinux标签。 -| 字段名 | 说明 | -| -------- | -------- | -| processName | 即将启动的应用服务进程名,最大256字节。 | -| bundleName | 即将启动的应用程序包名,最大256字节。 | -| soPath | 应用程序指定的动态库的路径,最大256字节。 | -| uid | 即将启动的应用进程的uid,必须为正值。 | -| gid | 即将启动的应用进程的gid,必须为正值。 | -| gidTable | 即将启动的应用进程组信息,长度由gidCount指定,最大支持64个进程组,必须为正值。 | -| gidCount | 即将启动的应用进程组个数。 | -| accessTokenId | 应用进程权限控制的token id。 | -| apl | 应用进程权限控制的apl,最大32字节。 | + SELinux标签接口代码如下: + ```c++ + AppSpawnClientExt *appProperty = (AppSpawnClientExt *)client; + HapContext hapContext; + ret = hapContext.HapDomainSetcontext(appProperty->property.apl, appProperty->property.processName); + if (ret != 0) { + APPSPAWN_LOGE("AppSpawnServer::Failed to hap domain set context, errno = %d %s", + errno, appProperty->property.apl); + } else { + APPSPAWN_LOGI("AppSpawnServer::Success to hap domain set context, ret = %d", ret); + } + ``` +- 应用进程控制 + - 支持为app设置AccessToken。 + - 支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。 -## 开发指导 + AccessToken接口代码如下: + ``` + 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()); + ``` -接口定义路径: “base/startup/appspawn_standard/interfaces/innerkits/include/client_socket.h”,表 2为接口说明。 +- 冷启动 + 支持通过aa命令冷启动应用。 + ``` + param set appspawn.cold.boot true // 打开冷启动开关 + aa start -d 12345 -a $name -b $package -C + 参考: + aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C + ``` -### 接口说明 +- 应用沙盒 - **表2** 接口说明 + 应用独立运行于自身沙盒环境。应用沙盒中,只保留应用依赖的库或文件,同时,应用之间数据的也进行隔离。 -| 接口名 | 说明 | -| -------- | -------- | -| CreateClient | 创建client。 | -| CloseClient | 关闭client。 | -| ConnectSocket | 向appspawn服务发起连接请求。 | -| WriteSocketMessage | 发送消息到appspawn服务。 | -| ReadSocketMessage | 接收来自appspawn服务的消息。 | +### 接口说明 + 接口定义路径: “/interfaces/innerkits/include/client_socket.h“,接口说明参见表2。 -## 开发实例 + **表 2** 接口说明 + | 接口名 | 说明 | + | -------- | -------- | + | CreateClient | 创建client。 | + | CloseClient | 关闭client。 | + | ConnectSocket | 向appspawn服务发起连接请求。 | + | WriteSocketMessage | 发送消息到appspawn服务。 | + | ReadSocketMessage | 接收来自appspawn服务的消息。 | -接口使用参考: +### 开发步骤 - -``` -std::shared_ptr clientSocket = std::make_unique("AppSpawn"); - if (clientSocket == nullptr) { - return -1; - } - if (clientSocket->CreateClient() != ERR_OK) { - return -1; - } - if (clientSocket->ConnectSocket() != ERR_OK) { - return -1;; + 沙盒配置说明: + + ``` + { + "common" : [{ // 应用沙盒通用挂载项 + "top-sandbox-switch": "ON", // 沙盒总开关 ON: 打开, OFF: 关闭 + "app-base" : [{ + "sandbox-root" : "/mnt/sandbox/", // 沙盒根路径 + "mount-paths" : [{ + "src-path" : "/config", // mount的源目录 + "sandbox-path" : "/config", // 沙盒挂载路径 + "sandbox-flags" : [ "bind", "rec" ], // 挂载方式 + "check-action-status": "false" // false 不检查当前项挂载结果, true: 检查当前项挂载结果 + } + ], + "symbol-links" : [{ // link 的目录项 + "target-name" : "/system/bin", // link 的源目录 + "link-name" : "/bin", // 链接名称 + "check-action-status": "false" + } + ] + }], + // 应用独有配置参考 + "individual" : [{ // 个别应用单独挂载项 + "com.ohos.medialibrary.MediaLibraryDataA" : [{ // 应用名 + "sandbox-switch": "ON", // ON: 挂载沙盒路径, OFF: 挂载根路径 + "sandbox-root" : "/mnt/sandbox/", // 沙盒根路径 + "mount-paths" : [{ + "src-path" : "/storage/media/", + "sandbox-path" : "/storage/media", + "sandbox-flags" : [ "bind", "rec" ], + "check-action-status": "false" + } + ], + "symbol-links" : [] + }] + }] } - // property 构造AppProperty - clientSocket->WriteSocketMessage((void *)&property, sizeof(AppSpawn::AppProperty)); - // 读结果 - int pid; - clientSocket->ReadSocketMessage((void *)&pid, sizeof(pid)); - // 如果失败,返回pid小于等于0;否则返回应用的进程id -``` + ``` + 参考沙盒配置说明,修改配置文件。 + + - 进入设备下:/system/etc/sandbox/路径下,直接修改对应沙盒配置文件, 重新启动。 + - 代码路径下:base/startup/appspawn_standard, 修改对应沙盒配置文件。 + + **表 3** 沙盒配置文件解释 + + | 沙盒配置文件 | 解释 | + | -------- | -------- | + | appdata-sandbox64.json | 64位系统的沙盒配置 | + | appdata-sandbox.json | 32位系统的沙盒配置 | + | product-sandbox.json | 应用沙盒的产品差异化配置 | + +### 开发实例 +以launcher应用新增独有配置应用为例: + ```c++ + "com.ohos.launcher" : [{ + "sandbox-switch": "ON", + "sandbox-root" : "/mnt/sandbox/", + "mount-paths" : [{ + "src-path" : "/data/app/el1/bundle/public/", + "sandbox-path" : "/data/bundles/", + "sandbox-flags" : [ "bind", "rec" ], + "check-action-status": "true" + } + ], + "symbol-links" : [] + }], + ``` ## 常见问题 - ### 冷启动应用失败 -**现象描述** - -通过命令冷启动应用失败。 - -**解决方法** - -1. 确认是否打开冷启动设置。 +  **现象描述** +
  通过命令冷启动应用, 应用拉起失败。 -2. 确认冷启动命令是否正确。 +  **解决方法** +
  1. 需要设置 param set appspawn.cold.boot true生效。 +
  2. 确认冷启动命令是否正确。 \ No newline at end of file