AndroidManager: Use Utils::Process for startAdbProcess()

Change-Id: I675d0103bee854af67d379d08a7e0ddbc6654e8d
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2023-08-08 22:45:36 +02:00
committed by hjk
parent b33b99e2d9
commit 8bdf70e271
4 changed files with 18 additions and 42 deletions

View File

@@ -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<QProcess> p(new QProcess);
std::unique_ptr<Process> 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;

View File

@@ -12,10 +12,6 @@
#include <qtsupport/baseqtversion.h>
#include <projectexplorer/abi.h>
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);

View File

@@ -141,18 +141,6 @@ static void findProcessPIDAndUser(QPromise<PidUserPair> &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}); });
}
}

View File

@@ -12,10 +12,6 @@
#include <QFuture>
#include <utility>
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<Utils::Process> m_adbLogcatProcess;
std::unique_ptr<QProcess, Deleter> m_psIsAlive;
std::unique_ptr<Utils::Process> m_psIsAlive;
QByteArray m_stdoutBuffer;
QByteArray m_stderrBuffer;
QFuture<PidUserPair> m_pidFinder;
@@ -103,7 +98,7 @@ private:
QUrl m_qmlServer;
JDBState m_jdbState = JDBState::Idle;
Utils::Port m_localJdbServerPort;
std::unique_ptr<QProcess, Deleter> m_debugServerProcess; // gdbserver or lldb-server
std::unique_ptr<Utils::Process> m_debugServerProcess; // gdbserver or lldb-server
std::unique_ptr<Utils::Process> m_jdbProcess;
QString m_deviceSerialNumber;
int m_apiLevel = -1;