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  **现象描述** 169 <br>  通过命令冷启动应用, 应用拉起失败。 170 171  **解决方法** 172 <br>  1. 需要设置 param set startup.appspawn.cold.boot 1生效。 173 <br>  2. 确认冷启动命令是否正确。