diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 444407ba0e3..2375502bae7 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -59,6 +59,8 @@ #include +using namespace ProjectExplorer; + namespace Android { using namespace Internal; @@ -68,6 +70,20 @@ const char BuildTargetSdkKey[] = "BuildTargetSdk"; const char VerboseOutputKey[] = "VerboseOutput"; const char UseMinistroKey[] = "UseMinistro"; +static void setupProcessParameters(ProcessParameters *pp, + BuildConfiguration *bc, + const QStringList &arguments, + const QString &command) +{ + pp->setMacroExpander(bc->macroExpander()); + pp->setWorkingDirectory(bc->buildDirectory().toString()); + Utils::Environment env = bc->environment(); + pp->setEnvironment(env); + pp->setCommand(command); + pp->setArguments(Utils::QtcProcess::joinArgs(arguments)); + pp->resolveAll(); +} + class PasswordInputDialog : public QDialog { Q_OBJECT @@ -158,10 +174,77 @@ bool AndroidBuildApkStep::init(QList &earlierSteps) m_openPackageLocationForRun = m_openPackageLocation; m_apkPath = qtSupport->apkPath(target()).toString(); - bool result = AbstractProcessStep::init(earlierSteps); - if (!result) + if (!AbstractProcessStep::init(earlierSteps)) return false; + QString command = version->qmakeProperty("QT_HOST_BINS"); + if (!command.endsWith('/')) + command += '/'; + command += "androiddeployqt"; + if (Utils::HostOsInfo::isWindowsHost()) + command += ".exe"; + + QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString(); + + QString inputFile = AndroidManager::androidQtSupport(target()) + ->targetDataItem(Constants::AndroidDeploySettingsFile, target()); + if (inputFile.isEmpty()) { + m_skipBuilding = true; + return true; + } + + QString buildTargetSdk = AndroidManager::buildTargetSDK(target()); + if (buildTargetSdk.isEmpty()) { + emit addOutput(tr("Android build SDK not defined. Check Android settings."), + OutputFormat::Stderr); + return false; + } + + QStringList arguments = {"--input", inputFile, + "--output", outputDir, + "--android-platform", AndroidManager::buildTargetSDK(target()), + "--jdk", AndroidConfigurations::currentConfig().openJDKLocation().toString()}; + + if (m_verbose) + arguments << "--verbose"; + + arguments << "--gradle"; + + if (m_useMinistro) + arguments << "--deployment" << "ministro"; + + QStringList argumentsPasswordConcealed = arguments; + + if (m_signPackage) { + arguments << "--sign" << m_keystorePath.toString() << m_certificateAlias + << "--storepass" << m_keystorePasswd; + argumentsPasswordConcealed << "--sign" << "******" + << "--storepass" << "******"; + if (!m_certificatePasswd.isEmpty()) { + arguments << "--keypass" << m_certificatePasswd; + argumentsPasswordConcealed << "--keypass" << "******"; + } + + } + + // Must be the last option, otherwise androiddeployqt might use the other + // params (e.g. --sign) to choose not to add gdbserver + if (version->qtVersion() >= QtSupport::QtVersionNumber(5, 6, 0)) { + if (m_addDebugger || bc->buildType() == ProjectExplorer::BuildConfiguration::Debug) + arguments << "--gdbserver"; + else + arguments << "--no-gdbserver"; + } + + ProjectExplorer::ProcessParameters *pp = processParameters(); + setupProcessParameters(pp, bc, arguments, command); + + // Generate arguments with keystore password concealed + ProjectExplorer::ProcessParameters pp2; + setupProcessParameters(&pp2, bc, argumentsPasswordConcealed, command); + m_command = pp2.effectiveCommand(); + m_argumentsPasswordConcealed = pp2.prettyArguments(); + return true; } @@ -226,6 +309,24 @@ bool AndroidBuildApkStep::verifyCertificatePassword() return success; } +void AndroidBuildApkStep::run(QFutureInterface &fi) +{ + if (m_skipBuilding) { + emit addOutput(tr("No application .pro file found, not building an APK."), BuildStep::OutputFormat::ErrorMessage); + reportRunResult(fi, true); + return; + } + AbstractProcessStep::run(fi); +} + +void AndroidBuildApkStep::processStarted() +{ + emit addOutput(tr("Starting: \"%1\" %2") + .arg(QDir::toNativeSeparators(m_command), + m_argumentsPasswordConcealed), + BuildStep::OutputFormat::NormalMessage); +} + bool AndroidBuildApkStep::fromMap(const QVariantMap &map) { m_keystorePath = Utils::FileName::fromString(map.value(KeystoreLocationKey).toString()); diff --git a/src/plugins/android/androidbuildapkstep.h b/src/plugins/android/androidbuildapkstep.h index b7d5e5d179c..ad49628c5b0 100644 --- a/src/plugins/android/androidbuildapkstep.h +++ b/src/plugins/android/androidbuildapkstep.h @@ -72,17 +72,19 @@ public: QString buildTargetSdk() const; void setBuildTargetSdk(const QString &sdk); -protected: +private: Q_INVOKABLE void showInGraphicalShell(); bool init(QList &earlierSteps) override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool immutable() const override { return true; } + void processStarted() override; void processFinished(int exitCode, QProcess::ExitStatus status) override; bool verifyKeystorePassword(); bool verifyCertificatePassword(); -protected: + void run(QFutureInterface &fi) override; + bool m_signPackage = false; bool m_verbose = false; bool m_useMinistro = false; @@ -96,6 +98,10 @@ protected: QString m_certificateAlias; QString m_certificatePasswd; QString m_apkPath; + + QString m_command; + QString m_argumentsPasswordConcealed; + bool m_skipBuilding = false; }; } // namespace Android diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp index 65e4b325794..6a4d43f8404 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp @@ -27,22 +27,12 @@ #include "qmakeandroidbuildapkstep.h" #include "qmakeandroidbuildapkwidget.h" -#include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include -#include - using namespace Android; namespace QmakeAndroidSupport { @@ -70,134 +60,10 @@ QmakeAndroidBuildApkStep::QmakeAndroidBuildApkStep(ProjectExplorer::BuildStepLis { } -bool QmakeAndroidBuildApkStep::init(QList &earlierSteps) -{ - if (!AndroidBuildApkStep::init(earlierSteps)) - return false; - - QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); - if (!version) - return false; - - QString command = version->qmakeProperty("QT_HOST_BINS"); - if (!command.endsWith('/')) - command += '/'; - command += "androiddeployqt"; - if (Utils::HostOsInfo::isWindowsHost()) - command += ".exe"; - - ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); - QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString(); - - QString inputFile = AndroidManager::androidQtSupport(target()) - ->targetDataItem(Constants::AndroidDeploySettingsFile, target()); - if (inputFile.isEmpty()) { - m_skipBuilding = true; - return true; - } - - QString buildTargetSdk = AndroidManager::buildTargetSDK(target()); - if (buildTargetSdk.isEmpty()) { - emit addOutput(tr("Android build SDK not defined. Check Android settings."), - OutputFormat::Stderr); - return false; - } - - QStringList arguments = {"--input", inputFile, - "--output", outputDir, - "--android-platform", AndroidManager::buildTargetSDK(target()), - "--jdk", AndroidConfigurations::currentConfig().openJDKLocation().toString()}; - - if (m_verbose) - arguments << "--verbose"; - - arguments << "--gradle"; - - if (m_useMinistro) - arguments << "--deployment" << "ministro"; - - QStringList argumentsPasswordConcealed = arguments; - - if (m_signPackage) { - arguments << "--sign" << m_keystorePath.toString() << m_certificateAlias - << "--storepass" << m_keystorePasswd; - argumentsPasswordConcealed << "--sign" << "******" - << "--storepass" << "******"; - if (!m_certificatePasswd.isEmpty()) { - arguments << "--keypass" << m_certificatePasswd; - argumentsPasswordConcealed << "--keypass" << "******"; - } - - } - - // Must be the last option, otherwise androiddeployqt might use the other - // params (e.g. --sign) to choose not to add gdbserver - if (version->qtVersion() >= QtSupport::QtVersionNumber(5, 6, 0)) { - if (m_addDebugger || bc->buildType() == ProjectExplorer::BuildConfiguration::Debug) - arguments << "--gdbserver"; - else - arguments << "--no-gdbserver"; - } - - ProjectExplorer::ProcessParameters *pp = processParameters(); - setupProcessParameters(pp, bc, arguments, command); - - // Generate arguments with keystore password concealed - ProjectExplorer::ProcessParameters pp2; - setupProcessParameters(&pp2, bc, argumentsPasswordConcealed, command); - m_command = pp2.effectiveCommand(); - m_argumentsPasswordConcealed = pp2.prettyArguments(); - - return true; -} - -void QmakeAndroidBuildApkStep::run(QFutureInterface &fi) -{ - if (m_skipBuilding) { - emit addOutput(tr("No application .pro file found, not building an APK."), BuildStep::OutputFormat::ErrorMessage); - reportRunResult(fi, true); - return; - } - AndroidBuildApkStep::run(fi); -} - -void QmakeAndroidBuildApkStep::setupProcessParameters(ProjectExplorer::ProcessParameters *pp, - ProjectExplorer::BuildConfiguration *bc, - const QStringList &arguments, - const QString &command) -{ - pp->setMacroExpander(bc->macroExpander()); - pp->setWorkingDirectory(bc->buildDirectory().toString()); - Utils::Environment env = bc->environment(); - pp->setEnvironment(env); - pp->setCommand(command); - pp->setArguments(Utils::QtcProcess::joinArgs(arguments)); - pp->resolveAll(); -} - -void QmakeAndroidBuildApkStep::processStarted() -{ - emit addOutput(tr("Starting: \"%1\" %2") - .arg(QDir::toNativeSeparators(m_command), - m_argumentsPasswordConcealed), - BuildStep::OutputFormat::NormalMessage); -} - ProjectExplorer::BuildStepConfigWidget *QmakeAndroidBuildApkStep::createConfigWidget() { return new QmakeAndroidBuildApkWidget(this); } -bool QmakeAndroidBuildApkStep::fromMap(const QVariantMap &map) -{ - return AndroidBuildApkStep::fromMap(map); -} - -QVariantMap QmakeAndroidBuildApkStep::toMap() const -{ - QVariantMap map = AndroidBuildApkStep::toMap(); - return map; -} - } // namespace Internal } // namespace QmakeAndroidSupport diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h index 983ff21f2ee..f2bba2c4039 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h @@ -44,20 +44,7 @@ public: QmakeAndroidBuildApkStep(ProjectExplorer::BuildStepList *bc); protected: - bool init(QList &earlierSteps) override; - void run(QFutureInterface &fi) override; - void processStarted() override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; - bool fromMap(const QVariantMap &map) override; - QVariantMap toMap() const override; - -private: - void setupProcessParameters(ProjectExplorer::ProcessParameters *pp, - ProjectExplorer::BuildConfiguration *bc, - const QStringList &arguments, const QString &command); - QString m_command; - QString m_argumentsPasswordConcealed; - bool m_skipBuilding = false; }; } // namespace Internal