Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
45e81eec
D
Docs
项目概览
OpenHarmony
/
Docs
大约 2 年 前同步成功
通知
161
Star
293
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
45e81eec
编写于
6月 13, 2022
作者:
O
openharmony_ci
提交者:
Gitee
6月 13, 2022
浏览文件
操作
浏览文件
下载
差异文件
!4211 Fix: 修改Appspawn 开发指南
Merge pull request !4211 from Mupceet/doc_0523
上级
a31fb7d8
80dd5487
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
141 addition
and
229 deletion
+141
-229
zh-cn/device-dev/subsystems/Readme-CN.md
zh-cn/device-dev/subsystems/Readme-CN.md
+0
-1
zh-cn/device-dev/subsystems/subsys-boot-appspawn-standard.md
zh-cn/device-dev/subsystems/subsys-boot-appspawn-standard.md
+0
-158
zh-cn/device-dev/subsystems/subsys-boot-appspawn.md
zh-cn/device-dev/subsystems/subsys-boot-appspawn.md
+141
-70
未找到文件。
zh-cn/device-dev/subsystems/Readme-CN.md
浏览文件 @
45e81eec
...
...
@@ -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
)
...
...
zh-cn/device-dev/subsystems/subsys-boot-appspawn-standard.md
已删除
100644 → 0
浏览文件 @
a31fb7d8
# appspawn标准系统应用孵化组件<a name="ZH-CN_TOPIC_0000001063680582"></a>
## 概述<a name="section56901555910"></a>
appspawn被init启动后,等待接收进程间消息,根据消息内容启动应用服务并赋予其对应权限。
### 功能简介<a name="section56901555911"></a>
-
安全控制
<br>
 
支持为app设置SELinux标签。
-
应用进程控制
-
支持为app设置AccessToken。
-
支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。
-
冷启动
<br>
 
支持通过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
### 基本概念<a name="section56901555912"></a>
appspawn注册的服务名称为“appspawn”。appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppProperty的结构体,定义路径为:“base/startup/appspawn_standard/interfaces/innerkits/include/sclient_socket.h“。
**表 1** 字段说明
<table><thead align="left"><tr id="row6650142913713"><th class="cellrowborder" valign="top" width="39.489999999999995%" id="mcps1.2.3.1.1"><p id="p17650112914379"><a name="p17650112914379"></a><a name="p17650112914379"></a>字段名</p>
</th>
<th class="cellrowborder" valign="top" width="60.51%" id="mcps1.2.3.1.2"><p id="p865032916376"><a name="p865032916376"></a><a name="p865032916376"></a>说明</p>
</th>
</tr>
</thead>
<tbody><tr id="row36506298373"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p76501029113715"><a name="p76501029113715"></a><a name="p76501029113715"></a>processName</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p2650329183715"><a name="p2650329183715"></a><a name="p2650329183715"></a>即将启动的应用服务进程名,最大256字节。</p>
</td>
</tr>
<tr id="row36506298373"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p76501029113715"><a name="p76501029113715"></a><a name="p76501029113715"></a>bundleName</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p2650329183715"><a name="p2650329183715"></a><a name="p2650329183715"></a>即将启动的应用程序包名,最大256字节。</p>
</td>
</tr>
<tr id="row86501129183712"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p2065010298379"><a name="p2065010298379"></a><a name="p2065010298379"></a>soPath</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p13650192963715"><a name="p13650192963715"></a><a name="p13650192963715"></a>应用程序指定的动态库的路径,最大256字节。</p>
</td>
</tr>
<tr id="row13650329103719"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p16501292377"><a name="p16501292377"></a><a name="p16501292377"></a>uid</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p186503291371"><a name="p186503291371"></a><a name="p186503291371"></a>即将启动的应用进程的uid,必须为正值。</p>
</td>
</tr>
<tr id="row187625816314"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p188771758833"><a name="p188771758833"></a><a name="p188771758833"></a>gid</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p187716587310"><a name="p187716587310"></a><a name="p187716587310"></a>即将启动的应用进程的gid,必须为正值。</p>
</td>
</tr>
<tr id="row187625816314"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p188771758833"><a name="p188771758833"></a><a name="p188771758833"></a>gidTable</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p187716587310"><a name="p187716587310"></a><a name="p187716587310"></a>即将启动的应用进程组信息,长度由gidCount指定,最大支持64个进程组,必须为正值。</p>
</td>
</tr>
<tr id="row187625816314"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p188771758833"><a name="p188771758833"></a><a name="p188771758833"></a>gidCount</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p187716587310"><a name="p187716587310"></a><a name="p187716587310"></a>即将启动的应用进程组个数。</p>
</td>
</tr>
<tr id="row106508294373"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p16501829183715"><a name="p16501829183715"></a><a name="p16501829183715"></a>accessTokenId</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p11650182953717"><a name="p11650182953717"></a><a name="p11650182953717"></a>应用进程权限控制的token id。</p>
</td>
</tr>
<tr id="row106508294373"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p16501829183715"><a name="p16501829183715"></a><a name="p16501829183715"></a>apl</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p11650182953717"><a name="p11650182953717"></a><a name="p11650182953717"></a>应用进程权限控制的apl,最大32字节。</p>
</td>
</tr>
</tbody>
</table>
## 开发指导<a name="section56901555913"></a>
接口定义路径: “base/startup/appspawn_standard/interfaces/innerkits/include/client_socket.h“,表 2为接口说明。
### 接口说明<a name="section56901555914"></a>
**表 2** 接口说明
<table><thead align="left"><tr id="row6650142913713"><th class="cellrowborder" valign="top" width="39.489999999999995%" id="mcps1.2.3.1.1"><p id="p17650112914379"><a name="p17650112914379"></a><a name="p17650112914379"></a>接口名</p>
</th>
<th class="cellrowborder" valign="top" width="60.51%" id="mcps1.2.3.1.2"><p id="p865032916376"><a name="p865032916376"></a><a name="p865032916376"></a>说明</p>
</th>
</tr>
</thead>
<tbody><tr id="row36506298373"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p76501029113715"><a name="p76501029113715"></a><a name="p76501029113715"></a>CreateClient</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p2650329183715"><a name="p2650329183715"></a><a name="p2650329183715"></a>创建client。</p>
</td>
</tr>
<tr id="row36506298373"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p76501029113715"><a name="p76501029113715"></a><a name="p76501029113715"></a>CloseClient</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p2650329183715"><a name="p2650329183715"></a><a name="p2650329183715"></a>关闭client。</p>
</td>
</tr>
<tr id="row86501129183712"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p2065010298379"><a name="p2065010298379"></a><a name="p2065010298379"></a>ConnectSocket</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p13650192963715"><a name="p13650192963715"></a><a name="p13650192963715"></a>向appspawn服务发起连接请求。</p>
</td>
</tr>
<tr id="row13650329103719"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p16501292377"><a name="p16501292377"></a><a name="p16501292377"></a>WriteSocketMessage</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p186503291371"><a name="p186503291371"></a><a name="p186503291371"></a>发送消息到appspawn服务。</p>
</td>
</tr>
<tr id="row187625816314"><td class="cellrowborder" valign="top" width="39.489999999999995%" headers="mcps1.2.3.1.1 "><p id="p188771758833"><a name="p188771758833"></a><a name="p188771758833"></a>ReadSocketMessage</p>
</td>
<td class="cellrowborder" valign="top" width="60.51%" headers="mcps1.2.3.1.2 "><p id="p187716587310"><a name="p187716587310"></a><a name="p187716587310"></a>接收来自appspawn服务的消息。</p>
</td>
</tr>
</tbody>
</table>
### 开发实例<a name="section56901555915"></a>
<br>   接口使用参考:
```
std::shared_ptr
<AppSpawn::ClientSocket>
clientSocket = std::make_unique
<AppSpawn::ClientSocket>
("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
```
## 常见问题<a name="section56901555916"></a>
### 冷启动应用失败<a name="section56901555917"></a>
  **现象描述**
