in src/utils/android/androidTargetManager.ts [117:176]
protected async launchSimulator(emulatorTarget: IMobileTarget): Promise<AndroidTarget> {
return new Promise<AndroidTarget>((resolve, reject) => {
const emulatorProcess = this.childProcess.spawn(
AndroidTargetManager.EMULATOR_COMMAND,
[AndroidTargetManager.EMULATOR_AVD_START_COMMAND, emulatorTarget.name],
{
detached: true,
},
true,
);
emulatorProcess.outcome.catch(error => {
if (
process.platform == "win32" &&
process.env.SESSIONNAME &&
process.env.SESSIONNAME.toLowerCase().includes("rdp-tcp")
) {
this.logger.log(
localize(
"RDPEmulatorWarning",
"Android emulator was launched from the Windows RDP session, this might lead to failures.",
),
);
}
reject(new Error(`Virtual device launch finished with an exception: ${error}`));
});
emulatorProcess.spawnedProcess.unref();
const rejectTimeout = setTimeout(() => {
cleanup();
reject(new Error(`Virtual device launch finished with an exception: ${localize(
"EmulatorStartWarning",
"Could not start the emulator {0} within {1} seconds.",
emulatorTarget.name,
AndroidTargetManager.EMULATOR_START_TIMEOUT,
)}`));
}, AndroidTargetManager.EMULATOR_START_TIMEOUT * 1000);
const bootCheckInterval = setInterval(async () => {
const connectedDevices = await this.adbHelper.getOnlineTargets();
for (let i = 0; i < connectedDevices.length; i++) {
const onlineAvdName = await this.adbHelper.getAvdNameById(connectedDevices[i].id);
if (onlineAvdName === emulatorTarget.name) {
emulatorTarget.id = connectedDevices[i].id;
emulatorTarget.isOnline = true;
this.logger.log(
localize("EmulatorLaunched", "Launched emulator {0}", emulatorTarget.name),
);
cleanup();
resolve(AndroidTarget.fromInterface(<IDebuggableMobileTarget>emulatorTarget));
break;
}
}
}, 1000);
const cleanup = () => {
clearTimeout(rejectTimeout);
clearInterval(bootCheckInterval);
};
});
}