Android: Delay creation of AndroidRunnerWorker

Pass device serial number and api level directly to the c'tor.

Change-Id: I16c16e1f599714383e5e4bd7f41875889e156276
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-08-16 10:52:04 +02:00
parent ccd0e7a88f
commit 2ceed53503
4 changed files with 43 additions and 38 deletions

View File

@@ -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<QString> 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

View File

@@ -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);

View File

@@ -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<CommandLine::ArgRef> args) const
{
CommandLine cmd{AndroidConfig::adbToolPath(), args};

View File

@@ -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();