Flydroid is a self hosted platform for Android emulation.
It uses Nomad as an orchestrator to manage Docker containers provided by Android emulator container scripts. It also provides an API build on top of Nomad to launch and stop virtual devices.
You can create the Nomad job definitions for each of your Android docker images. A template is provided here. You can adapt it to fit your needs.
You can follow these instructions to create the Android docker images that you want to run or use the hosted containers
A template of the Nomad job definition for the API server is provided here You can adapt it to fit your needs.
The REST API can be launch as a Nomad job. You will need to provide the following environment variables:
- NOMAD_URL : the URL of your Nomad instance
- API_KEYS_DB: optional file containing api keys
- NOMAD_DEVICES: a file mapping Flydroid device names to nomad job id
- NOMAD_TOKEN: a Nomad token to access the Nomad API. See [here]() for more information
The nomad token needs the following capabilities :
namespace "default" {
capabilities = ["dispatch-job", "submit-job", "read-job", "list-jobs"]
}
The api keys file contains a list of api keys in this format:
keys = [
"my first api key",
"my second key"
]
The nomad devices file contains a map of Flydroid device names to nomad job id in this format:
devices {
my-device = "my-nomad-job"
android-p = "android-p"
android-q = "android-q"
}
You can then use the Api to start an instance of the my-device
device.
When API keys are enabled, an API key should be provided to API requests by using the X-FLYDROID-KEY
header.
The /start
endpoint is used to start a virtual device.
Method | Path | Accepts | Produces |
---|---|---|---|
POST | /start | application/json | application/json |
Parameters | Description |
---|---|
image | The name of the Android job you want to start |
name | A name for your virtual device |
adbkey | The private key for the adb server |
Sample payload
{
"name": "My Android P device",
"image": "android-p",
"adbkey": "-----BEGIN PRIVATE KEY-----MIIEvgIB cut here mgsAmLrxRRidSLi3P/dl v+ogCZB1BF4B0M/IpdkDMGfO-----END PRIVATE KEY----"
}
Response
The /start
endpoint replies with a Virtual device definition
Field | Description |
---|---|
id | id of the virtual device |
ip | IP address of virtual device |
adbPort | port of the adb service |
consolePort | port of the console service |
grpcPort | port of the grpc service |
Sample Response
{
"id": "ad3d9cf6-0a3b-48bb-aa6a-df4b65e00235",
"ip": "10.0.0.2",
"adbport": 8887,
"consolePort": 8888,
"grpcPort": 8889
}
The /devices/{deviceId}
endpoint or the /devices/by-name/{deviceName}
are used to stop a virtual device.
Method | Path | Accepts | Produces |
---|---|---|---|
DELETE | /devices/{deviceId} | application/json | application/json |
DELETE | /devices/by-name/{deviceName} | application/json | application/json |
Parameters | Description |
---|---|
deviceId | The id of the virtual device to stop |
deviceName | The name of the virtual device to stop |
Response
On successful stop, the endpoint replies with the Virtual device definition of the device stopped.
The /devices/{deviceId}
endpoint can be used to retrieve a virtual device definition.
Method | Path | Accepts | Produces |
---|---|---|---|
GET | /devices/{deviceId} | application/json | application/json |
Parameters | Description |
---|---|
deviceId | The id of the virtual device to stop |
Response
The endpoint replies with the Virtual device definition of the device.