in src/debugger/cordovaDebugSession.ts [1337:1394]
private async resolveAndroidTarget(configArgs: ICordovaLaunchRequestArgs | ICordovaAttachRequestArgs, isAttachScenario: boolean): Promise<AndroidTarget | undefined> {
const adbHelper = new AdbHelper(configArgs.cwd);
const getFirstOnlineAndroidTarget = async (): Promise<AndroidTarget | undefined> => {
const onlineTargets = await adbHelper.getOnlineTargets();
if (onlineTargets.length) {
const firstDevice = onlineTargets[0];
configArgs.target = firstDevice.id;
return AndroidTarget.fromInterface(firstDevice);
}
};
if (configArgs.target) {
const androidEmulatorManager = new AndroidTargetManager(adbHelper);
const isAnyEmulator = configArgs.target.toLowerCase() === TargetType.Emulator;
const isAnyDevice = configArgs.target.toLowerCase() === TargetType.Device;
const isVirtualTarget = await androidEmulatorManager.isVirtualTarget(configArgs.target);
const saveResult = async (target: AndroidTarget): Promise<void> => {
const launchScenariousManager = new LaunchScenariosManager(configArgs.cwd);
if (isAttachScenario) {
// Save the selected target for attach scenario only if there are more then one online target
const onlineDevices = await adbHelper.getOnlineTargets();
if (onlineDevices.filter(device => target.isVirtualTarget === device.isVirtualTarget).length > 1) {
launchScenariousManager.updateLaunchScenario(configArgs, {target: target.name});
}
} else {
launchScenariousManager.updateLaunchScenario(configArgs, {target: target.name});
}
};
await androidEmulatorManager.collectTargets(isVirtualTarget ? TargetType.Emulator : TargetType.Device);
let targetDevice = await androidEmulatorManager.selectAndPrepareTarget(target => {
const conditionForAttachScenario = isAttachScenario ? target.isOnline : true;
const conditionForNotAnyTarget = isAnyEmulator || isAnyDevice ? true : target.name === configArgs.target || target.id === configArgs.target;
const conditionForVirtualTarget = isVirtualTarget === target.isVirtualTarget;
return conditionForVirtualTarget && conditionForNotAnyTarget && conditionForAttachScenario;
});
if (targetDevice) {
if (isAnyEmulator || isAnyDevice) {
await saveResult(targetDevice);
}
configArgs.target = targetDevice.id;
} else if (isAttachScenario && (isAnyEmulator || isAnyDevice)) {
this.outputLogger("Target has not been selected. Trying to use the first online Android device");
targetDevice = await getFirstOnlineAndroidTarget();
}
return targetDevice;
} else {
// If there is no a target in debug config, use the first online device
const targetDevice = await getFirstOnlineAndroidTarget();
if (!targetDevice) {
throw new Error(localize("ThereIsNoAnyOnlineDebuggableDevice", "The 'target' parameter in the debug configuration is undefined, and there are no any online debuggable targets"));
}
return targetDevice;
}
}