Android: Support the extraenvvars and extraappparams options

The Qt/Android runtime does support passing parameters to the
application. We have to pass '-e extraappparams <base64 string>' and
'-e extraenvvars <base64 strings, concatenated by ";">'. This is very
handy and should actually be exposed in the GUI.

Change-Id: I8c84a53ab8f6f07ea5b6e01c902f53385df8b35f
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
This commit is contained in:
Ulf Hermann
2018-01-30 18:28:23 +01:00
parent 9771333f9f
commit 6a964d8d0b
9 changed files with 49 additions and 12 deletions

View File

@@ -93,11 +93,13 @@ static QString toNdkArch(const QString &arch)
return QLatin1String("arch-") + arch;
}
AndroidDebugSupport::AndroidDebugSupport(RunControl *runControl)
AndroidDebugSupport::AndroidDebugSupport(RunControl *runControl, const QString &intentName,
const QString &extraAppParams,
const Utils::Environment &extraEnvVars)
: Debugger::DebuggerRunTool(runControl)
{
setDisplayName("AndroidDebugger");
m_runner = new AndroidRunner(runControl);
m_runner = new AndroidRunner(runControl, intentName, extraAppParams, extraEnvVars);
addStartDependency(m_runner);
}

View File

@@ -36,7 +36,10 @@ class AndroidDebugSupport : public Debugger::DebuggerRunTool
Q_OBJECT
public:
AndroidDebugSupport(ProjectExplorer::RunControl *runControl);
AndroidDebugSupport(ProjectExplorer::RunControl *runControl,
const QString &intentName = QString(),
const QString &extraAppParams = QString(),
const Utils::Environment &extraEnvVars = Utils::Environment());
void start() override;
void stop() override;

View File

@@ -31,12 +31,14 @@ using namespace ProjectExplorer;
namespace Android {
namespace Internal {
AndroidQmlToolingSupport::AndroidQmlToolingSupport(RunControl *runControl)
AndroidQmlToolingSupport::AndroidQmlToolingSupport(
RunControl *runControl, const QString &intentName, const QString &extraAppParams,
const Utils::Environment &extraEnvVars)
: RunWorker(runControl)
{
setDisplayName("AndroidQmlToolingSupport");
auto runner = new AndroidRunner(runControl);
auto runner = new AndroidRunner(runControl, intentName, extraAppParams, extraEnvVars);
addStartDependency(runner);
auto profiler = runControl->createWorker(runControl->runMode());

View File

@@ -26,6 +26,7 @@
#pragma once
#include <projectexplorer/runconfiguration.h>
#include <utils/environment.h>
namespace Android {
namespace Internal {
@@ -35,7 +36,10 @@ class AndroidQmlToolingSupport : public ProjectExplorer::RunWorker
Q_OBJECT
public:
explicit AndroidQmlToolingSupport(ProjectExplorer::RunControl *runControl);
explicit AndroidQmlToolingSupport(
ProjectExplorer::RunControl *runControl, const QString &intentName = QString(),
const QString &extraAppParams = QString(),
const Utils::Environment &extraEnvVars = Utils::Environment());
private:
void start() override;

View File

@@ -38,8 +38,10 @@ using namespace ProjectExplorer;
namespace Android {
namespace Internal {
AndroidRunSupport::AndroidRunSupport(RunControl *runControl)
: AndroidRunner(runControl)
AndroidRunSupport::AndroidRunSupport(RunControl *runControl, const QString &intentName,
const QString &extraAppParams,
const Utils::Environment &extraEnvVars)
: AndroidRunner(runControl, intentName, extraAppParams, extraEnvVars)
{
runControl->setIcon(Utils::Icons::RUN_SMALL_TOOLBAR);
}

View File

@@ -39,7 +39,10 @@ class AndroidRunSupport : public AndroidRunner
Q_OBJECT
public:
explicit AndroidRunSupport(ProjectExplorer::RunControl *runControl);
explicit AndroidRunSupport(ProjectExplorer::RunControl *runControl,
const QString &intentName = QString(),
const QString &extraAppParams = QString(),
const Utils::Environment &extraEnvVars = Utils::Environment());
~AndroidRunSupport() override;
void start() override;

View File

@@ -40,6 +40,8 @@ struct ANDROID_EXPORT AndroidRunnable
QStringList beforeStartAdbCommands;
QStringList afterFinishAdbCommands;
QString deviceSerialNumber;
QString extraAppParams;
Utils::Environment extraEnvVars;
QString displayName() const { return packageName; }
static void *staticTypeId;

View File

@@ -429,6 +429,17 @@ void AndroidRunnerWorker::asyncStart()
.arg(m_qmlServer.port()).arg(QmlDebug::qmlDebugServices(m_qmlDebugServices));
}
if (!m_androidRunnable.extraAppParams.isEmpty()) {
args << "-e" << "extraappparams"
<< QString::fromLatin1(m_androidRunnable.extraAppParams.toUtf8().toBase64());
}
if (m_androidRunnable.extraEnvVars.size() > 0) {
args << "-e" << "extraenvvars"
<< QString::fromLatin1(m_androidRunnable.extraEnvVars.toStringList().join('\t')
.toUtf8().toBase64());
}
if (!runAdb(args, &errorMessage)) {
emit remoteProcessFinished(tr("Failed to start the activity. Reason: %1.")
.arg(errorMessage));
@@ -676,7 +687,8 @@ QStringList AndroidRunnerWorker::selector() const
return AndroidDeviceInfo::adbSelector(m_androidRunnable.deviceSerialNumber);
}
AndroidRunner::AndroidRunner(RunControl *runControl)
AndroidRunner::AndroidRunner(RunControl *runControl, const QString &intentName,
const QString &extraAppParams, const Utils::Environment &extraEnvVars)
: RunWorker(runControl), m_target(runControl->runConfiguration()->target())
{
setDisplayName("AndroidRunner");
@@ -689,9 +701,13 @@ AndroidRunner::AndroidRunner(RunControl *runControl)
m_checkAVDTimer.setInterval(2000);
connect(&m_checkAVDTimer, &QTimer::timeout, this, &AndroidRunner::checkAVD);
m_androidRunnable.intentName = AndroidManager::intentName(m_target);
m_androidRunnable.intentName = intentName.isEmpty() ? AndroidManager::intentName(m_target)
: intentName;
m_androidRunnable.packageName = m_androidRunnable.intentName.left(
m_androidRunnable.intentName.indexOf(QLatin1Char('/')));
m_androidRunnable.extraAppParams = extraAppParams;
m_androidRunnable.extraEnvVars = extraEnvVars;
m_androidRunnable.deviceSerialNumber = AndroidManager::deviceSerialNumber(m_target);
if (auto androidRunConfig = qobject_cast<AndroidRunConfiguration *>(

View File

@@ -50,7 +50,10 @@ class AndroidRunner : public ProjectExplorer::RunWorker
Q_OBJECT
public:
explicit AndroidRunner(ProjectExplorer::RunControl *runControl);
explicit AndroidRunner(ProjectExplorer::RunControl *runControl,
const QString &intentName = QString(),
const QString &extraAppParams = QString(),
const Utils::Environment &extraEnvVars = Utils::Environment());
~AndroidRunner() override;
void setRunnable(const AndroidRunnable &runnable);