Android: add support for new SDK Tools package cmdline-tools

The newly added cmdline-tools is not used by Qt Creator.
So QC Android settings will be broken for users who have
an Android SDK installed from Android Studio, or who
updated their SDK package (i.e. tools -> cmdline-tools).

This patch fixes both of the following issues:

1- QC looks for sdkmanager tools under <SDK_ROOT>/tools/bin/sdkmanager,
and with the new SDK it's under
<SDK_ROOT>/cmdline-tools/latest/sdkmanger.

2- QC checks the version of the SDK tools and opens the
old SDK Manager for SDK tools version 25.3.0 or less.
However, since cmdline-tools is now version 1.0, it causes
QC to think this is an old version.

Fixes: QTCREATORBUG-23726
Change-Id: I7e6bbc6840d24d358f68dfa3e229799394ace950
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
Assam Boudjelthia
2020-04-16 16:44:06 +03:00
parent fdb0cf0f6b
commit 9e057a5536
4 changed files with 53 additions and 16 deletions

View File

@@ -172,7 +172,8 @@ bool AndroidBuildApkStep::init()
return false; return false;
const QVersionNumber sdkToolsVersion = AndroidConfigurations::currentConfig().sdkToolsVersion(); const QVersionNumber sdkToolsVersion = AndroidConfigurations::currentConfig().sdkToolsVersion();
if (sdkToolsVersion >= gradleScriptRevokedSdkVersion) { if (sdkToolsVersion >= gradleScriptRevokedSdkVersion
|| AndroidConfigurations::currentConfig().isCmdlineSdkToolsInstalled()) {
if (!version->sourcePath().pathAppended("src/3rdparty/gradle").exists()) { if (!version->sourcePath().pathAppended("src/3rdparty/gradle").exists()) {
emit addOutput(tr("The installed SDK tools version (%1) does not include Gradle " emit addOutput(tr("The installed SDK tools version (%1) does not include Gradle "
"scripts. The minimum Qt version required for Gradle build to work " "scripts. The minimum Qt version required for Gradle build to work "

View File

@@ -428,6 +428,15 @@ QString AndroidConfig::apiLevelNameFor(const SdkPlatform *platform)
QString("android-%1").arg(platform->apiLevel()) : ""; QString("android-%1").arg(platform->apiLevel()) : "";
} }
bool AndroidConfig::isCmdlineSdkToolsInstalled() const
{
QString toolPath("cmdline-tools/latest/bin/sdkmanager");
if (HostOsInfo::isWindowsHost())
toolPath += ANDROID_BAT_SUFFIX;
return m_sdkLocation.pathAppended(toolPath).exists();
}
FilePath AndroidConfig::adbToolPath() const FilePath AndroidConfig::adbToolPath() const
{ {
return m_sdkLocation.pathAppended("platform-tools/adb" QTC_HOST_EXE_SUFFIX); return m_sdkLocation.pathAppended("platform-tools/adb" QTC_HOST_EXE_SUFFIX);
@@ -449,25 +458,43 @@ FilePath AndroidConfig::androidToolPath() const
FilePath AndroidConfig::emulatorToolPath() const FilePath AndroidConfig::emulatorToolPath() const
{ {
QString relativePath = "emulator/emulator"; QString relativePath = "emulator/emulator";
if (sdkToolsVersion() < QVersionNumber(25, 3, 0)) if (sdkToolsVersion() < QVersionNumber(25, 3, 0) && !isCmdlineSdkToolsInstalled())
relativePath = "tools/emulator"; relativePath = "tools/emulator";
return m_sdkLocation.pathAppended(relativePath + QTC_HOST_EXE_SUFFIX); return m_sdkLocation.pathAppended(relativePath + QTC_HOST_EXE_SUFFIX);
} }
FilePath AndroidConfig::sdkManagerToolPath() const FilePath AndroidConfig::sdkManagerToolPath() const
{ {
QString toolPath = "tools/bin/sdkmanager"; QStringList sdkmanagerPaths = {"cmdline-tools/latest/bin/sdkmanager",
if (HostOsInfo::isWindowsHost()) "tools/bin/sdkmanager"};
toolPath += ANDROID_BAT_SUFFIX;
return m_sdkLocation.pathAppended(toolPath); for (QString &toolPath : sdkmanagerPaths) {
if (HostOsInfo::isWindowsHost())
toolPath += ANDROID_BAT_SUFFIX;
const FilePath sdkmanagerPath = m_sdkLocation.pathAppended(toolPath);
if (sdkmanagerPath.exists())
return sdkmanagerPath;
}
return FilePath();
} }
FilePath AndroidConfig::avdManagerToolPath() const FilePath AndroidConfig::avdManagerToolPath() const
{ {
QString toolPath = "tools/bin/avdmanager"; QStringList sdkmanagerPaths = {"cmdline-tools/latest/bin/avdmanager",
if (HostOsInfo::isWindowsHost()) "tools/bin/avdmanager"};
toolPath += ANDROID_BAT_SUFFIX;
return m_sdkLocation.pathAppended(toolPath); for (QString &toolPath : sdkmanagerPaths) {
if (HostOsInfo::isWindowsHost())
toolPath += ANDROID_BAT_SUFFIX;
const FilePath sdkmanagerPath = m_sdkLocation.pathAppended(toolPath);
if (sdkmanagerPath.exists())
return sdkmanagerPath;
}
return FilePath();
} }
FilePath AndroidConfig::aaptToolPath() const FilePath AndroidConfig::aaptToolPath() const
@@ -812,7 +839,7 @@ QStringList AndroidConfig::getAbis(const FilePath &adbToolPath, const QString &d
bool AndroidConfig::useNativeUiTools() const bool AndroidConfig::useNativeUiTools() const
{ {
const QVersionNumber version = sdkToolsVersion(); const QVersionNumber version = sdkToolsVersion();
return !version.isNull() && version <= QVersionNumber(25, 3 ,0); return !version.isNull() && version <= QVersionNumber(25, 3, 0) && !isCmdlineSdkToolsInstalled();
} }
bool AndroidConfig::isValidNdk(const QString &ndkLocation) const bool AndroidConfig::isValidNdk(const QString &ndkLocation) const
@@ -849,8 +876,11 @@ QVersionNumber AndroidConfig::sdkToolsVersion() const
{ {
QVersionNumber version; QVersionNumber version;
if (m_sdkLocation.exists()) { if (m_sdkLocation.exists()) {
const Utils::FilePath sdkToolsPropertiesPath FilePath sdkToolsPropertiesPath;
= m_sdkLocation.pathAppended("tools/source.properties"); if (isCmdlineSdkToolsInstalled())
sdkToolsPropertiesPath = m_sdkLocation.pathAppended("cmdline-tools/latest/source.properties");
else
sdkToolsPropertiesPath = m_sdkLocation.pathAppended("tools/source.properties");
QSettings settings(sdkToolsPropertiesPath.toString(), QSettings::IniFormat); QSettings settings(sdkToolsPropertiesPath.toString(), QSettings::IniFormat);
auto versionStr = settings.value(sdkToolsVersionKey).toString(); auto versionStr = settings.value(sdkToolsVersionKey).toString();
version = QVersionNumber::fromString(versionStr); version = QVersionNumber::fromString(versionStr);
@@ -868,7 +898,6 @@ QVersionNumber AndroidConfig::buildToolsVersion() const
return maxVersion; return maxVersion;
} }
QStringList AndroidConfig::sdkManagerToolArgs() const QStringList AndroidConfig::sdkManagerToolArgs() const
{ {
return m_sdkManagerToolArgs; return m_sdkManagerToolArgs;

View File

@@ -186,6 +186,7 @@ public:
bool isConnected(const QString &serialNumber) const; bool isConnected(const QString &serialNumber) const;
bool useNativeUiTools() const; bool useNativeUiTools() const;
bool isCmdlineSdkToolsInstalled() const;
bool sdkFullyConfigured() const { return m_sdkFullyConfigured; } bool sdkFullyConfigured() const { return m_sdkFullyConfigured; }
void setSdkFullyConfigured(bool allEssentialsInstalled) { m_sdkFullyConfigured = allEssentialsInstalled; } void setSdkFullyConfigured(bool allEssentialsInstalled) { m_sdkFullyConfigured = allEssentialsInstalled; }

View File

@@ -1,4 +1,4 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
@@ -277,6 +277,7 @@ public:
EmulatorToolsMarker = 0x400, EmulatorToolsMarker = 0x400,
NdkMarker = 0x800, NdkMarker = 0x800,
ExtrasMarker = 0x1000, ExtrasMarker = 0x1000,
CmdlineSdkToolsMarker = 0x2000,
SectionMarkers = InstalledPackagesMarker | AvailablePackagesMarkers | AvailableUpdatesMarker SectionMarkers = InstalledPackagesMarker | AvailablePackagesMarkers | AvailableUpdatesMarker
}; };
@@ -313,6 +314,7 @@ const std::map<SdkManagerOutputParser::MarkerTag, const char *> markerTags {
{SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"}, {SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"},
{SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"}, {SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"},
{SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"}, {SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"},
{SdkManagerOutputParser::MarkerTag::CmdlineSdkToolsMarker, "cmdline-tools"},
{SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"}, {SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"},
{SdkManagerOutputParser::MarkerTag::EmulatorToolsMarker, "emulator"}, {SdkManagerOutputParser::MarkerTag::EmulatorToolsMarker, "emulator"},
{SdkManagerOutputParser::MarkerTag::NdkMarker, "ndk"}, {SdkManagerOutputParser::MarkerTag::NdkMarker, "ndk"},
@@ -597,6 +599,10 @@ void SdkManagerOutputParser::parsePackageData(MarkerTag packageMarker, const QSt
createPackage(&SdkManagerOutputParser::parseSdkToolsPackage); createPackage(&SdkManagerOutputParser::parseSdkToolsPackage);
break; break;
case MarkerTag::CmdlineSdkToolsMarker:
createPackage(&SdkManagerOutputParser::parseSdkToolsPackage);
break;
case MarkerTag::PlatformToolsMarker: case MarkerTag::PlatformToolsMarker:
createPackage(&SdkManagerOutputParser::parsePlatformToolsPackage); createPackage(&SdkManagerOutputParser::parsePlatformToolsPackage);
break; break;
@@ -882,7 +888,7 @@ void AndroidSdkManagerPrivate::reloadSdkPackages()
return; return;
} }
if (m_config.sdkToolsVersion() < sdkManagerIntroVersion) { if (m_config.sdkToolsVersion() < sdkManagerIntroVersion && !m_config.isCmdlineSdkToolsInstalled()) {
// Old Sdk tools. // Old Sdk tools.
m_packageListingSuccessful = true; m_packageListingSuccessful = true;
AndroidToolManager toolManager(m_config); AndroidToolManager toolManager(m_config);