in lib/cmds/start.ts [269:313]
function startAndroid(
outputDir: string, sdk: Binary, avds: string[], useSnapshots: boolean, port: number,
stdio: string): void {
let sdkPath = path.resolve(outputDir, sdk.executableFilename());
if (avds[0] == 'all') {
avds = <string[]>require(path.resolve(sdkPath, 'available_avds.json'));
} else if (avds[0] == 'none') {
avds.length = 0;
}
const minAVDPort = 5554;
const maxAVDPort = 5586 - 2 * avds.length;
if (avds.length && ((port < minAVDPort) || (port > maxAVDPort))) {
throw new RangeError(
'AVD Port must be between ' + minAVDPort + ' and ' + maxAVDPort + ' to emulate ' +
avds.length + ' android devices');
}
avds.forEach((avd: string, i: number) => {
// Credit to appium-ci, which this code was adapted from
let emuBin = 'emulator'; // TODO(sjelin): get the 64bit linux version working
let emuArgs = [
'-avd',
avd + '-v' + sdk.versionCustom + '-wd-manager',
'-netfast',
];
let portArg: number = null;
if (!useSnapshots) {
emuArgs = emuArgs.concat(['-no-snapshot-load', '-no-snapshot-save']);
}
if (port) {
portArg = port + i * 2;
emuArgs = emuArgs.concat(['-port', '' + portArg]);
}
if (emuBin !== 'emulator') {
emuArgs = emuArgs.concat(['-qemu', '-enable-kvm']);
}
logger.info(
'Starting ' + avd + ' on ' + (portArg == null ? 'default port' : 'port ' + portArg));
let child = spawn(path.resolve(sdkPath, 'tools', emuBin), emuArgs, stdio);
child.on('error', (error: Error) => {
logger.warn(avd + ' encountered an error: ' + error);
});
androidProcesses.push(child);
androidActiveAVDs.push(avd);
});
}