From fdb37a8aa40ecf9cf4cc32f7341dd74ba31ba12a Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 17 Sep 2024 18:16:00 +0200 Subject: [PATCH] Android: Store the packageName in AndroidRunner Since the stop() method may be called after the targets are deleted, store the packageName instead of a pointer to the running target. This fixes a possible crash on shutdown while the android app is still running. Change-Id: Ic290752de59fea05a0f16247c50df6303cd986d2 Reviewed-by: Alessandro Portale --- src/plugins/android/androidrunner.cpp | 22 ++++++++++++---------- src/plugins/android/androidrunner.h | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 8b908eaf059..a2bcf780b71 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -30,7 +30,6 @@ namespace Android::Internal { AndroidRunner::AndroidRunner(RunControl *runControl) : RunWorker(runControl) - , m_target(runControl->target()) { setId("AndroidRunner"); static const int metaTypes[] = { @@ -46,19 +45,21 @@ AndroidRunner::AndroidRunner(RunControl *runControl) void AndroidRunner::start() { + auto target = runControl()->target(); + QTC_ASSERT(target, return); + QString deviceSerialNumber; + int apiLevel = -1; + const Storage glueStorage; std::optional avdRecipe; - QString deviceSerialNumber; - int apiLevel = -1; - - if (!projectExplorerSettings().deployBeforeRun && m_target && m_target->project()) { + if (!projectExplorerSettings().deployBeforeRun && target->project()) { qCDebug(androidRunnerLog) << "Run without deployment"; - const IDevice::ConstPtr device = DeviceKitAspect::device(m_target->kit()); + const IDevice::ConstPtr device = DeviceKitAspect::device(target->kit()); AndroidDeviceInfo info = AndroidDevice::androidDeviceInfoFromIDevice(device.get()); - AndroidManager::setDeviceSerialNumber(m_target, info.serialNumber); + AndroidManager::setDeviceSerialNumber(target, info.serialNumber); deviceSerialNumber = info.serialNumber; apiLevel = info.sdk; qCDebug(androidRunnerLog) << "Android Device Info changed" << deviceSerialNumber @@ -75,8 +76,8 @@ void AndroidRunner::start() }); } } else { - deviceSerialNumber = AndroidManager::deviceSerialNumber(m_target); - apiLevel = AndroidManager::deviceApiLevel(m_target); + deviceSerialNumber = AndroidManager::deviceSerialNumber(target); + apiLevel = AndroidManager::deviceApiLevel(target); } const auto onSetup = [this, glueStorage, deviceSerialNumber, apiLevel] { @@ -100,6 +101,7 @@ void AndroidRunner::start() runnerRecipe(glueStorage) }; m_taskTreeRunner.start(recipe); + m_packageName = AndroidManager::packageName(target); } void AndroidRunner::stop() @@ -108,7 +110,7 @@ void AndroidRunner::stop() return; emit canceled(); - appendMessage("\n\n" + Tr::tr("\"%1\" terminated.").arg(AndroidManager::packageName(m_target)), + appendMessage("\n\n" + Tr::tr("\"%1\" terminated.").arg(m_packageName), Utils::NormalMessageFormat); } diff --git a/src/plugins/android/androidrunner.h b/src/plugins/android/androidrunner.h index b5ac68c4a9a..0a6d6a0fedf 100644 --- a/src/plugins/android/androidrunner.h +++ b/src/plugins/android/androidrunner.h @@ -41,12 +41,12 @@ private: void remoteStdOut(const QString &output); void remoteStdErr(const QString &output); - QPointer m_target; Utils::Port m_debugServerPort; QUrl m_qmlServer; Utils::ProcessHandle m_pid; QmlDebug::QmlOutputParser m_outputParser; Tasking::TaskTreeRunner m_taskTreeRunner; + QString m_packageName; }; } // namespace Android::Internal