From 2ceed535030b0cf71c310531eef460c329b47675 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 16 Aug 2024 10:52:04 +0200 Subject: [PATCH] Android: Delay creation of AndroidRunnerWorker Pass device serial number and api level directly to the c'tor. Change-Id: I16c16e1f599714383e5e4bd7f41875889e156276 Reviewed-by: Alessandro Portale --- src/plugins/android/androidrunner.cpp | 59 +++++++++++++-------- src/plugins/android/androidrunner.h | 3 +- src/plugins/android/androidrunnerworker.cpp | 15 ++---- src/plugins/android/androidrunnerworker.h | 4 +- 4 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 39b4fa391e1..00ed796e1df 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -40,27 +40,8 @@ AndroidRunner::AndroidRunner(RunControl *runControl) }; Q_UNUSED(metaTypes) - m_worker = new AndroidRunnerWorker(this); - m_worker->moveToThread(&m_thread); - QObject::connect(&m_thread, &QThread::finished, m_worker, &QObject::deleteLater); - - connect(this, &AndroidRunner::asyncStart, m_worker, &AndroidRunnerWorker::asyncStart); - connect(this, &AndroidRunner::asyncStop, m_worker, &AndroidRunnerWorker::asyncStop); - connect(this, &AndroidRunner::androidDeviceInfoChanged, - m_worker, &AndroidRunnerWorker::setAndroidDeviceInfo); - - connect(m_worker, &AndroidRunnerWorker::remoteProcessStarted, - this, &AndroidRunner::handleRemoteProcessStarted); - connect(m_worker, &AndroidRunnerWorker::remoteProcessFinished, - this, &AndroidRunner::handleRemoteProcessFinished); - connect(m_worker, &AndroidRunnerWorker::remoteOutput, this, &AndroidRunner::remoteOutput); - connect(m_worker, &AndroidRunnerWorker::remoteErrorOutput, - this, &AndroidRunner::remoteErrorOutput); - connect(&m_outputParser, &QmlDebug::QmlOutputParser::waitingForConnectionOnPort, this, &AndroidRunner::qmlServerPortReady); - - m_thread.start(); } AndroidRunner::~AndroidRunner() @@ -71,13 +52,19 @@ AndroidRunner::~AndroidRunner() void AndroidRunner::start() { + QString deviceSerialNumber; + int apiLevel = -1; + if (!projectExplorerSettings().deployBeforeRun && m_target && m_target->project()) { qCDebug(androidRunnerLog) << "Run without deployment"; const IDevice::ConstPtr device = DeviceKitAspect::device(m_target->kit()); AndroidDeviceInfo info = AndroidDevice::androidDeviceInfoFromIDevice(device.get()); AndroidManager::setDeviceSerialNumber(m_target, info.serialNumber); - emit androidDeviceInfoChanged(info); + deviceSerialNumber = info.serialNumber; + apiLevel = info.sdk; + qCDebug(androidRunnerLog) << "Android Device Info changed" << deviceSerialNumber + << apiLevel; if (!info.avdName.isEmpty()) { const Storage serialNumberStorage; @@ -87,14 +74,17 @@ void AndroidRunner::start() AndroidAvdManager::startAvdRecipe(info.avdName, serialNumberStorage) }; - m_startAvdRunner.start(recipe, {}, [this](DoneWith result) { + m_startAvdRunner.start(recipe, {}, [this, deviceSerialNumber, apiLevel](DoneWith result) { if (result == DoneWith::Success) - emit asyncStart(); + startImpl(deviceSerialNumber, apiLevel); }); return; } + } else { + deviceSerialNumber = AndroidManager::deviceSerialNumber(m_target); + apiLevel = AndroidManager::deviceApiLevel(m_target); } - emit asyncStart(); + startImpl(deviceSerialNumber, apiLevel); } void AndroidRunner::stop() @@ -108,6 +98,29 @@ void AndroidRunner::stop() emit asyncStop(); } +void AndroidRunner::startImpl(const QString &deviceSerialNumber, int apiLevel) +{ + if (m_worker) + m_worker->deleteLater(); + + m_worker = new AndroidRunnerWorker(this, deviceSerialNumber, apiLevel); + m_worker->moveToThread(&m_thread); + QObject::connect(&m_thread, &QThread::finished, m_worker, &QObject::deleteLater); + + connect(this, &AndroidRunner::asyncStop, m_worker, &AndroidRunnerWorker::asyncStop); + + connect(m_worker, &AndroidRunnerWorker::remoteProcessStarted, + this, &AndroidRunner::handleRemoteProcessStarted); + connect(m_worker, &AndroidRunnerWorker::remoteProcessFinished, + this, &AndroidRunner::handleRemoteProcessFinished); + connect(m_worker, &AndroidRunnerWorker::remoteOutput, this, &AndroidRunner::remoteOutput); + connect(m_worker, &AndroidRunnerWorker::remoteErrorOutput, + this, &AndroidRunner::remoteErrorOutput); + + m_thread.start(); + QMetaObject::invokeMethod(m_worker, &AndroidRunnerWorker::asyncStart); +} + void AndroidRunner::qmlServerPortReady(Port port) { // FIXME: Note that the passed is nonsense, as the port is on the diff --git a/src/plugins/android/androidrunner.h b/src/plugins/android/androidrunner.h index 5549719bfb3..e439becc897 100644 --- a/src/plugins/android/androidrunner.h +++ b/src/plugins/android/androidrunner.h @@ -34,13 +34,12 @@ public: void stop() override; signals: - void asyncStart(); void asyncStop(); void qmlServerReady(const QUrl &serverUrl); - void androidDeviceInfoChanged(const Android::AndroidDeviceInfo &deviceInfo); void avdDetected(); private: + void startImpl(const QString &deviceSerialNumber, int apiLevel); void qmlServerPortReady(Utils::Port port); void remoteOutput(const QString &output); void remoteErrorOutput(const QString &output); diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index b38b74aa9c4..ad973b0cf2a 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -130,7 +130,8 @@ static FilePath debugServer(bool useLldb, const Target *target) return {}; } -AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner) +AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &deviceSerialNumber, + int apiLevel) { auto runControl = runner->runControl(); m_useLldb = Debugger::DebuggerKitAspect::engineType(runControl->kit()) @@ -162,8 +163,8 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner) auto target = runControl->target(); m_packageName = AndroidManager::packageName(target); m_intentName = m_packageName + '/' + AndroidManager::activityName(target); - m_deviceSerialNumber = AndroidManager::deviceSerialNumber(target); - m_apiLevel = AndroidManager::deviceApiLevel(target); + m_deviceSerialNumber = deviceSerialNumber; + m_apiLevel = apiLevel; qCDebug(androidRunWorkerLog) << "Intent name:" << m_intentName << "Package name:" << m_packageName; qCDebug(androidRunWorkerLog) << "Device API:" << m_apiLevel; @@ -224,14 +225,6 @@ QStringList AndroidRunnerWorker::selector() const return AndroidDeviceInfo::adbSelector(m_deviceSerialNumber); } -void AndroidRunnerWorker::setAndroidDeviceInfo(const AndroidDeviceInfo &info) -{ - m_deviceSerialNumber = info.serialNumber; - m_apiLevel = info.sdk; - qCDebug(androidRunWorkerLog) << "Android Device Info changed" - << m_deviceSerialNumber << m_apiLevel; -} - CommandLine AndroidRunnerWorker::adbCommand(std::initializer_list args) const { CommandLine cmd{AndroidConfig::adbToolPath(), args}; diff --git a/src/plugins/android/androidrunnerworker.h b/src/plugins/android/androidrunnerworker.h index 4e26f7d0b4b..585ba5eff29 100644 --- a/src/plugins/android/androidrunnerworker.h +++ b/src/plugins/android/androidrunnerworker.h @@ -21,10 +21,10 @@ class AndroidRunnerWorker : public QObject { Q_OBJECT public: - AndroidRunnerWorker(ProjectExplorer::RunWorker *runner); + AndroidRunnerWorker(ProjectExplorer::RunWorker *runner, const QString &deviceSerialNumber, + int apiLevel); ~AndroidRunnerWorker() override; - void setAndroidDeviceInfo(const AndroidDeviceInfo &info); void asyncStart(); void asyncStop();