forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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()
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user