diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 789e6c92fd7..6e7dba97252 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -711,6 +711,13 @@ void AndroidBuildApkStep::doRun() return; } + if (AndroidManager::skipInstallationAndPackageSteps(target())) { + reportWarningOrError(Tr::tr("Product type is not an application, not building an APK."), + Task::Warning); + emit finished(true); + return; + } + auto setup = [this] { const auto androidAbis = AndroidManager::applicationAbis(target()); const QString buildKey = target()->activeBuildKey(); diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index fa299ba4e21..72a9e5c4799 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -359,6 +359,21 @@ Abi AndroidManager::androidAbi2Abi(const QString &androidAbi) } } +bool AndroidManager::skipInstallationAndPackageSteps(const Target *target) +{ + const Project *p = target->project(); + + const Core::Context cmakeCtx = Core::Context(CMakeProjectManager::Constants::CMAKE_PROJECT_ID); + const bool isCmakeProject = p->projectContext() == cmakeCtx; + if (isCmakeProject) + return false; // CMake reports ProductType::Other for Android Apps + + const ProjectNode *n = p->rootProjectNode()->findProjectNode([] (const ProjectNode *n) { + return n->productType() == ProductType::App; + }); + return n == nullptr; // If no Application target found, then skip steps +} + FilePath AndroidManager::manifestSourcePath(const Target *target) { if (const ProjectNode *node = currentProjectNode(target)) { diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h index d468ec3279e..ec6aff85bc6 100644 --- a/src/plugins/android/androidmanager.h +++ b/src/plugins/android/androidmanager.h @@ -82,6 +82,7 @@ public: static bool matchedAbis(const QStringList &deviceAbis, const QStringList &appAbis); static QString devicePreferredAbi(const QStringList &deviceAbis, const QStringList &appAbis); static ProjectExplorer::Abi androidAbi2Abi(const QString &androidAbi); + static bool skipInstallationAndPackageSteps(const ProjectExplorer::Target *target); static QString androidNameForApiLevel(int x); diff --git a/src/plugins/android/androidpackageinstallationstep.cpp b/src/plugins/android/androidpackageinstallationstep.cpp index 3b8a83fa578..e2f929f0813 100644 --- a/src/plugins/android/androidpackageinstallationstep.cpp +++ b/src/plugins/android/androidpackageinstallationstep.cpp @@ -122,6 +122,14 @@ void AndroidPackageInstallationStep::setupOutputFormatter(OutputFormatter *forma void AndroidPackageInstallationStep::doRun() { + if (AndroidManager::skipInstallationAndPackageSteps(target())) { + reportWarningOrError(Tr::tr("Product type is not an application, not running the " + "Make install step."), + Task::Warning); + emit finished(true); + return; + } + QString error; for (const QString &dir : std::as_const(m_androidDirsToClean)) { FilePath androidDir = FilePath::fromString(dir);