forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user