diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 5524043b620..7538282690e 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -621,7 +621,7 @@ QVector AndroidConfigurations::androidVirtualDevices() const QString AndroidConfigurations::startAVD(const QString &name, int apiLevel, QString cpuAbi) const { - if (startAVDAsync(name)) + if (findAvd(apiLevel, cpuAbi) || startAVDAsync(name)) return waitForAvd(apiLevel, cpuAbi); return QString(); } @@ -643,6 +643,21 @@ bool AndroidConfigurations::startAVDAsync(const QString &avdName) const return true; } +bool AndroidConfigurations::findAvd(int apiLevel, const QString &cpuAbi) const +{ + QVector devices = connectedDevices(); + foreach (AndroidDeviceInfo device, devices) { + if (!device.serialNumber.startsWith(QLatin1String("emulator"))) + continue; + if (!device.cpuAbi.contains(cpuAbi)) + continue; + if (device.sdk != apiLevel) + continue; + return true; + } + return false; +} + QString AndroidConfigurations::waitForAvd(int apiLevel, const QString &cpuAbi) const { // we cannot use adb -e wait-for-device, since that doesn't work if a emulator is already running diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 64d7e080684..38af17330fe 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -106,6 +106,7 @@ public: QVector androidVirtualDevices() const; QString startAVD(const QString &name, int apiLevel, QString cpuAbi) const; bool startAVDAsync(const QString &avdName) const; + bool findAvd(int apiLevel, const QString &cpuAbi) const; QString waitForAvd(int apiLevel, const QString &cpuAbi) const; QString bestNdkPlatformMatch(const QString &targetAPI) const; diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 349af217347..405f317ef50 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -287,7 +287,8 @@ bool AndroidDeployQtStep::init() if (!result) return false; - AndroidConfigurations::instance().startAVDAsync(m_avdName); + if (!AndroidConfigurations::instance().findAvd(m_deviceAPILevel, m_targetArch)) + AndroidConfigurations::instance().startAVDAsync(m_avdName); return true; } diff --git a/src/plugins/android/androiddeploystep.cpp b/src/plugins/android/androiddeploystep.cpp index 3fadfce5fe8..d8264898d87 100644 --- a/src/plugins/android/androiddeploystep.cpp +++ b/src/plugins/android/androiddeploystep.cpp @@ -389,7 +389,8 @@ void AndroidDeployStep::deployFiles(QProcess *process, const QList & bool AndroidDeployStep::deployPackage() { if (!m_avdName.isEmpty()) { - if (!AndroidConfigurations::instance().startAVDAsync(m_avdName)) + if (!AndroidConfigurations::instance().findAvd(m_deviceAPILevel, m_targetArch) + && !AndroidConfigurations::instance().startAVDAsync(m_avdName)) return false; m_deviceSerialNumber = AndroidConfigurations::instance().waitForAvd(m_deviceAPILevel, m_targetArch); }