<br>     通过命令冷启动应用失败。
  **解决方法**
<br>     1. 确认是否打开冷启动设置。
<br>     2. 确认冷启动命令是否正确。
\ No newline at end of file
zh-cn/device-dev/subsystems/subsys-boot-appspawn.md
100755 → 100644
浏览文件 @
45e81eec
# appspawn应用孵化组件
# appspawn应用孵化组件<a name="ZH-CN_TOPIC_0000001063680582"></a>
## 概述
appspawn被init启动后,等待接收进程间消息,根据消息内容启动应用服务并赋予其对应权限。
### 功能简介
应用孵化器,负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。
##
功能简介
##
# 基本概念
-
安全控制
<br
/>
支持为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:获取渲染终止状态。 |
-
冷启动
<br
/>
支持应用通过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<AppSpawn::ClientSocket> clientSocket = std::make_unique<AppSpawn::ClientSocket>("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/<PackageName>", // 沙盒根路径
"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/<PackageName>", // 沙盒根路径
"mount-paths" : [{
"src-path" : "/storage/media/<currentUserId>",
"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/<PackageName>"
,
"mount-paths"
:
[{
"src-path"
:
"/data/app/el1/bundle/public/"
,
"sandbox-path"
:
"/data/bundles/"
,
"sandbox-flags"
:
[
"bind"
,
"rec"
],
"check-action-status"
:
"true"
}
],
"symbol-links"
:
[]
}],
```
## 常见问题
### 冷启动应用失败
**现象描述**
通过命令冷启动应用失败。
**解决方法**
1.
确认是否打开冷启动设置。
 
**现象描述**
<br>
  
通过命令冷启动应用, 应用拉起失败。
2.
确认冷启动命令是否正确。
 
**解决方法**
<br>
  
1. 需要设置 param set appspawn.cold.boot true生效。
<br>
  
2. 确认冷启动命令是否正确。
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录