• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# appspawn应用孵化组件<a name="ZH-CN_TOPIC_0000001063680582"></a>
2
3## 概述
4
5### 功能简介
6
7  应用孵化器,负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。
8
9### 基本概念
10
11  appspawn注册的服务名称为“appspawn”。appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppParameter的结构体,定义路径为:“interfaces/innerkits/include/appspawn_msg.h“。
12
13  **表 1**  字段说明
14  | 字段名 | 说明 |
15  | -------- | -------- |
16  | processName | 即将启动的应用服务进程名,最大256字节。 |
17  | bundleName | 即将启动的应用程序包名,最大256字节。 |
18  | soPath | 即应用程序指定的动态库的路径,最大256字节。 |
19  | uid | 即将启动的应用进程的uid。 |
20  | gid | 即将启动的应用进程的gid。 |
21  | gidTable | 即将启动的应用进程组信息,长度由gidCount指定,最大支持64个进程组,必须为正值。 |
22  | gidCount | 即将启动的应用进程组个数。 |
23  | accessTokenId | 即应用进程权限控制的token id。 |
24  | apl | 即应用进程权限控制的apl,最大32字节. |
25  | renderCmd | 即图形图像渲染命令, 最大1024字节。 |
26  | flags | 即冷启动标志位。 |
27  | pid | 即渲染进程pid,查询渲染进程退出状态。 |
28  | AppOperateType | 即App操作类型,0: 默认状态; 1:获取渲染终止状态。 |
29
30### 约束与限制
31仅限标准系统下使用
32
33## 开发指导
34
35### 场景介绍
36
37- 安全控制
38
39  支持为app设置SELinux标签。
40
41  SELinux标签接口代码如下:
42    ```c++
43    AppSpawnClientExt *appProperty = (AppSpawnClientExt *)client;
44    HapContext hapContext;
45    ret = hapContext.HapDomainSetcontext(appProperty->property.apl, appProperty->property.processName);
46    if (ret != 0) {
47        APPSPAWN_LOGE("AppSpawnServer::Failed to hap domain set context, errno = %d %s",
48            errno, appProperty->property.apl);
49    } else {
50        APPSPAWN_LOGI("AppSpawnServer::Success to hap domain set context, ret = %d", ret);
51    }
52    ```
53- 应用进程控制
54
55  - 支持为app设置AccessToken。
56  - 支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。
57
58  AccessToken接口代码如下:
59    ```
60    AppSpawnClientExt *appProperty = (AppSpawnClientExt *)client;
61    int32_t ret = SetSelfTokenID(appProperty->property.accessTokenId);
62    APPSPAWN_LOGI("AppSpawnServer::set access token id = %d, ret = %d %d", appProperty->property.accessTokenId, ret, getuid());
63    ```
64
65- 冷启动
66
67  支持通过aa命令冷启动应用。
68    ```
69    param set startup.appspawn.cold.boot 1 // 打开冷启动开关
70    aa start -d 12345 -a $name -b $package -C
71    参考:
72    aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C
73    ```
74
75- 应用沙盒
76
77  应用独立运行于自身沙盒环境。应用沙盒中,只保留应用依赖的库或文件,同时,应用之间数据的也进行隔离。
78
79### 接口说明
80
81  接口定义路径: “/interfaces/innerkits/include/client_socket.h“,接口说明参见表2。
82
83  **表 2**  接口说明
84  | 接口名 | 说明 |
85  | -------- | -------- |
86  | CreateClient | 创建client。 |
87  | CloseClient | 关闭client。 |
88  | ConnectSocket | 向appspawn服务发起连接请求。 |
89  | WriteSocketMessage | 发送消息到appspawn服务。 |
90  | ReadSocketMessage | 接收来自appspawn服务的消息。 |
91
92### 开发步骤
93
94  沙盒配置说明:
95
96  ```
97    {
98        "common" : [{                                           // 应用沙盒通用挂载项
99            "top-sandbox-switch": "ON",                         // 沙盒总开关 ON: 打开, OFF: 关闭
100            "app-base" : [{
101                "sandbox-root" : "/mnt/sandbox/<PackageName>",  // 沙盒根路径
102                "mount-paths" : [{
103                        "src-path" : "/config",                 // mount的源目录
104                        "sandbox-path" : "/config",             // 沙盒挂载路径
105                        "sandbox-flags" : [ "bind", "rec" ],    // 挂载方式
106                        "check-action-status": "false"          // false 不检查当前项挂载结果, true: 检查当前项挂载结果
107                    }
108                ],
109                "symbol-links" : [{                             // link 的目录项
110                        "target-name" : "/system/bin",          // link 的源目录
111                        "link-name" : "/bin",                   // 链接名称
112                        "check-action-status": "false"
113                    }
114                ]
115            }],
116        // 应用独有配置参考
117        "individual" : [{                                        // 个别应用单独挂载项
118            "com.ohos.medialibrary.MediaLibraryDataA" : [{       // 应用名
119                "sandbox-switch": "ON",                          // ON: 挂载沙盒路径, OFF: 挂载根路径
120                "sandbox-root" : "/mnt/sandbox/<PackageName>",   // 沙盒根路径
121                "mount-paths" : [{
122                        "src-path" : "/storage/media/<currentUserId>",
123                        "sandbox-path" : "/storage/media",
124                        "sandbox-flags" : [ "bind", "rec" ],
125                        "check-action-status": "false"
126                    }
127                ],
128                "symbol-links" : []
129            }]
130        }]
131    }
132  ```
133
134   参考沙盒配置说明,修改配置文件。
135
136   - 进入设备下:/system/etc/sandbox/路径下,直接修改对应沙盒配置文件, 重新启动。
137   - 代码路径下:base/startup/appspawn_standard, 修改对应沙盒配置文件。
138
139  **表 3**  沙盒配置文件解释
140
141  | 沙盒配置文件 | 解释 |
142  | -------- | -------- |
143  | appdata-sandbox64.json | 64位系统的沙盒配置 |
144  | appdata-sandbox.json | 32位系统的沙盒配置 |
145  | product-sandbox.json  | 应用沙盒的产品差异化配置 |
146
147### 开发实例
148以launcher应用新增独有配置应用为例:
149  ```c++
150  "com.ohos.launcher" : [{
151      "sandbox-switch": "ON",
152      "sandbox-root" : "/mnt/sandbox/<PackageName>",
153      "mount-paths" : [{
154              "src-path" : "/data/app/el1/bundle/public/",
155              "sandbox-path" : "/data/bundles/",
156              "sandbox-flags" : [ "bind", "rec" ],
157              "check-action-status": "true"
158          }
159      ],
160      "symbol-links" : []
161  }],
162  ```
163
164## 常见问题
165
166### 冷启动应用失败
167
168   &emsp;**现象描述**
169   <br>&emsp;&emsp;通过命令冷启动应用, 应用拉起失败。
170
171   &emsp;**解决方法**
172    <br>&emsp;&emsp;1. 需要设置 param set startup.appspawn.cold.boot 1生效。
173    <br>&emsp;&emsp;2. 确认冷启动命令是否正确。