Android: Extend Android SDK sanity

Verify the essential tools and packages required for development

Task-number: QTCREATORBUG-18837
Change-Id: Ie89e8fcf3bf75f1db9cc5eac50859cf6f3e5fafd
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
This commit is contained in:
Vikas Pachdha
2017-09-04 14:54:50 +02:00
parent afc0192c8f
commit 27e740cab4
5 changed files with 53 additions and 33 deletions

View File

@@ -775,6 +775,17 @@ QVersionNumber AndroidConfig::sdkToolsVersion() const
return version; return version;
} }
QVersionNumber AndroidConfig::buildToolsVersion() const
{
QVersionNumber maxVersion;
Utils::FileName buildtoolsDir = m_sdkLocation;
buildtoolsDir.appendPath("build-tools");
QDir buildToolsDir(buildtoolsDir.toString());
for (const QFileInfo &file: buildToolsDir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
maxVersion = qMax(maxVersion, QVersionNumber::fromString(file.fileName()));
return maxVersion;
}
FileName AndroidConfig::ndkLocation() const FileName AndroidConfig::ndkLocation() const
{ {
return m_ndkLocation; return m_ndkLocation;

View File

@@ -113,6 +113,7 @@ public:
Utils::FileName sdkLocation() const; Utils::FileName sdkLocation() const;
void setSdkLocation(const Utils::FileName &sdkLocation); void setSdkLocation(const Utils::FileName &sdkLocation);
QVersionNumber sdkToolsVersion() const; QVersionNumber sdkToolsVersion() const;
QVersionNumber buildToolsVersion() const;
Utils::FileName ndkLocation() const; Utils::FileName ndkLocation() const;
QVersionNumber ndkVersion() const; QVersionNumber ndkVersion() const;

View File

@@ -570,16 +570,10 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target)
gradleProperties["buildDir"] = ".build"; gradleProperties["buildDir"] = ".build";
gradleProperties["androidCompileSdkVersion"] = buildTargetSDK(target).split(QLatin1Char('-')).last().toLocal8Bit(); gradleProperties["androidCompileSdkVersion"] = buildTargetSDK(target).split(QLatin1Char('-')).last().toLocal8Bit();
if (gradleProperties["androidBuildToolsVersion"].isEmpty()) { if (gradleProperties["androidBuildToolsVersion"].isEmpty()) {
QVersionNumber maxVersion; QVersionNumber buildtoolVersion = AndroidConfigurations::currentConfig().buildToolsVersion();
QDir buildToolsDir(AndroidConfigurations::currentConfig().sdkLocation().appendPath(QLatin1String("build-tools")).toString()); if (buildtoolVersion.isNull())
foreach (const QFileInfo &file, buildToolsDir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)) {
QVersionNumber ver = QVersionNumber::fromString(file.fileName());
if (maxVersion < ver)
maxVersion = ver;
}
if (maxVersion.isNull())
return false; return false;
gradleProperties["androidBuildToolsVersion"] = maxVersion.toString().toLocal8Bit(); gradleProperties["androidBuildToolsVersion"] = buildtoolVersion.toString().toLocal8Bit();
} }
return mergeGradleProperties(gradlePropertiesPath, gradleProperties); return mergeGradleProperties(gradlePropertiesPath, gradleProperties);
} }

View File

