function startAndroid()

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);
  });
}