Android: Add API's to run Android SDK tools

Task-number: QDS-16
Change-Id: Ifea5aa17330833cd130555778134fb8f90e2d990
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Vikas Pachdha
2018-07-03 11:51:28 +02:00
parent 299da01332
commit f19a6e8ac2
2 changed files with 37 additions and 17 deletions

View File

@@ -54,6 +54,7 @@
#include <QDir> #include <QDir>
#include <QFileSystemWatcher> #include <QFileSystemWatcher>
#include <QList> #include <QList>
#include <QLoggingCategory>
#include <QProcess> #include <QProcess>
#include <QRegExp> #include <QRegExp>
#include <QMessageBox> #include <QMessageBox>
@@ -67,6 +68,20 @@ namespace {
const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber"); const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber");
const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel"); const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel");
Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager")
bool runCommand(const QString &executable, const QStringList &args,
QString *output = nullptr, int timeoutS = 30)
{
Utils::SynchronousProcess cmdProc;
cmdProc.setTimeoutS(timeoutS);
qCDebug(androidManagerLog) << executable << args.join(' ');
Utils::SynchronousProcessResponse response = cmdProc.runBlocking(executable, args);
if (output)
*output = response.allOutput();
return response.result == Utils::SynchronousProcessResponse::Finished;
}
} // anonymous namespace } // anonymous namespace
namespace Android { namespace Android {
@@ -364,16 +379,9 @@ void AndroidManager::cleanLibsOnDevice(ProjectExplorer::Target *target)
Core::MessageManager::write(tr("Starting Android virtual device failed.")); Core::MessageManager::write(tr("Starting Android virtual device failed."));
} }
QProcess *process = new QProcess();
QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber); QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber);
arguments << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/tmp/qt"); arguments << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/tmp/qt");
QObject::connect(process, static_cast<void (QProcess::*)(int)>(&QProcess::finished), runAdbCommandDetached(arguments);
process, &QObject::deleteLater);
const QString adb = AndroidConfigurations::currentConfig().adbToolPath().toString();
Core::MessageManager::write(adb + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')));
process->start(adb, arguments);
if (!process->waitForStarted(500))
delete process;
} }
void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const QString &packagePath) void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const QString &packagePath)
@@ -393,17 +401,9 @@ void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const Q
Core::MessageManager::write(tr("Starting Android virtual device failed.")); Core::MessageManager::write(tr("Starting Android virtual device failed."));
} }
QProcess *process = new QProcess();
QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber); QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber);
arguments << QLatin1String("install") << QLatin1String("-r ") << packagePath; arguments << QLatin1String("install") << QLatin1String("-r ") << packagePath;
runAdbCommandDetached(arguments);
connect(process, static_cast<void (QProcess::*)(int)>(&QProcess::finished),
process, &QObject::deleteLater);
const QString adb = AndroidConfigurations::currentConfig().adbToolPath().toString();
Core::MessageManager::write(adb + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')));
process->start(adb, arguments);
if (!process->waitForStarted(500) && process->state() != QProcess::Running)
delete process;
} }
bool AndroidManager::checkKeystorePassword(const QString &keystorePath, const QString &keystorePasswd) bool AndroidManager::checkKeystorePassword(const QString &keystorePath, const QString &keystorePasswd)
@@ -596,4 +596,21 @@ int AndroidManager::findApiLevel(const Utils::FileName &platformPath)
return apiLevel; return apiLevel;
} }
void AndroidManager::runAdbCommandDetached(const QStringList &args)
{
QProcess *process = new QProcess();
connect(process, static_cast<void (QProcess::*)(int)>(&QProcess::finished),
process, &QObject::deleteLater);
const QString adb = AndroidConfigurations::currentConfig().adbToolPath().toString();
qCDebug(androidManagerLog) << adb << args.join(' ');
process->start(adb, args);
if (!process->waitForStarted(500) && process->state() != QProcess::Running)
delete process;
}
bool AndroidManager::runAdbCommand(const QStringList &args, QString *output)
{
return runCommand(AndroidConfigurations::currentConfig().adbToolPath().toString(),
args, output);
}
} // namespace Android } // namespace Android

View File

@@ -87,6 +87,9 @@ public:
static AndroidQtSupport *androidQtSupport(ProjectExplorer::Target *target); static AndroidQtSupport *androidQtSupport(ProjectExplorer::Target *target);
static bool updateGradleProperties(ProjectExplorer::Target *target); static bool updateGradleProperties(ProjectExplorer::Target *target);
static int findApiLevel(const Utils::FileName &platformPath); static int findApiLevel(const Utils::FileName &platformPath);
static void runAdbCommandDetached(const QStringList &args);
static bool runAdbCommand(const QStringList &args, QString *output = nullptr);
}; };
} // namespace Android } // namespace Android