1# appspawn标准系统应用孵化组件<a name="ZH-CN_TOPIC_0000001063680582"></a> 2 3## 概述<a name="section56901555910"></a> 4 5appspawn被init启动后,等待接收进程间消息,根据消息内容启动应用服务并赋予其对应权限。 6 7### 功能简介<a name="section56901555911"></a> 8 9- 安全控制 10 <br>   支持为app设置SELinux标签。 11 12- 应用进程控制 13 14 - 支持为app设置AccessToken。 15 - 支持重启前,appspawn停止后,可同时停止所有已孵化的app进程。 16 17- 冷启动 18 <br>   支持应用通过aa命令冷启动应用。 19 20 ``` 21 param set appspawn.cold.boot true // 打开冷启动状态 22 aa start -d 12345 -a $name -b $package -C 23 参考: 24 aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C 25 26### 基本概念<a name="section56901555912"></a> 27 28appspawn注册的服务名称为“appspawn”, appspawn 通过监听本地socket,接收来自客户端的请求消息。消息类型为AppProperty的结构体, 定义路径为:“base/startup/appspawn_standard/interfaces/innerkits/include/sclient_socket.h“。 29 30**表 1** 字段说明 31 32<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> 33</th> 34<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> 35</th> 36</tr> 37</thead> 38<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> 39</td> 40<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> 41</td> 42</tr> 43<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> 44</td> 45<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> 46</td> 47</tr> 48<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> 49</td> 50<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> 51</td> 52</tr> 53<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> 54</td> 55<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> 56</td> 57</tr> 58<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> 59</td> 60<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> 61</td> 62</tr> 63<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> 64</td> 65<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> 66</td> 67</tr> 68<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> 69</td> 70<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> 71</td> 72</tr> 73<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> 74</td> 75<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> 76</td> 77</tr> 78<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> 79</td> 80<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> 81</td> 82</tr> 83</tbody> 84</table> 85 86## 开发指导<a name="section56901555913"></a> 87 88 接口定义路径: “base/startup/appspawn_standard/interfaces/innerkits/include/client_socket.h“,表 2为接口说明。 89 90### 接口说明<a name="section56901555914"></a> 91 92**表 2** 字段说明 93<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> 94</th> 95<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> 96</th> 97</tr> 98</thead> 99<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> 100</td> 101<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> 102</td> 103</tr> 104<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> 105</td> 106<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> 107</td> 108</tr> 109<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> 110</td> 111<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> 112</td> 113</tr> 114<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> 115</td> 116<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> 117</td> 118</tr> 119<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> 120</td> 121<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> 122</td> 123</tr> 124</tbody> 125</table> 126 127### 开发实例<a name="section56901555915"></a> 128 129<br>   接口使用参考方式: 130``` 131 std::shared_ptr<AppSpawn::ClientSocket> clientSocket = std::make_unique<AppSpawn::ClientSocket>("AppSpawn"); 132 if (clientSocket == nullptr) { 133 return -1; 134 } 135 if (clientSocket->CreateClient() != ERR_OK) { 136 return -1; 137 } 138 if (clientSocket->ConnectSocket() != ERR_OK) { 139 return -1;; 140 } 141 // property 构造AppProperty 142 clientSocket->WriteSocketMessage((void *)&property, sizeof(AppSpawn::AppProperty)); 143 // 读结果 144 int pid; 145 clientSocket->ReadSocketMessage((void *)&pid, sizeof(pid)); 146 // 如果失败,返回pid如果小于等于0,则错误,否则返回应用的进程id 147``` 148 149## 常见问题<a name="section56901555916"></a> 150 151### 冷启动失败<a name="section56901555917"></a> 152 153   **现象描述** 154 <br>     通过命令冷启动应用失败 155 156   **解决方法** 157 <br>     1. 确认是否打开冷启动设置 158 <br>     2. 确认冷启动命令是否正确