diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index a9639b0b750..9d82d5f7bea 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -264,7 +264,7 @@ FilePath AndroidManager::buildDirectory(const Target *target) if (isQt5CmakeProject(target)) { // Return the main build dir and not the android libs dir const QString libsDir = QString(Constants::ANDROID_BUILD_DIRECTORY) + "/libs"; - Utils::FilePath parentDuildDir = buildDir.parentDir(); + FilePath parentDuildDir = buildDir.parentDir(); if (parentDuildDir.endsWith(libsDir) || libsDir.endsWith(libsDir + "/")) return parentDuildDir.parentDir().parentDir(); } @@ -612,10 +612,10 @@ void AndroidManager::installQASIPackage(Target *target, const FilePath &packageP QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber); arguments << "install" << "-r " << packagePath.path(); QString error; - QProcess *process = startAdbProcess(arguments, &error); + Process *process = startAdbProcess(arguments, &error); if (process) { // TODO: Potential leak when the process is still running on Creator shutdown. - QObject::connect(process, &QProcess::finished, process, &QObject::deleteLater); + QObject::connect(process, &Process::done, process, &QObject::deleteLater); } else { Core::MessageManager::writeDisrupting( Tr::tr("Android package installation failed.\n%1").arg(error)); @@ -671,20 +671,20 @@ bool AndroidManager::checkCertificateExists(const FilePath &keystorePath, return proc.result() == ProcessResult::FinishedWithSuccess; } -QProcess *AndroidManager::startAdbProcess(const QStringList &args, QString *err) +Process *AndroidManager::startAdbProcess(const QStringList &args, QString *err) { - std::unique_ptr p(new QProcess); + std::unique_ptr process(new Process); const FilePath adb = AndroidConfigurations::currentConfig().adbToolPath(); - qCDebug(androidManagerLog).noquote() << "Running command (async):" - << CommandLine(adb, args).toUserOutput(); - p->start(adb.toString(), args); - if (p->waitForStarted(500) && p->state() == QProcess::Running) - return p.release(); + const CommandLine command{adb, args}; + qCDebug(androidManagerLog).noquote() << "Running command (async):" << command.toUserOutput(); + process->setCommand(command); + process->start(); + if (process->waitForStarted(500) && process->state() == QProcess::Running) + return process.release(); - QString errorStr = QString::fromUtf8(p->readAllStandardError()); + const QString errorStr = process->readAllStandardError(); qCDebug(androidManagerLog).noquote() << "Running command (async) failed:" - << CommandLine(adb, args).toUserOutput() - << "Output:" << errorStr; + << command.toUserOutput() << "Output:" << errorStr; if (err) *err = errorStr; return nullptr; diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h index 772f3da5dc9..0d6db5369cd 100644 --- a/src/plugins/android/androidmanager.h +++ b/src/plugins/android/androidmanager.h @@ -12,10 +12,6 @@ #include #include -QT_BEGIN_NAMESPACE -class QProcess; -QT_END_NAMESPACE - namespace ProjectExplorer { class Kit; class Target; @@ -24,6 +20,7 @@ class Target; namespace Utils { class CommandLine; class FilePath; +class Process; } namespace Android { @@ -97,7 +94,7 @@ public: static bool checkCertificateExists(const Utils::FilePath &keystorePath, const QString &keystorePasswd, const QString &alias); - static QProcess *startAdbProcess(const QStringList &args, QString *err = nullptr); + static Utils::Process *startAdbProcess(const QStringList &args, QString *err = nullptr); static SdkToolResult runAdbCommand(const QStringList &args, const QByteArray &writeData = {}, int timeoutS = 30); diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 3dd6182b87a..6be375f30f5 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -141,18 +141,6 @@ static void findProcessPIDAndUser(QPromise &promise, promise.addResult(PidUserPair(processPID, processUser)); } -static void deleter(QProcess *p) -{ - qCDebug(androidRunWorkerLog) << "Killing process:" << p->objectName(); - p->terminate(); - if (!p->waitForFinished(1000)) { - p->kill(); - p->waitForFinished(); - } - // Might get deleted from its own signal handler. - p->deleteLater(); -} - static QString gdbServerArch(const QString &androidAbi) { if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A) @@ -214,11 +202,8 @@ static FilePath debugServer(bool useLldb, const Target *target) return {}; } - AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packageName) : m_packageName(packageName) - , m_psIsAlive(nullptr, deleter) - , m_debugServerProcess(nullptr, deleter) { auto runControl = runner->runControl(); m_useLldb = Debugger::DebuggerKitAspect::engineType(runControl->kit()) @@ -865,8 +850,7 @@ void AndroidRunnerWorker::onProcessIdChanged(PidUserPair pidUser) QTC_ASSERT(m_psIsAlive, return); m_psIsAlive->setObjectName("IsAliveProcess"); m_psIsAlive->setProcessChannelMode(QProcess::MergedChannels); - connect(m_psIsAlive.get(), &QProcess::finished, - this, bind(&AndroidRunnerWorker::onProcessIdChanged, this, PidUserPair(-1, -1))); + connect(m_psIsAlive.get(), &Process::done, this, [this] { onProcessIdChanged({-1, -1}); }); } } diff --git a/src/plugins/android/androidrunnerworker.h b/src/plugins/android/androidrunnerworker.h index d927a7c4ff8..052fe2812cb 100644 --- a/src/plugins/android/androidrunnerworker.h +++ b/src/plugins/android/androidrunnerworker.h @@ -12,10 +12,6 @@ #include #include -QT_BEGIN_NAMESPACE -class QProcess; -QT_END_NAMESPACE - namespace Utils { class FilePath; class Process; @@ -80,7 +76,6 @@ private: Settled }; void onProcessIdChanged(PidUserPair pidUser); - using Deleter = void (*)(QProcess *); // Create the processes and timer in the worker thread, for correct thread affinity bool m_isPreNougat = false; @@ -92,7 +87,7 @@ private: qint64 m_processPID = -1; qint64 m_processUser = -1; std::unique_ptr m_adbLogcatProcess; - std::unique_ptr m_psIsAlive; + std::unique_ptr m_psIsAlive; QByteArray m_stdoutBuffer; QByteArray m_stderrBuffer; QFuture m_pidFinder; @@ -103,7 +98,7 @@ private: QUrl m_qmlServer; JDBState m_jdbState = JDBState::Idle; Utils::Port m_localJdbServerPort; - std::unique_ptr m_debugServerProcess; // gdbserver or lldb-server + std::unique_ptr m_debugServerProcess; // gdbserver or lldb-server std::unique_ptr m_jdbProcess; QString m_deviceSerialNumber; int m_apiLevel = -1;