diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 03005fc5f80..66daf7b4c30 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -971,6 +972,50 @@ QStringList allEssentials() return allPackages; } +QString optionalSystemImagePackage(AndroidSdkManager *sdkManager) +{ + const QStringList essentialPkgs(allEssentials()); + QStringList platforms = Utils::filtered(essentialPkgs, [](const QString &item) { + return item.startsWith(platformsPackageMarker(), Qt::CaseInsensitive); + }); + if (platforms.isEmpty()) + return {}; + + platforms.sort(); + const QStringList platformBits = platforms.last().split('-'); + if (platformBits.isEmpty()) + return {}; + + const int apiLevel = platformBits.last().toInt(); + if (apiLevel < 1) + return {}; + + QString hostArch = QSysInfo::currentCpuArchitecture(); + if (hostArch == "arm64") + hostArch = ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A; + else if (hostArch == "i386") + hostArch = ProjectExplorer::Constants::ANDROID_ABI_X86; + else if (hostArch == "arm") + hostArch = ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A; + + const auto imageName = QLatin1String("%1;android-%2;google_apis_playstore;%3") + .arg(Constants::systemImagesPackageName).arg(apiLevel).arg(hostArch); + + const SdkPlatformList sdkPlatforms = sdkManager->filteredSdkPlatforms( + apiLevel, AndroidSdkPackage::AnyValidState); + + if (sdkPlatforms.isEmpty()) + return {}; + + const SystemImageList images = sdkPlatforms.first()->systemImages(AndroidSdkPackage::Available); + for (const SystemImage *img : images) { + if (img->sdkStylePath() == imageName) + return imageName; + } + + return {}; +} + static QStringList packagesWithoutNdks(const QStringList &packages) { return Utils::filtered(packages, [] (const QString &p) { diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index f28c4ad67a3..f4fc177c94f 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -55,6 +55,8 @@ QVersionNumber ndkVersion(const Utils::FilePath &ndkPath); QUrl sdkToolsUrl(); QByteArray getSdkToolsSha256(); +QString optionalSystemImagePackage(Internal::AndroidSdkManager *sdkManager); + QStringList allEssentials(); bool allEssentialsInstalled(Internal::AndroidSdkManager *sdkManager); bool sdkToolsOk(); diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h index 379310519ab..ee49930c6e1 100644 --- a/src/plugins/android/androidconstants.h +++ b/src/plugins/android/androidconstants.h @@ -80,5 +80,6 @@ const char cmdlineToolsName[] = "cmdline-tools"; const char ndkPackageName[] = "ndk"; const char platformsPackageName[] = "platforms"; const char buildToolsPackageName[] = "build-tools"; +const char systemImagesPackageName[] = "system-images"; } // Android::Constants diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index cdc80f91e9d..ef230042b8c 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -670,7 +670,15 @@ void AndroidSettingsWidget::validateSdk() .arg(QGuiApplication::applicationDisplayName(), notFoundEssentials.join("\", \""))); } - m_sdkManager.runInstallationChange({m_sdkManager.missingEssentialSdkPackages()}, + QStringList missingPkgs = m_sdkManager.missingEssentialSdkPackages(); + // Add the a system image with highest API level only if there are other + // essentials needed, so it would practicaly be somewhat optional. + if (!missingPkgs.isEmpty()) { + const QString sysImage = AndroidConfig::optionalSystemImagePackage(&m_sdkManager); + if (!sysImage.isEmpty()) + missingPkgs.append(sysImage); + } + m_sdkManager.runInstallationChange({missingPkgs}, Tr::tr("Android SDK installation is missing necessary packages. " "Do you want to install the missing packages?")); }