From 4ca1edc0804315b2661ea81e829b58aeb24797cc Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 21 May 2024 21:11:05 +0200 Subject: [PATCH] Android: Avoid using connectedDevices() in getRunningAvdsSerialNumber() The connectedDevices() constructs the full list of AndroidDeviceInfo with details not needed by getRunningAvdsSerialNumber(). These details were generated by using 2 excessive process runs. Get rid of them, and deliver result as soon as the matching device if found. Change-Id: Idc3d9d3321e471f8eaa0d69287f5e748813fc427 Reviewed-by: Alessandro Portale --- src/plugins/android/androiddevice.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index c5b7b78a80f..6a83548644e 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -633,17 +633,30 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent) QString AndroidDeviceManager::getRunningAvdsSerialNumber(const QString &name) const { - for (const AndroidDeviceInfo &dev : AndroidConfig::connectedDevices()) { - if (!dev.serialNumber.startsWith("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; - const QString stdOut = emulatorName(dev.serialNumber); + + const QString serialNumber = line.left(line.indexOf('\t')).trimmed(); + if (!serialNumber.startsWith("emulator")) + continue; + + const QString stdOut = emulatorName(serialNumber); if (stdOut.isEmpty()) continue; // Not an avd - const QStringList outputLines = stdOut.split('\n'); - if (outputLines.size() > 1 && outputLines.first() == name) - return dev.serialNumber; - } + if (stdOut.left(stdOut.indexOf('\n')) == name) + return serialNumber; + } return {}; }