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)
: 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<RunnerInterface> glueStorage;
std::optional<ExecutableItem> 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);
}

View File

@@ -41,12 +41,12 @@ private:
void remoteStdOut(const QString &output);
void remoteStdErr(const QString &output);
QPointer<ProjectExplorer::Target> 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