@@ -287,11 +287,7 @@ static QPair<QStringList, bool> checkGdbForBrokenPython(const QStringList &paths
void AndroidSettingsWidget::check(AndroidSettingsWidget::Mode mode) void AndroidSettingsWidget::check(AndroidSettingsWidget::Mode mode)
{ {
if (mode & Sdk) { if (mode & Sdk) {
m_sdkState = Okay; m_sdkState = verifySdkInstallation(&m_sdkInstallationError) ? Okay : Error;
if (m_androidConfig.sdkLocation().isEmpty())
m_sdkState = NotSet;
else if (!(sdkLocationIsValid() && sdkPlatformToolsInstalled()))
m_sdkState = Error;
} }
if (mode & Ndk) { if (mode & Ndk) {
@@ -386,11 +382,7 @@ void AndroidSettingsWidget::applyToUi(AndroidSettingsWidget::Mode mode)
if (m_sdkState == Error) { if (m_sdkState == Error) {
m_ui->sdkWarningIconLabel->setVisible(true); m_ui->sdkWarningIconLabel->setVisible(true);
m_ui->sdkWarningLabel->setVisible(true); m_ui->sdkWarningLabel->setVisible(true);
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->SDKLocationPathChooser->rawPath()); m_ui->sdkWarningLabel->setText(m_sdkInstallationError);
if (sdkLocationIsValid())
m_ui->sdkWarningLabel->setText(tr("The Platform tools are missing. Please use the Android SDK Manager to install them."));
else
m_ui->sdkWarningLabel->setText(tr("\"%1\" does not seem to be an Android SDK top folder.").arg(location.toUserOutput()));
} else { } else {
m_ui->sdkWarningIconLabel->setVisible(false); m_ui->sdkWarningIconLabel->setVisible(false);
m_ui->sdkWarningLabel->setVisible(false); m_ui->sdkWarningLabel->setVisible(false);
@@ -488,20 +480,42 @@ void AndroidSettingsWidget::updateGradleBuildUi()
m_androidConfig.useGrandle()); m_androidConfig.useGrandle());
} }
bool AndroidSettingsWidget::sdkLocationIsValid() const bool AndroidSettingsWidget::verifySdkInstallation(QString *errorDetails) const
{ {
Utils::FileName androidExe = m_androidConfig.sdkLocation(); if (m_androidConfig.sdkLocation().isEmpty()) {
Utils::FileName androidBat = m_androidConfig.sdkLocation(); if (errorDetails)
Utils::FileName emulator = m_androidConfig.sdkLocation(); *errorDetails = tr("Android SDK path not set.");
return (androidExe.appendPath(QLatin1String("/tools/android" QTC_HOST_EXE_SUFFIX)).exists() return false;
|| androidBat.appendPath(QLatin1String("/tools/android" ANDROID_BAT_SUFFIX)).exists()) }
&& emulator.appendPath(QLatin1String("/tools/emulator" QTC_HOST_EXE_SUFFIX)).exists();
}
bool AndroidSettingsWidget::sdkPlatformToolsInstalled() const if (!m_androidConfig.sdkLocation().exists()) {
{ if (errorDetails)
Utils::FileName adb = m_androidConfig.sdkLocation(); *errorDetails = tr("Android SDK path does not exist.");
return adb.appendPath(QLatin1String("platform-tools/adb" QTC_HOST_EXE_SUFFIX)).exists(); return false;
}
if (m_androidConfig.sdkToolsVersion().isNull()) {
if (errorDetails)
*errorDetails = tr("The SDK path does not seem to be a valid Android SDK top folder.");
return false;
}
QStringList missingComponents;
if (!m_androidConfig.adbToolPath().exists())
missingComponents << "Platform Tools";
if (m_androidConfig.buildToolsVersion().isNull())
missingComponents << "Build Tools";
if (m_androidConfig.sdkTargets().isEmpty())
missingComponents << "Platform SDK";
if (!missingComponents.isEmpty() && errorDetails) {
*errorDetails = tr("Android SDK components missing (%1).\nUse Android SDK Manager to "
"manage SDK components.").arg(missingComponents.join(", "));
}
return missingComponents.isEmpty();
} }
void AndroidSettingsWidget::saveSettings() void AndroidSettingsWidget::saveSettings()

View File

@@ -100,15 +100,15 @@ private:
private: private:
enum Mode { Sdk = 1, Ndk = 2, Java = 4, All = Sdk | Ndk | Java }; enum Mode { Sdk = 1, Ndk = 2, Java = 4, All = Sdk | Ndk | Java };
enum State { NotSet = 0, Okay = 1, Error = 2 }; enum State { NotSet = 0, Okay = 1, Error = 2 };
bool verifySdkInstallation(QString *errorDetails = nullptr) const;
void check(Mode mode); void check(Mode mode);
void applyToUi(Mode mode); void applyToUi(Mode mode);
bool sdkLocationIsValid() const;
bool sdkPlatformToolsInstalled() const;
void startUpdateAvd(); void startUpdateAvd();
void enableAvdControls(); void enableAvdControls();
void disableAvdControls(); void disableAvdControls();
State m_sdkState; State m_sdkState;
QString m_sdkInstallationError;
State m_ndkState; State m_ndkState;
QString m_ndkErrorMessage; QString m_ndkErrorMessage;
int m_ndkCompilerCount; int m_ndkCompilerCount;