diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 4064839288a..9966b21faf5 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -60,6 +60,8 @@ namespace Android { using namespace Internal; +const QVersionNumber gradleScriptRevokedSdkVersion(25, 3, 0); +const QVersionNumber gradleScriptsContainedQtVersion(5, 9, 0); const QLatin1String DeployActionKey("Qt4ProjectManager.AndroidDeployQtStep.DeployQtAction"); const QLatin1String KeystoreLocationKey("KeystoreLocation"); const QLatin1String BuildTargetSdkKey("BuildTargetSdk"); @@ -140,6 +142,15 @@ bool AndroidBuildApkStep::init(QList &earlierSteps) if (!version) return false; + if (AndroidConfigurations::currentConfig().sdkToolsVersion() >= gradleScriptRevokedSdkVersion && + QVersionNumber::fromString(version->qtVersionString()) < gradleScriptsContainedQtVersion) { + emit addOutput(tr("The installed SDK tools version (%1) does not include Gradle scripts. The " + "minimum Qt version required for Gradle build to work is %2") + .arg(gradleScriptRevokedSdkVersion.toString()) + .arg(gradleScriptsContainedQtVersion.toString()), OutputFormat::Stderr); + return false; + } + int minSDKForKit = AndroidManager::minimumSDK(target()->kit()); if (AndroidManager::minimumSDK(target()) < minSDKForKit) { emit addOutput(tr("The API level set for the APK is less than the minimum required by the kit." diff --git a/src/plugins/android/androidbuildapkstep.h b/src/plugins/android/androidbuildapkstep.h index c6cfb969096..eae827eb15f 100644 --- a/src/plugins/android/androidbuildapkstep.h +++ b/src/plugins/android/androidbuildapkstep.h @@ -102,7 +102,7 @@ protected: AndroidDeployAction m_deployAction = BundleLibrariesDeployment; bool m_signPackage = false; bool m_verbose = false; - bool m_useGradle = false; + bool m_useGradle = true; // Ant builds are deprecated. bool m_openPackageLocation = false; bool m_openPackageLocationForRun = false; bool m_addDebugger = true; diff --git a/src/plugins/android/androidbuildapkwidget.cpp b/src/plugins/android/androidbuildapkwidget.cpp index bce4508e054..97dd4695bde 100644 --- a/src/plugins/android/androidbuildapkwidget.cpp +++ b/src/plugins/android/androidbuildapkwidget.cpp @@ -54,9 +54,12 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) { m_ui->setupUi(this); + m_ui->deprecatedInfoIconLabel->setPixmap(Utils::Icons::INFO.pixmap()); + // Target sdk combobox int minApiLevel = 9; - QStringList targets = AndroidConfig::apiLevelNamesFor(AndroidConfigurations::currentConfig().sdkTargets(minApiLevel)); + const AndroidConfig &config = AndroidConfigurations::currentConfig(); + QStringList targets = AndroidConfig::apiLevelNamesFor(config.sdkTargets(minApiLevel)); targets.removeDuplicates(); m_ui->targetSDKComboBox->addItems(targets); m_ui->targetSDKComboBox->setCurrentIndex(targets.indexOf(AndroidManager::buildTargetSDK(step->target()))); @@ -91,7 +94,9 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) m_ui->signingDebugDeployErrorIcon->setPixmap(Utils::Icons::CRITICAL.pixmap()); signPackageCheckBoxToggled(m_step->signPackage()); - m_ui->useGradleCheckBox->setChecked(m_step->useGradle()); + m_ui->useGradleCheckBox->setEnabled(config.antScriptsAvailable()); + m_ui->useGradleCheckBox->setChecked(!config.antScriptsAvailable() || + m_step->useGradle()); m_ui->verboseOutputCheckBox->setChecked(m_step->verboseOutput()); m_ui->openPackageLocationCheckBox->setChecked(m_step->openPackageLocation()); m_ui->addDebuggerCheckBox->setChecked(m_step->addDebugger()); diff --git a/src/plugins/android/androidbuildapkwidget.ui b/src/plugins/android/androidbuildapkwidget.ui index d74066ce64a..fa3c1ef3d66 100644 --- a/src/plugins/android/androidbuildapkwidget.ui +++ b/src/plugins/android/androidbuildapkwidget.ui @@ -176,28 +176,66 @@ Deploying local Qt libraries is incompatible with Android 5. Advanced Actions - - + + + + + 0 + 0 + + - Verbose output + Use Gradle (Ant builds are deprecated) - + + + + + 0 + 0 + + + + Gradle builds are forced from Android SDK tools version 25.3.0 onwards as Ant scripts are no longer available. + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 0 + 0 + + + + + Open package location after build - - + + - Use Gradle + Verbose output - + false diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 44d65a13620..42027743b83 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -76,6 +76,9 @@ namespace Android { using namespace Internal; namespace { + + const QVersionNumber sdkToolsAntMissingVersion(25, 3, 0); + const QLatin1String SettingsGroup("AndroidConfigurations"); const QLatin1String SDKLocationKey("SDKLocation"); const QLatin1String NDKLocationKey("NDKLocation"); @@ -823,9 +826,18 @@ void AndroidConfig::setAutomaticKitCreation(bool b) m_automaticKitCreation = b; } +bool AndroidConfig::antScriptsAvailable() const +{ + return sdkToolsVersion() < sdkToolsAntMissingVersion; +} + bool AndroidConfig::useGrandle() const { - return m_useGradle; + if (antScriptsAvailable()) { + return m_useGradle; + } + // Force gradle builds. + return true; } void AndroidConfig::setUseGradle(bool b) diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 00c8f49fe4e..91076808109 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -135,6 +135,8 @@ public: bool automaticKitCreation() const; void setAutomaticKitCreation(bool b); + bool antScriptsAvailable() const; + bool useGrandle() const; void setUseGradle(bool b); @@ -205,7 +207,7 @@ private: QStringList m_makeExtraSearchDirectories; unsigned m_partitionSize = 1024; bool m_automaticKitCreation = true; - bool m_useGradle = false; + bool m_useGradle = true; // Ant builds are deprecated. //caches mutable bool m_availableSdkPlatformsUpToDate = false; diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 2e9c4c4b6b9..a0a24ea0875 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -134,6 +134,8 @@ AndroidSettingsWidget::AndroidSettingsWidget(QWidget *parent) { m_ui->setupUi(this); + m_ui->deprecatedInfoIconLabel->setPixmap(Utils::Icons::INFO.pixmap()); + connect(&m_checkGdbWatcher, &QFutureWatcherBase::finished, this, &AndroidSettingsWidget::checkGdbFinished); @@ -160,7 +162,8 @@ AndroidSettingsWidget::AndroidSettingsWidget(QWidget *parent) m_ui->AntLocationPathChooser->setPromptDialogTitle(tr("Select ant Script")); m_ui->AntLocationPathChooser->setInitialBrowsePathBackup(dir); m_ui->AntLocationPathChooser->setPromptDialogFilter(filter); - m_ui->UseGradleCheckBox->setChecked(m_androidConfig.useGrandle()); + + updateGradleBuildUi(); m_ui->OpenJDKLocationPathChooser->setFileName(m_androidConfig.openJDKLocation()); m_ui->OpenJDKLocationPathChooser->setPromptDialogTitle(tr("Select JDK Path")); @@ -478,6 +481,13 @@ void AndroidSettingsWidget::updateAvds() enableAvdControls(); } +void AndroidSettingsWidget::updateGradleBuildUi() +{ + m_ui->UseGradleCheckBox->setEnabled(m_androidConfig.antScriptsAvailable()); + m_ui->UseGradleCheckBox->setChecked(!m_androidConfig.antScriptsAvailable() || + m_androidConfig.useGrandle()); +} + bool AndroidSettingsWidget::sdkLocationIsValid() const { Utils::FileName androidExe = m_androidConfig.sdkLocation(); @@ -507,6 +517,7 @@ void AndroidSettingsWidget::saveSettings() void AndroidSettingsWidget::sdkLocationEditingFinished() { m_androidConfig.setSdkLocation(Utils::FileName::fromUserInput(m_ui->SDKLocationPathChooser->rawPath())); + updateGradleBuildUi(); check(Sdk); diff --git a/src/plugins/android/androidsettingswidget.h b/src/plugins/android/androidsettingswidget.h index d2fc860fa13..50be7c1049d 100644 --- a/src/plugins/android/androidsettingswidget.h +++ b/src/plugins/android/androidsettingswidget.h @@ -95,6 +95,7 @@ private: void checkGdbFinished(); void showGdbWarningDialog(); void updateAvds(); + void updateGradleBuildUi(); private: enum Mode { Sdk = 1, Ndk = 2, Java = 4, All = Sdk | Ndk | Java }; diff --git a/src/plugins/android/androidsettingswidget.ui b/src/plugins/android/androidsettingswidget.ui index 952dc444ccc..338c73da043 100644 --- a/src/plugins/android/androidsettingswidget.ui +++ b/src/plugins/android/androidsettingswidget.ui @@ -237,20 +237,30 @@ - - - - 0 - 0 - + + + 2 - - Automatically create kits for Android tool chains + + 0 - - true - - + + + + + 0 + 0 + + + + Automatically create kits for Android tool chains + + + true + + + + @@ -289,17 +299,59 @@ - - - - 0 - 0 - + + + 4 - - Use Gradle instead of Ant + + 0 - + + + + + 0 + 0 + + + + Use Gradle instead of Ant (Ant builds are deprecated) + + + true + + + + + + + + 0 + 0 + + + + Gradle builds are forced from Android SDK tools version 25.3.0 onwards as Ant scripts are no longer available. + + + + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + +