diff options
Diffstat (limited to 'src/plugins/android/androidbuildapkstep.cpp')
-rw-r--r-- | src/plugins/android/androidbuildapkstep.cpp | 125 |
1 files changed, 55 insertions, 70 deletions
diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 94cb986b19..7bb6bbc464 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -40,11 +40,11 @@ #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/buildsystem.h> #include <projectexplorer/processparameters.h> #include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectnodes.h> -#include <projectexplorer/runconfiguration.h> #include <projectexplorer/target.h> #include <qtsupport/qtkitinformation.h> @@ -65,6 +65,7 @@ #include <QMessageBox> #include <QProcess> #include <QPushButton> +#include <QTimer> #include <QVBoxLayout> #include <memory> @@ -86,13 +87,13 @@ const char VerboseOutputKey[] = "VerboseOutput"; const char UseMinistroKey[] = "UseMinistro"; static void setupProcessParameters(ProcessParameters *pp, - BuildConfiguration *bc, + BuildStep *step, const QStringList &arguments, const QString &command) { - pp->setMacroExpander(bc->macroExpander()); - pp->setWorkingDirectory(bc->buildDirectory()); - Utils::Environment env = bc->environment(); + pp->setMacroExpander(step->macroExpander()); + pp->setWorkingDirectory(step->buildDirectory()); + Utils::Environment env = step->buildEnvironment(); pp->setEnvironment(env); pp->setCommandLine({command, arguments}); } @@ -124,22 +125,6 @@ private: this); }; -static FilePath aabPath(const BuildConfiguration *bc) -{ - if (!bc) - return {}; - - QString buildType; - if (bc->buildType() == BuildConfiguration::Release) - buildType = "release"; - else - buildType = "debug"; - - return bc->buildDirectory() - .pathAppended(Constants::ANDROID_BUILDDIRECTORY) - .pathAppended(QString("build/outputs/bundle/%1/android-build-%1.aab").arg(buildType)); -} - AndroidBuildApkStep::AndroidBuildApkStep(BuildStepList *parent, Core::Id id) : AbstractProcessStep(parent, id), m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations:: @@ -152,8 +137,6 @@ AndroidBuildApkStep::AndroidBuildApkStep(BuildStepList *parent, Core::Id id) bool AndroidBuildApkStep::init() { - ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); - if (m_signPackage) { qCDebug(buildapkstepLog) << "Signing enabled"; // check keystore and certificate passwords @@ -162,7 +145,7 @@ bool AndroidBuildApkStep::init() return false; } - if (bc->buildType() != ProjectExplorer::BuildConfiguration::Release) + if (buildType() != BuildConfiguration::Release) emit addOutput(tr("Warning: Signing a debug or profile package."), OutputFormat::ErrorMessage); } @@ -195,26 +178,18 @@ bool AndroidBuildApkStep::init() return false; } - auto parser = new JavaParser; - parser->setProjectFileList(Utils::transform(target()->project()->files(ProjectExplorer::Project::AllFiles), - &Utils::FilePath::toString)); - - RunConfiguration *rc = target()->activeRunConfiguration(); - const QString buildKey = rc ? rc->buildKey() : QString(); - const ProjectNode *node = rc ? target()->project()->findNodeForBuildKey(buildKey) : nullptr; - - QString sourceDirName; - if (node) - sourceDirName = node->data(Constants::AndroidPackageSourceDir).toString(); + m_openPackageLocationForRun = m_openPackageLocation; - QFileInfo sourceDirInfo(sourceDirName); - parser->setSourceDirectory(Utils::FilePath::fromString(sourceDirInfo.canonicalFilePath())); - parser->setBuildDirectory(bc->buildDirectory().pathAppended(Constants::ANDROID_BUILDDIRECTORY)); - setOutputParser(parser); + if (m_buildAAB) { + const QString bt = buildType() == BuildConfiguration::Release ? QLatin1String("release") + : QLatin1String("debug"); + m_packagePath = buildDirectory() + .pathAppended(Constants::ANDROID_BUILDDIRECTORY) + .pathAppended(QString("build/outputs/bundle/%1/android-build-%1.aab").arg(bt)).toString(); + } else { + m_packagePath = AndroidManager::apkPath(target()).toString(); + } - m_openPackageLocationForRun = m_openPackageLocation; - m_packagePath = m_buildAAB ? aabPath(buildConfiguration()).toString() - : AndroidManager::apkPath(target()).toString(); qCDebug(buildapkstepLog) << "Package path:" << m_packagePath; if (!AbstractProcessStep::init()) @@ -225,13 +200,15 @@ bool AndroidBuildApkStep::init() command += '/'; command += Utils::HostOsInfo::withExecutableSuffix("androiddeployqt"); - QString outputDir = bc->buildDirectory().pathAppended(Constants::ANDROID_BUILDDIRECTORY).toString(); + QString outputDir = buildDirectory().pathAppended(Constants::ANDROID_BUILDDIRECTORY).toString(); + const QString buildKey = target()->activeBuildKey(); + const ProjectNode *node = project()->findNodeForBuildKey(buildKey); if (node) m_inputFile = node->data(Constants::AndroidDeploySettingsFile).toString(); if (m_inputFile.isEmpty()) { - qCDebug(buildapkstepLog) << "no input file" << rc << node << buildKey; + qCDebug(buildapkstepLog) << "no input file" << node << buildKey; m_skipBuilding = true; return true; } @@ -276,24 +253,41 @@ bool AndroidBuildApkStep::init() // 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) + if (m_addDebugger || buildType() == ProjectExplorer::BuildConfiguration::Debug) arguments << "--gdbserver"; else arguments << "--no-gdbserver"; } ProjectExplorer::ProcessParameters *pp = processParameters(); - setupProcessParameters(pp, bc, arguments, command); + setupProcessParameters(pp, this, arguments, command); // Generate arguments with keystore password concealed ProjectExplorer::ProcessParameters pp2; - setupProcessParameters(&pp2, bc, argumentsPasswordConcealed, command); + setupProcessParameters(&pp2, this, argumentsPasswordConcealed, command); m_command = pp2.effectiveCommand().toString(); m_argumentsPasswordConcealed = pp2.prettyArguments(); return true; } +void AndroidBuildApkStep::setupOutputFormatter(OutputFormatter *formatter) +{ + const auto parser = new JavaParser; + parser->setProjectFileList(Utils::transform(project()->files(ProjectExplorer::Project::AllFiles), + &Utils::FilePath::toString)); + const QString buildKey = target()->activeBuildKey(); + const ProjectNode *node = project()->findNodeForBuildKey(buildKey); + QString sourceDirName; + if (node) + sourceDirName = node->data(Constants::AndroidPackageSourceDir).toString(); + QFileInfo sourceDirInfo(sourceDirName); + parser->setSourceDirectory(Utils::FilePath::fromString(sourceDirInfo.canonicalFilePath())); + parser->setBuildDirectory(buildDirectory().pathAppended(Constants::ANDROID_BUILDDIRECTORY)); + formatter->addLineParser(parser); + AbstractProcessStep::setupOutputFormatter(formatter); +} + void AndroidBuildApkStep::showInGraphicalShell() { Core::FileUtils::showInGraphicalShell(Core::ICore::mainWindow(), m_packagePath); @@ -308,7 +302,7 @@ void AndroidBuildApkStep::processFinished(int exitCode, QProcess::ExitStatus sta { AbstractProcessStep::processFinished(exitCode, status); if (m_openPackageLocationForRun && status == QProcess::NormalExit && exitCode == 0) - QMetaObject::invokeMethod(this, "showInGraphicalShell", Qt::QueuedConnection); + QTimer::singleShot(0, this, &AndroidBuildApkStep::showInGraphicalShell); } bool AndroidBuildApkStep::verifyKeystorePassword() @@ -384,28 +378,21 @@ void AndroidBuildApkStep::doRun() } auto setup = [this] { - auto bc = buildConfiguration(); const auto androidAbis = AndroidManager::applicationAbis(target()); for (const auto &abi : androidAbis) { - Utils::FilePath androidLibsDir = bc->buildDirectory() - .pathAppended("android-build/libs") - .pathAppended(abi); - if (!androidLibsDir.exists() && !QDir{bc->buildDirectory().toString()}.mkpath(androidLibsDir.toString())) + FilePath androidLibsDir = buildDirectory() / "android-build/libs" / abi; + if (!androidLibsDir.exists() && !QDir{buildDirectory().toString()}.mkpath(androidLibsDir.toString())) return false; } - RunConfiguration *rc = target()->activeRunConfiguration(); - const QString buildKey = rc ? rc->buildKey() : QString(); - const ProjectNode *node = rc ? target()->project()->findNodeForBuildKey(buildKey) : nullptr; - - if (!node) - return false; + const QString buildKey = target()->activeBuildKey(); + BuildSystem *bs = buildSystem(); bool inputExists = QFile::exists(m_inputFile); if (inputExists && !AndroidManager::isQtCreatorGenerated(FilePath::fromString(m_inputFile))) return true; // use the generated file if it was not generated by qtcreator - auto targets = node->data(Android::Constants::AndroidTargets).toStringList(); + auto targets = bs->extraData(buildKey, Android::Constants::AndroidTargets).toStringList(); if (targets.isEmpty()) return inputExists; // qmake does this job for us @@ -418,15 +405,15 @@ void AndroidBuildApkStep::doRun() QString applicationBinary; if (version->qtVersion() < QtSupport::QtVersionNumber(5, 14, 0)) { QTC_ASSERT(androidAbis.size() == 1, return false); - applicationBinary = target()->activeRunConfiguration()->buildTargetInfo().targetFilePath.toString(); - Utils::FilePath androidLibsDir = bc->buildDirectory().pathAppended("android-build/libs").pathAppended(androidAbis.first()); + applicationBinary = buildSystem()->buildTarget(buildKey).targetFilePath.toString(); + FilePath androidLibsDir = buildDirectory() / "android-build/libs" / androidAbis.first(); for (const auto &target : targets) { if (!copyFileIfNewer(target, androidLibsDir.pathAppended(QFileInfo{target}.fileName()).toString())) return false; } deploySettings["target-architecture"] = androidAbis.first(); } else { - applicationBinary = target()->activeRunConfiguration()->buildTargetInfo().targetFilePath.toFileInfo().fileName(); + applicationBinary = buildSystem()->buildTarget(buildKey).targetFilePath.toFileInfo().fileName(); QJsonObject architectures; // Copy targets to android build folder @@ -437,9 +424,7 @@ void AndroidBuildApkStep::doRun() applicationBinary.remove(0, 3).chop(targetSuffix.size()); } - Utils::FilePath androidLibsDir = bc->buildDirectory() - .pathAppended("android-build/libs") - .pathAppended(abi); + FilePath androidLibsDir = buildDirectory() / "android-build/libs" / abi; for (const auto &target : targets) { if (target.endsWith(targetSuffix)) { if (!copyFileIfNewer(target, androidLibsDir.pathAppended(QFileInfo{target}.fileName()).toString())) @@ -452,19 +437,19 @@ void AndroidBuildApkStep::doRun() } deploySettings["application-binary"] = applicationBinary; - QString extraLibs = node->data(Android::Constants::AndroidExtraLibs).toString(); + QString extraLibs = bs->extraData(buildKey, Android::Constants::AndroidExtraLibs).toString(); if (!extraLibs.isEmpty()) deploySettings["android-extra-libs"] = extraLibs; - QString androidSrcs = node->data(Android::Constants::AndroidPackageSourceDir).toString(); + QString androidSrcs = bs->extraData(buildKey, Android::Constants::AndroidPackageSourceDir).toString(); if (!androidSrcs.isEmpty()) deploySettings["android-package-source-directory"] = androidSrcs; - QString qmlImportPath = node->data("QML_IMPORT_PATH").toString(); + QString qmlImportPath = bs->extraData(buildKey, "QML_IMPORT_PATH").toString(); if (!qmlImportPath.isEmpty()) deploySettings["qml-import-paths"] = qmlImportPath; - QString qmlRootPath = node->data("QML_ROOT_PATH").toString(); + QString qmlRootPath = bs->extraData(buildKey, "QML_ROOT_PATH").toString(); if (qmlRootPath.isEmpty()) qmlRootPath = target()->project()->rootProjectDirectory().toString(); deploySettings["qml-root-path"] = qmlRootPath; |