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 <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-09-17 18:16:00 +02:00
parent 8daab4886f
commit fdb37a8aa4
2 changed files with 13 additions and 11 deletions

View File

@@ -30,7 +30,6 @@ namespace Android::Internal {
AndroidRunner::AndroidRunner(RunControl *runControl) AndroidRunner::AndroidRunner(RunControl *runControl)
: RunWorker(runControl) : RunWorker(runControl)
, m_target(runControl->target())
{ {
setId("AndroidRunner"); setId("AndroidRunner");
static const int metaTypes[] = { static const int metaTypes[] = {
@@ -46,19 +45,21 @@ AndroidRunner::AndroidRunner(RunControl *runControl)
void AndroidRunner::start() void AndroidRunner::start()
{ {
auto target = runControl()->target();
QTC_ASSERT(target, return);
QString deviceSerialNumber;
int apiLevel = -1;
const Storage<RunnerInterface> glueStorage; const Storage<RunnerInterface> glueStorage;
std::optional<ExecutableItem> avdRecipe; std::optional<ExecutableItem> avdRecipe;
QString deviceSerialNumber; if (!projectExplorerSettings().deployBeforeRun && target->project()) {
int apiLevel = -1;
if (!projectExplorerSettings().deployBeforeRun && m_target && m_target->project()) {
qCDebug(androidRunnerLog) << "Run without deployment"; 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()); AndroidDeviceInfo info = AndroidDevice::androidDeviceInfoFromIDevice(device.get());
AndroidManager::setDeviceSerialNumber(m_target, info.serialNumber); AndroidManager::setDeviceSerialNumber(target, info.serialNumber);
deviceSerialNumber = info.serialNumber; deviceSerialNumber = info.serialNumber;
apiLevel = info.sdk; apiLevel = info.sdk;
qCDebug(androidRunnerLog) << "Android Device Info changed" << deviceSerialNumber qCDebug(androidRunnerLog) << "Android Device Info changed" << deviceSerialNumber
@@ -75,8 +76,8 @@ void AndroidRunner::start()
}); });
} }
} else { } else {
deviceSerialNumber = AndroidManager::deviceSerialNumber(m_target); deviceSerialNumber = AndroidManager::deviceSerialNumber(target);
apiLevel = AndroidManager::deviceApiLevel(m_target); apiLevel = AndroidManager::deviceApiLevel(target);
} }
const auto onSetup = [this, glueStorage, deviceSerialNumber, apiLevel] { const auto onSetup = [this, glueStorage, deviceSerialNumber, apiLevel] {
@@ -100,6 +101,7 @@ void AndroidRunner::start()
runnerRecipe(glueStorage) runnerRecipe(glueStorage)
}; };
m_taskTreeRunner.start(recipe); m_taskTreeRunner.start(recipe);
m_packageName = AndroidManager::packageName(target);
} }
void AndroidRunner::stop() void AndroidRunner::stop()
@@ -108,7 +110,7 @@ void AndroidRunner::stop()
return; return;
emit canceled(); 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); Utils::NormalMessageFormat);
} }

View File

@@ -41,12 +41,12 @@ private:
void remoteStdOut(const QString &output); void remoteStdOut(const QString &output);
void remoteStdErr(const QString &output); void remoteStdErr(const QString &output);
QPointer<ProjectExplorer::Target> m_target;
Utils::Port m_debugServerPort; Utils::Port m_debugServerPort;
QUrl m_qmlServer; QUrl m_qmlServer;
Utils::ProcessHandle m_pid; Utils::ProcessHandle m_pid;
QmlDebug::QmlOutputParser m_outputParser; QmlDebug::QmlOutputParser m_outputParser;
Tasking::TaskTreeRunner m_taskTreeRunner; Tasking::TaskTreeRunner m_taskTreeRunner;
QString m_packageName;
}; };
} // namespace Android::Internal } // namespace Android::Internal