Android: Fix a crash on Creator shutdown during app startup

The AndroidRunnerWorker lives in a separate thread created
by AndroidRunner. Thus, we can't delete it directly from
the AndroidRunner's d'tor. Instead, we connect to QThread's
finished() signal and delete the worker later.

Make m_pidRunner a child of AndroidRunnerWorker so that
it's moved together with its parent to the other thread.

Change-Id: I5c3723315ee5183fa8451f0706311b14f173dca1
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-07-11 15:52:28 +02:00
parent 77fa73c524
commit eca1fa3b2f
3 changed files with 12 additions and 10 deletions

View File

@@ -54,23 +54,24 @@ AndroidRunner::AndroidRunner(RunControl *runControl, const QString &intentName)
const int apiLevel = AndroidManager::deviceApiLevel(m_target); const int apiLevel = AndroidManager::deviceApiLevel(m_target);
qCDebug(androidRunnerLog) << "Device API:" << apiLevel; qCDebug(androidRunnerLog) << "Device API:" << apiLevel;
m_worker.reset(new AndroidRunnerWorker(this, m_packageName)); m_worker = new AndroidRunnerWorker(this, m_packageName);
m_worker->setIntentName(intent); m_worker->setIntentName(intent);
m_worker->setIsPreNougat(apiLevel <= 23); m_worker->setIsPreNougat(apiLevel <= 23);
m_worker->moveToThread(&m_thread); m_worker->moveToThread(&m_thread);
QObject::connect(&m_thread, &QThread::finished, m_worker, &QObject::deleteLater);
connect(this, &AndroidRunner::asyncStart, m_worker.data(), &AndroidRunnerWorker::asyncStart); connect(this, &AndroidRunner::asyncStart, m_worker, &AndroidRunnerWorker::asyncStart);
connect(this, &AndroidRunner::asyncStop, m_worker.data(), &AndroidRunnerWorker::asyncStop); connect(this, &AndroidRunner::asyncStop, m_worker, &AndroidRunnerWorker::asyncStop);
connect(this, &AndroidRunner::androidDeviceInfoChanged, connect(this, &AndroidRunner::androidDeviceInfoChanged,
m_worker.data(), &AndroidRunnerWorker::setAndroidDeviceInfo); m_worker, &AndroidRunnerWorker::setAndroidDeviceInfo);
connect(m_worker.data(), &AndroidRunnerWorker::remoteProcessStarted,
connect(m_worker, &AndroidRunnerWorker::remoteProcessStarted,
this, &AndroidRunner::handleRemoteProcessStarted); this, &AndroidRunner::handleRemoteProcessStarted);
connect(m_worker.data(), &AndroidRunnerWorker::remoteProcessFinished, connect(m_worker, &AndroidRunnerWorker::remoteProcessFinished,
this, &AndroidRunner::handleRemoteProcessFinished); this, &AndroidRunner::handleRemoteProcessFinished);
connect(m_worker.data(), &AndroidRunnerWorker::remoteOutput, connect(m_worker, &AndroidRunnerWorker::remoteOutput, this, &AndroidRunner::remoteOutput);
this, &AndroidRunner::remoteOutput); connect(m_worker, &AndroidRunnerWorker::remoteErrorOutput,
connect(m_worker.data(), &AndroidRunnerWorker::remoteErrorOutput,
this, &AndroidRunner::remoteErrorOutput); this, &AndroidRunner::remoteErrorOutput);
connect(&m_outputParser, &QmlDebug::QmlOutputParser::waitingForConnectionOnPort, connect(&m_outputParser, &QmlDebug::QmlOutputParser::waitingForConnectionOnPort,

View File

@@ -56,7 +56,7 @@ private:
QString m_launchedAVDName; QString m_launchedAVDName;
QThread m_thread; QThread m_thread;
QTimer m_checkAVDTimer; QTimer m_checkAVDTimer;
QScopedPointer<AndroidRunnerWorker> m_worker; AndroidRunnerWorker *m_worker = nullptr;
QPointer<ProjectExplorer::Target> m_target; QPointer<ProjectExplorer::Target> m_target;
Utils::Port m_debugServerPort; Utils::Port m_debugServerPort;
QUrl m_qmlServer; QUrl m_qmlServer;

View File

@@ -203,6 +203,7 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa
QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(target->kit()); QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(target->kit());
m_useAppParamsForQmlDebugger = version->qtVersion() >= QVersionNumber(5, 12); m_useAppParamsForQmlDebugger = version->qtVersion() >= QVersionNumber(5, 12);
m_pidRunner.setParent(this); // Move m_pidRunner object together with *this into a separate thread.
} }
AndroidRunnerWorker::~AndroidRunnerWorker() AndroidRunnerWorker::~AndroidRunnerWorker()