# appspawn Module
## Overview
### Introduction
The appspawn module spawns application processes upon receiving commands from the application framework, configures permissions for new processes, and calls the entry function of the application framework.
### Basic Concepts
**appspawn** is a registered service name. The appspawn process receives requests from the client by listening to messages over the local socket. The message type is an **AppParameter** structure. It is defined in **interfaces/innerkits/include/appspawn_msg.h**.
**Table 1** Field description
| Field| Description|
| -------- | -------- |
| processName | Name of the service process to be started. The value contains a maximum of 256 bytes.|
| bundleName | Bundle name of the application to be started. The value contains a maximum of 256 bytes.|
| soPath | Path of the dynamic library specified by the application. The value contains a maximum of 256 bytes.|
| uid | UID of the application process to be started.|
| gid | GID of the application process to be started.|
| gidTable | Information about the application process group to be started. Its length is specified by **gidCount**. A maximum of 64 process groups are supported. The value must be a positive number.|
| gidCount | Number of application process groups to be started.|
| accessTokenId | Token ID for application process permission control.|
| apl | APL for application process permission control. The value contains a maximum of 32 bytes.|
| renderCmd | Image rendering command. The value contains a maximum of 1024 bytes.|
| flags | Cold start flag.|
| pid | PID of the rendering process, which is used to query the process exit status.|
| AppOperateType | Application operation type. The value **0** means to obtain the default status, and the value **1** means to obtain the rendering termination status.|
### Constraints
The appspawn module is used only for the standard system.
## Development Guidelines
### Use Cases
- Application security control based on SELinux tags
Example code:
```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);
}
```
- Application process control
- Support for setting of AccessToken for applications
- Support for simultaneous stopping of all spawn application processes (after stopping of the appspawn process and before a restart)
Example code:
```
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());
```
- Support for cold start of applications by using the aa command
```
param set startup.appspawn.cold.boot 1 // Enable cold start.
aa start -d 12345 -a $name -b $package -C
Reference command:
aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C
```
- Application sandbox
Applications run independently in their own sandbox environments. In an application sandbox, only necessary libraries or files of applications are retained and data of different applications is isolated.
### Available APIs
The API definitions are provided in **/interfaces/innerkits/include/client_socket.h**. Table 2 is a list of available APIs.
**Table 2** API description
| API| Description|
| -------- | -------- |
| CreateClient | Creates a client.|
| CloseClient | Closes a client.|
| ConnectSocket | Sends a connection request to the appspawn service.|
| WriteSocketMessage | Sends a message to the appspawn service.|
| ReadSocketMessage | Receives a message from the appspawn service.|
### How to Develop
Sandbox configuration description:
```
{
"common" : [{ // Common mount options of the application sandbox
"top-sandbox-switch": "ON", // Application sandbox switch. The value ON means to enable the applicable sandbox, and the value OFF means the opposite.
"app-base" : [{
"sandbox-root" : "/mnt/sandbox/", // Root path of the application sandbox
"mount-paths" : [{
"src-path" : "/config", // Source mount path
"sandbox-path" : "/config", // Sandbox mount path
"sandbox-flags" : [ "bind", "rec" ], // Mount mode
"check-action-status": "false" // Whether to check the mount result. The value true means to check the mount result, and the value false means the opposite.
}
],
"symbol-links" : [{ // Link path
"target-name" : "/system/bin", // Source link path
"link-name" : "/bin", // Link name
"check-action-status": "false"
}
]
}],
// Reference application-specific configuration
"individual" : [{ // Independent mount options of an application
"com.ohos.medialibrary.MediaLibraryDataA" : [{ // Application name
"sandbox-switch": "ON", // Application sandbox switch. The value ON means to enable the applicable sandbox, and the value OFF means the opposite.
"sandbox-root" : "/mnt/sandbox/", // Root path of the application sandbox
"mount-paths" : [{
"src-path" : "/storage/media/",
"sandbox-path" : "/storage/media",
"sandbox-flags" : [ "bind", "rec" ],
"check-action-status": "false"
}
],
"symbol-links" : []
}]
}]
}
```
Modify configuration files by referring to the sandbox configuration description.
- On the device, go to **/system/etc/sandbox/**, modify the sandbox configuration files, and restart the device.
- In the code path, go to **base/startup/appspawn_standard**, and modify the sandbox configuration files.
**Table 3** Description of sandbox configuration files
| Sandbox Configuration File| Description|
| -------- | -------- |
| appdata-sandbox64.json | Sandbox configuration for the 64-bit OS|
| appdata-sandbox.json | Sandbox configuration for the 32-bit OS|
| product-sandbox.json | Product-specific configuration for the application sandbox|
### Development Example
The following is the sample code for adding product-specific configuration for the launcher application:
```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" : []
}],
```
## FAQ
### Cold Start of Applications Failed
**Symptom**
Applications fail to be started by running the cold start command.
**Solution**
1. Enable cold start by setting **param set startup.appspawn.cold.boot 1**.
2. Make sure that the cold start command is correct.