aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/android/androidbuildapkstep.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/android/androidbuildapkstep.cpp')
-rw-r--r--src/plugins/android/androidbuildapkstep.cpp149
1 files changed, 59 insertions, 90 deletions
diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp
index 1b3febce40..7bba90bf9c 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>
@@ -84,16 +85,15 @@ const QVersionNumber gradleScriptRevokedSdkVersion(25, 3, 0);
const char KeystoreLocationKey[] = "KeystoreLocation";
const char BuildTargetSdkKey[] = "BuildTargetSdk";
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});
}
@@ -125,23 +125,7 @@ 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)
+AndroidBuildApkStep::AndroidBuildApkStep(BuildStepList *parent, Utils::Id id)
: AbstractProcessStep(parent, id),
m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations::
sdkManager()->latestAndroidSdkPlatform()))
@@ -153,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
@@ -163,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);
}
@@ -196,27 +178,19 @@ 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;
+ qCDebug(buildapkstepLog) << "APK or AAB path:" << m_packagePath;
if (!AbstractProcessStep::init())
return false;
@@ -226,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;
}
@@ -257,9 +233,6 @@ bool AndroidBuildApkStep::init()
if (m_buildAAB)
arguments << "--aab" << "--jarsigner";
- if (m_useMinistro)
- arguments << "--deployment" << "ministro";
-
QStringList argumentsPasswordConcealed = arguments;
if (m_signPackage) {
@@ -277,27 +250,44 @@ 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);
+ Core::FileUtils::showInGraphicalShell(Core::ICore::dialogParent(), m_packagePath);
}
ProjectExplorer::BuildStepConfigWidget *AndroidBuildApkStep::createConfigWidget()
@@ -309,7 +299,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()
@@ -385,28 +375,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
@@ -419,15 +402,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
@@ -438,9 +421,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()))
@@ -453,19 +434,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;
@@ -504,7 +485,6 @@ bool AndroidBuildApkStep::fromMap(const QVariantMap &map)
sdkManager()->latestAndroidSdkPlatform());
}
m_verbose = map.value(VerboseOutputKey).toBool();
- m_useMinistro = map.value(UseMinistroKey).toBool();
return ProjectExplorer::BuildStep::fromMap(map);
}
@@ -514,7 +494,6 @@ QVariantMap AndroidBuildApkStep::toMap() const
map.insert(KeystoreLocationKey, m_keystorePath.toString());
map.insert(BuildTargetSdkKey, m_buildTargetSdk);
map.insert(VerboseOutputKey, m_verbose);
- map.insert(UseMinistroKey, m_useMinistro);
return map;
}
@@ -533,7 +512,7 @@ void AndroidBuildApkStep::setBuildTargetSdk(const QString &sdk)
m_buildTargetSdk = sdk;
}
-QVariant AndroidBuildApkStep::data(Core::Id id) const
+QVariant AndroidBuildApkStep::data(Utils::Id id) const
{
if (id == Constants::AndroidNdkPlatform) {
if (auto qtVersion = QtKitAspect::qtVersion(target()->kit()))
@@ -611,16 +590,6 @@ void AndroidBuildApkStep::setVerboseOutput(bool verbose)
m_verbose = verbose;
}
-bool AndroidBuildApkStep::useMinistro() const
-{
- return m_useMinistro;
-}
-
-void AndroidBuildApkStep::setUseMinistro(bool useMinistro)
-{
- m_useMinistro = useMinistro;
-}
-
bool AndroidBuildApkStep::addDebugger() const
{
return m_addDebugger;