diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index 38cfa2cdbf8..ded1c5fe160 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -89,12 +89,25 @@ bool startAvdAsync(const QString &avdName) QString findAvd(const QString &avdName) { - const QList devices = AndroidConfig::connectedDevices(); - for (const AndroidDeviceInfo &device : devices) { - if (device.type != ProjectExplorer::IDevice::Emulator) + Process adbProcess; + adbProcess.setCommand({AndroidConfig::adbToolPath(), {"devices"}}); + adbProcess.runBlocking(); + if (adbProcess.result() != ProcessResult::FinishedWithSuccess) + return {}; + + // mid(1) - remove "List of devices attached" header line + const QStringList lines = adbProcess.allOutput().split('\n', Qt::SkipEmptyParts).mid(1); + for (const QString &line : lines) { + // skip the daemon logs + if (line.startsWith("* daemon")) continue; - if (device.avdName == avdName) - return device.serialNumber; + + const QString serialNumber = line.left(line.indexOf('\t')).trimmed(); + if (!serialNumber.startsWith("emulator")) + continue; + + if (AndroidConfig::getAvdName(serialNumber) == avdName) + return serialNumber; } return {}; } diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index db284270804..97f31550c50 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -141,33 +141,6 @@ static QString buildToolsPackageMarker() return QLatin1String(Constants::buildToolsPackageName) + ";"; } -static QString getAvdName(const QString &serialnumber) -{ - const int index = serialnumber.indexOf(QLatin1String("-")); - if (index == -1) - return {}; - bool ok; - const int port = serialnumber.mid(index + 1).toInt(&ok); - if (!ok) - return {}; - - QTcpSocket tcpSocket; - tcpSocket.connectToHost(QHostAddress(QHostAddress::LocalHost), port); - if (!tcpSocket.waitForConnected(100)) // Don't wait more than 100ms for a local connection - return {}; - - tcpSocket.write("avd name\nexit\n"); - tcpSocket.waitForDisconnected(500); - - const QByteArrayList response = tcpSocket.readAll().split('\n'); - // The input "avd name" might not be echoed as-is, but contain ASCII control sequences. - for (int i = response.size() - 1; i > 1; --i) { - if (response.at(i).startsWith("OK")) - return QString::fromLatin1(response.at(i - 1)).trimmed(); - } - return {}; -} - static QString getDeviceProperty(const QString &device, const QString &property) { // workaround for '????????????' serial numbers @@ -311,6 +284,33 @@ static FilePath ndkSubPathFromQtVersion(const QtVersion &version) // AndroidConfig ////////////////////////////////// +QString getAvdName(const QString &serialnumber) +{ + const int index = serialnumber.indexOf(QLatin1String("-")); + if (index == -1) + return {}; + bool ok; + const int port = serialnumber.mid(index + 1).toInt(&ok); + if (!ok) + return {}; + + QTcpSocket tcpSocket; + tcpSocket.connectToHost(QHostAddress(QHostAddress::LocalHost), port); + if (!tcpSocket.waitForConnected(100)) // Don't wait more than 100ms for a local connection + return {}; + + tcpSocket.write("avd name\nexit\n"); + tcpSocket.waitForDisconnected(500); + + const QByteArrayList response = tcpSocket.readAll().split('\n'); + // The input "avd name" might not be echoed as-is, but contain ASCII control sequences. + for (int i = response.size() - 1; i > 1; --i) { + if (response.at(i).startsWith("OK")) + return QString::fromLatin1(response.at(i - 1)).trimmed(); + } + return {}; +} + QLatin1String displayName(const Abi &abi) { switch (abi.architecture()) { diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index ca7825cf03e..ec3a441ed32 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -38,6 +38,7 @@ public: namespace AndroidConfig { +QString getAvdName(const QString &serialnumber); QStringList apiLevelNamesFor(const SdkPlatformList &platforms); QString apiLevelNameFor(const SdkPlatform *platform);