From 6e4d829a409a8d2561ad0e8773ad5cd7cc64bbc1 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Tue, 21 Sep 2021 21:40:27 +0300 Subject: [PATCH] Android: handle return correct serialNumber for a running avd AVDs don't get a serial number until they are started, and avdmanager don't make it easy to get their serial either, so we need to check the running devices with adb "emu avd name" command and compare. Change-Id: I3253d25a3461a36eb9918b3c796062bf9e82e0c6 Reviewed-by: hjk --- src/plugins/android/androidconfigurations.cpp | 28 +++++++++++++++++-- src/plugins/android/androidconfigurations.h | 1 + src/plugins/android/androiddevice.cpp | 6 +++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 5a09199c9de..38396d21de0 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -712,15 +712,37 @@ QString AndroidConfig::getAvdName(const QString &serialnumber) return QString::fromLatin1(name).trimmed(); } +static SdkToolResult emulatorNameAdbCommand(const QString &serialNumber) +{ + QStringList args = AndroidDeviceInfo::adbSelector(serialNumber); + args.append({"emu", "avd", "name"}); + return AndroidManager::runAdbCommand(args); +} + +QString AndroidConfig::getRunningAvdsSerialNumber(const QString &name) const +{ + for (const AndroidDeviceInfo &dev : connectedDevices()) { + if (!dev.serialNumber.startsWith("emulator")) + continue; + SdkToolResult result = emulatorNameAdbCommand(dev.serialNumber); + const QString stdOut = result.stdOut(); + if (stdOut.isEmpty()) + continue; // Not an avd + const QStringList outputLines = stdOut.split('\n'); + if (outputLines.size() > 1 && outputLines.first() == name) + return dev.serialNumber; + } + + return {}; +} + QStringList AndroidConfig::getRunningAvdsFromDevices(const QVector &devs) { QStringList runningDevs; for (const AndroidDeviceInfo &dev : devs) { if (!dev.serialNumber.startsWith("emulator")) continue; - QStringList args = AndroidDeviceInfo::adbSelector(dev.serialNumber); - args.append({"emu", "avd", "name"}); - SdkToolResult result = AndroidManager::runAdbCommand(args); + SdkToolResult result = emulatorNameAdbCommand(dev.serialNumber); const QString stdOut = result.stdOut(); if (stdOut.isEmpty()) continue; // Not an avd diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index db65168896e..54017219032 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -174,6 +174,7 @@ public: static Utils::FilePath getJdkPath(); static QStringList getAbis(const Utils::FilePath &adbToolPath, const QString &device); + QString getRunningAvdsSerialNumber(const QString &name) const; static QStringList getRunningAvdsFromDevices(const QVector &devs); private: diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 04d2e43281e..ea4ddbf8e16 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -334,7 +334,11 @@ bool AndroidDevice::isValid() const QString AndroidDevice::serialNumber() const { - return extraData(Constants::AndroidSerialNumber).toString(); + const QString serialNumber = extraData(Constants::AndroidSerialNumber).toString(); + if (machineType() == Hardware) + return serialNumber; + + return AndroidConfigurations::currentConfig().getRunningAvdsSerialNumber(avdName()); } QString AndroidDevice::avdName() const