diff options
24 files changed, 545 insertions, 596 deletions
diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index f3285950c4d..38cfa2cdbf8 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -45,7 +45,7 @@ static bool is32BitUserSpace() bool startAvdAsync(const QString &avdName) { - const FilePath emulator = androidConfig().emulatorToolPath(); + const FilePath emulator = AndroidConfig::emulatorToolPath(); if (!emulator.exists()) { QMetaObject::invokeMethod(Core::ICore::mainWindow(), [emulator] { QMessageBox::critical(Core::ICore::dialogParent(), @@ -75,11 +75,11 @@ bool startAvdAsync(const QString &avdName) }); // start the emulator - CommandLine cmd(androidConfig().emulatorToolPath()); + CommandLine cmd(emulator); if (is32BitUserSpace()) cmd.addArg("-force-32bit"); - cmd.addArgs(androidConfig().emulatorArgs(), CommandLine::Raw); + cmd.addArgs(AndroidConfig::emulatorArgs(), CommandLine::Raw); cmd.addArgs({"-avd", avdName}); qCDebug(avdManagerLog).noquote() << "Running command (startAvdAsync):" << cmd.toUserOutput(); avdProcess->setCommand(cmd); @@ -89,7 +89,7 @@ bool startAvdAsync(const QString &avdName) QString findAvd(const QString &avdName) { - const QList<AndroidDeviceInfo> devices = androidConfig().connectedDevices(); + const QList<AndroidDeviceInfo> devices = AndroidConfig::connectedDevices(); for (const AndroidDeviceInfo &device : devices) { if (device.type != ProjectExplorer::IDevice::Emulator) continue; @@ -108,7 +108,7 @@ static bool waitForBooted(const QString &serialNumber, const std::optional<QFutu if (isAvdBooted(serialNumber)) return true; QThread::sleep(2); - if (!androidConfig().isConnected(serialNumber)) // device was disconnected + if (!AndroidConfig::isConnected(serialNumber)) // device was disconnected return false; } return false; @@ -132,11 +132,11 @@ QString waitForAvd(const QString &avdName, const std::optional<QFuture<void>> &f bool isAvdBooted(const QString &device) { - const CommandLine command{androidConfig().adbToolPath(), AndroidDeviceInfo::adbSelector(device) - + QStringList{"shell", "getprop", "init.svc.bootanim"}}; - qCDebug(avdManagerLog).noquote() << "Running command (isAvdBooted):" << command.toUserOutput(); + const CommandLine cmd{AndroidConfig::adbToolPath(), {AndroidDeviceInfo::adbSelector(device), + "shell", "getprop", "init.svc.bootanim"}}; + qCDebug(avdManagerLog).noquote() << "Running command (isAvdBooted):" << cmd.toUserOutput(); Process adbProc; - adbProc.setCommand(command); + adbProc.setCommand(cmd); adbProc.runBlocking(); if (adbProc.result() != ProcessResult::FinishedWithSuccess) return false; diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 8fc19e34359..51f73180971 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -415,7 +415,7 @@ bool AndroidBuildApkWidget::isOpenSslLibsIncluded() QString AndroidBuildApkWidget::openSslIncludeFileContent(const FilePath &projectPath) { - QString openSslPath = androidConfig().openSslLocation().toString(); + QString openSslPath = AndroidConfig::openSslLocation().toString(); if (projectPath.endsWith(".pro")) return "android: include(" + openSslPath + "/openssl.pri)"; if (projectPath.endsWith("CMakeLists.txt")) @@ -541,7 +541,7 @@ bool AndroidBuildApkStep::init() QStringList arguments = {"--input", m_inputFile.path(), "--output", outputDir.path(), "--android-platform", m_buildTargetSdk, - "--jdk", androidConfig().openJDKLocation().path()}; + "--jdk", AndroidConfig::openJDKLocation().path()}; if (verboseOutput()) arguments << "--verbose"; @@ -929,17 +929,16 @@ QVariant AndroidBuildApkStep::data(Utils::Id id) const { if (id == Constants::AndroidNdkPlatform) { if (auto qtVersion = QtKitAspect::qtVersion(kit())) - return androidConfig() - .bestNdkPlatformMatch(AndroidManager::minimumSDK(target()), qtVersion); + return AndroidConfig::bestNdkPlatformMatch(AndroidManager::minimumSDK(target()), qtVersion); return {}; } if (id == Constants::NdkLocation) { if (auto qtVersion = QtKitAspect::qtVersion(kit())) - return QVariant::fromValue(androidConfig().ndkLocation(qtVersion)); + return QVariant::fromValue(AndroidConfig::ndkLocation(qtVersion)); return {}; } if (id == Constants::SdkLocation) - return QVariant::fromValue(androidConfig().sdkLocation()); + return QVariant::fromValue(AndroidConfig::sdkLocation()); if (id == Constants::AndroidMkSpecAbis) return AndroidManager::applicationAbis(target()); @@ -1000,7 +999,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates() "-storepass", m_keystorePasswd, "-J-Duser.language=en"}; Process keytoolProc; - keytoolProc.setCommand({androidConfig().keytoolPath(), params}); + keytoolProc.setCommand({AndroidConfig::keytoolPath(), params}); using namespace std::chrono_literals; keytoolProc.runBlocking(30s); if (keytoolProc.result() > ProcessResult::FinishedWithError) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 58bd0373839..8a4a0465c3b 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -59,8 +59,8 @@ # include <QTest> #endif // WITH_TESTS -using namespace QtSupport; using namespace ProjectExplorer; +using namespace QtSupport; using namespace Utils; namespace { @@ -172,7 +172,7 @@ static QString getDeviceProperty(const QString &device, const QString &property) { // workaround for '????????????' serial numbers Process adbProc; - adbProc.setCommand({androidConfig().adbToolPath(), + adbProc.setCommand({AndroidConfig::adbToolPath(), {AndroidDeviceInfo::adbSelector(device), "shell", "getprop", property}}); adbProc.runBlocking(); if (adbProc.result() == ProcessResult::FinishedWithSuccess) @@ -235,11 +235,83 @@ static FilePath lldbPathFromNdk(const FilePath &ndkLocation) return path.exists() ? path : FilePath(); } +namespace AndroidConfig { + +struct SdkForQtVersions +{ + QList<QVersionNumber> versions; + QStringList essentialPackages; + + bool containsVersion(const QVersionNumber &qtVersion) const + { + return versions.contains(qtVersion) + || versions.contains(QVersionNumber(qtVersion.majorVersion(), + qtVersion.minorVersion())); + } +}; + +struct AndroidConfigData +{ + void load(const QtcSettings &settings); + void save(QtcSettings &settings) const; + void parseDependenciesJson(); + + FilePath m_sdkLocation; + FilePath m_temporarySdkToolsPath; + QStringList m_sdkManagerToolArgs; + FilePath m_openJDKLocation; + FilePath m_keystoreLocation; + FilePath m_openSslLocation; + QString m_emulatorArgs; + bool m_automaticKitCreation = true; + QUrl m_sdkToolsUrl; + QByteArray m_sdkToolsSha256; + QStringList m_commonEssentialPkgs; + SdkForQtVersions m_defaultSdkDepends; + QList<SdkForQtVersions> m_specificQtVersions; + QStringList m_customNdkList; + FilePath m_defaultNdk; + bool m_sdkFullyConfigured = false; + QHash<QString, QString> m_serialNumberToDeviceName; // cache +}; + +static AndroidConfigData &config() +{ + static AndroidConfigData theAndroidConfig; + return theAndroidConfig; +} + +static FilePath ndkSubPath(const SdkForQtVersions &packages) +{ + const QString ndkPrefix = ndkPackageMarker(); + for (const QString &package : packages.essentialPackages) + if (package.startsWith(ndkPrefix)) + return FilePath::fromString(NdksSubDir) / package.sliced(ndkPrefix.length()); + + return {}; +} + +static FilePath ndkSubPathFromQtVersion(const QtVersion &version) +{ + if (auto androidQtVersion = dynamic_cast<const AndroidQtVersion *>(&version)) { + bool ok; + const AndroidQtVersion::BuiltWith bw = androidQtVersion->builtWith(&ok); + if (ok) + return FilePath::fromString(NdksSubDir) / bw.ndkVersion.toString(); + } + + for (const SdkForQtVersions &item : config().m_specificQtVersions) { + if (item.containsVersion(version.qtVersion())) + return ndkSubPath(item); + } + return ndkSubPath(config().m_defaultSdkDepends); +} + ////////////////////////////////// // AndroidConfig ////////////////////////////////// -QLatin1String AndroidConfig::displayName(const Abi &abi) +QLatin1String displayName(const Abi &abi) { switch (abi.architecture()) { case Abi::ArmArchitecture: @@ -255,7 +327,7 @@ QLatin1String AndroidConfig::displayName(const Abi &abi) } } -void AndroidConfig::load(const QtcSettings &settings) +void AndroidConfigData::load(const QtcSettings &settings) { // user settings QVariant emulatorArgs = settings.value(EmulatorArgsKey, QString("-netdelay none -netspeed full")); @@ -286,7 +358,7 @@ void AndroidConfig::load(const QtcSettings &settings) // persistent settings } m_customNdkList.removeAll(""); - if (!m_defaultNdk.isEmpty() && ndkVersion(m_defaultNdk).isNull()) { + if (!m_defaultNdk.isEmpty() && AndroidConfig::ndkVersion(m_defaultNdk).isNull()) { if (avdConfigLog().isDebugEnabled()) qCDebug(avdConfigLog).noquote() << "Clearing invalid default NDK setting:" << m_defaultNdk.toUserOutput(); @@ -295,7 +367,7 @@ void AndroidConfig::load(const QtcSettings &settings) parseDependenciesJson(); } -void AndroidConfig::save(QtcSettings &settings) const +void AndroidConfigData::save(QtcSettings &settings) const { QFileInfo fileInfo(sdkSettingsFileName()); if (fileInfo.exists()) @@ -313,7 +385,7 @@ void AndroidConfig::save(QtcSettings &settings) const settings.setValue(SdkFullyConfiguredKey, m_sdkFullyConfigured); } -void AndroidConfig::parseDependenciesJson() +void AndroidConfigData::parseDependenciesJson() { const FilePath sdkConfigUserFile = Core::ICore::userResourcePath(JsonFilePath); const FilePath sdkConfigFile = Core::ICore::resourcePath(JsonFilePath); @@ -451,125 +523,90 @@ static QList<int> availableNdkPlatformsImpl(const FilePath &ndkLocation, const A return Utils::sorted(std::move(result), std::greater<>()); } -QList<int> AndroidConfig::availableNdkPlatforms(const QtVersion *qtVersion) const +static QList<int> availableNdkPlatforms(const QtVersion *qtVersion) { - return availableNdkPlatformsImpl(ndkLocation(qtVersion), qtVersion->qtAbis(), + return availableNdkPlatformsImpl(AndroidConfig::ndkLocation(qtVersion), qtVersion->qtAbis(), HostOsInfo::hostOs()); } -QStringList AndroidConfig::getCustomNdkList() const -{ - return m_customNdkList; -} +QStringList getCustomNdkList() { return config().m_customNdkList; } -void AndroidConfig::addCustomNdk(const QString &customNdk) +void addCustomNdk(const QString &customNdk) { - if (!m_customNdkList.contains(customNdk)) - m_customNdkList.append(customNdk); + if (!config().m_customNdkList.contains(customNdk)) + config().m_customNdkList.append(customNdk); } -void AndroidConfig::removeCustomNdk(const QString &customNdk) +void removeCustomNdk(const QString &customNdk) { - m_customNdkList.removeAll(customNdk); + config().m_customNdkList.removeAll(customNdk); } -void AndroidConfig::setDefaultNdk(const Utils::FilePath &defaultNdk) -{ - m_defaultNdk = defaultNdk; -} +void setDefaultNdk(const FilePath &defaultNdk) { config().m_defaultNdk = defaultNdk; } -FilePath AndroidConfig::defaultNdk() const -{ - return m_defaultNdk; -} +FilePath defaultNdk() { return config().m_defaultNdk; } -FilePath AndroidConfig::openSslLocation() const -{ - return m_openSslLocation; -} +FilePath openSslLocation() { return config().m_openSslLocation; } -void AndroidConfig::setOpenSslLocation(const FilePath &openSslLocation) +void setOpenSslLocation(const FilePath &openSslLocation) { - m_openSslLocation = openSslLocation; + config().m_openSslLocation = openSslLocation; } -QStringList AndroidConfig::apiLevelNamesFor(const SdkPlatformList &platforms) +QStringList apiLevelNamesFor(const SdkPlatformList &platforms) { return Utils::transform(platforms, AndroidConfig::apiLevelNameFor); } -QString AndroidConfig::apiLevelNameFor(const SdkPlatform *platform) +QString apiLevelNameFor(const SdkPlatform *platform) { if (platform && platform->apiLevel() > 0) { QString sdkStylePath = platform->sdkStylePath(); return sdkStylePath.remove("platforms;"); } - return {}; } -FilePath AndroidConfig::adbToolPath() const +FilePath adbToolPath() { - return m_sdkLocation.pathAppended("platform-tools/adb").withExecutableSuffix(); + return config().m_sdkLocation.pathAppended("platform-tools/adb").withExecutableSuffix(); } -FilePath AndroidConfig::emulatorToolPath() const +FilePath emulatorToolPath() { - const FilePath emulatorFile = m_sdkLocation.pathAppended("emulator/emulator") - .withExecutableSuffix(); - if (emulatorFile.exists()) - return emulatorFile; - - return {}; + const FilePath emulatorFile + = config().m_sdkLocation.pathAppended("emulator/emulator").withExecutableSuffix(); + return emulatorFile.exists() ? emulatorFile : FilePath(); } -FilePath AndroidConfig::sdkManagerToolPath() const +FilePath sdkManagerToolPath() { - const FilePath sdkmanagerPath = m_sdkLocation.pathAppended(Constants::cmdlineToolsName) + const FilePath sdkmanagerPath = config() + .m_sdkLocation.pathAppended(Constants::cmdlineToolsName) .pathAppended("latest/bin/sdkmanager" ANDROID_BAT_SUFFIX); if (sdkmanagerPath.exists()) return sdkmanagerPath; // If it's a first time install use the path of Constants::cmdlineToolsName temporary download - const FilePath sdkmanagerTmpPath = m_temporarySdkToolsPath.pathAppended( + const FilePath sdkmanagerTmpPath = config().m_temporarySdkToolsPath.pathAppended( "/bin/sdkmanager" ANDROID_BAT_SUFFIX); - if (sdkmanagerTmpPath.exists()) - return sdkmanagerTmpPath; - - return {}; + return sdkmanagerTmpPath.exists() ? sdkmanagerTmpPath : FilePath(); } -FilePath AndroidConfig::avdManagerToolPath() const +FilePath avdManagerToolPath() { - const FilePath sdkmanagerPath = m_sdkLocation.pathAppended(Constants::cmdlineToolsName) + const FilePath sdkmanagerPath = config() + .m_sdkLocation.pathAppended(Constants::cmdlineToolsName) .pathAppended("/latest/bin/avdmanager" ANDROID_BAT_SUFFIX); - if (sdkmanagerPath.exists()) - return sdkmanagerPath; - - return {}; -} - -void AndroidConfig::setTemporarySdkToolsPath(const Utils::FilePath &path) -{ - m_temporarySdkToolsPath = path; + return sdkmanagerPath.exists() ? sdkmanagerPath : FilePath(); } -FilePath AndroidConfig::sdkToolsVersionPath() const +void setTemporarySdkToolsPath(const FilePath &path) { - const FilePath sdkVersionPaths = m_sdkLocation.pathAppended(Constants::cmdlineToolsName) - .pathAppended("/latest/source.properties"); - if (sdkVersionPaths.exists()) - return sdkVersionPaths; - - // If it's a first time install use the path of Constants::cmdlineToolsName temporary download - const FilePath tmpSdkPath = m_temporarySdkToolsPath.pathAppended("source.properties"); - if (tmpSdkPath.exists()) - return tmpSdkPath; - - return {}; + config().m_temporarySdkToolsPath = path; } -FilePath AndroidConfig::toolchainPathFromNdk(const FilePath &ndkLocation, OsType hostOs) +FilePath toolchainPathFromNdk(const FilePath &ndkLocation, OsType hostOs) { const FilePath tcPath = ndkLocation / "toolchains/"; FilePath toolchainPath; @@ -606,12 +643,12 @@ FilePath AndroidConfig::toolchainPathFromNdk(const FilePath &ndkLocation, OsType return {}; } -FilePath AndroidConfig::toolchainPath(const QtVersion *qtVersion) const +FilePath toolchainPath(const QtVersion *qtVersion) { return toolchainPathFromNdk(ndkLocation(qtVersion)); } -FilePath AndroidConfig::clangPathFromNdk(const FilePath &ndkLocation) +FilePath clangPathFromNdk(const FilePath &ndkLocation) { const FilePath path = toolchainPathFromNdk(ndkLocation); if (path.isEmpty()) @@ -619,27 +656,25 @@ FilePath AndroidConfig::clangPathFromNdk(const FilePath &ndkLocation) return path.pathAppended("bin/clang").withExecutableSuffix(); } -FilePath AndroidConfig::makePathFromNdk(const FilePath &ndkLocation) +FilePath makePathFromNdk(const FilePath &ndkLocation) { return ndkLocation.pathAppended( QString("prebuilt/%1/bin/make%2").arg(toolchainHostFromNdk(ndkLocation), QString(QTC_HOST_EXE_SUFFIX))); } -FilePath AndroidConfig::openJDKBinPath() const +static FilePath openJDKBinPath() { - const FilePath path = m_openJDKLocation; - if (!path.isEmpty()) - return path.pathAppended("bin"); - return path; + const FilePath path = config().m_openJDKLocation; + return path.isEmpty() ? path : path.pathAppended("bin"); } -FilePath AndroidConfig::keytoolPath() const +FilePath keytoolPath() { return openJDKBinPath().pathAppended(keytoolName).withExecutableSuffix(); } -QList<AndroidDeviceInfo> AndroidConfig::connectedDevices(QString *error) const +QList<AndroidDeviceInfo> connectedDevices(QString *error) { QList<AndroidDeviceInfo> devices; Process adbProc; @@ -694,7 +729,7 @@ QList<AndroidDeviceInfo> AndroidConfig::connectedDevices(QString *error) const return devices; } -bool AndroidConfig::isConnected(const QString &serialNumber) const +bool isConnected(const QString &serialNumber) { const QList<AndroidDeviceInfo> devices = connectedDevices(); for (const AndroidDeviceInfo &device : devices) { @@ -704,34 +739,41 @@ bool AndroidConfig::isConnected(const QString &serialNumber) const return false; } -int AndroidConfig::getSDKVersion(const QString &device) +bool sdkFullyConfigured() { return config().m_sdkFullyConfigured; } + +void setSdkFullyConfigured(bool allEssentialsInstalled) +{ + config().m_sdkFullyConfigured = allEssentialsInstalled; +} + +int getSDKVersion(const QString &device) { const QString tmp = getDeviceProperty(device, "ro.build.version.sdk"); return tmp.isEmpty() ? -1 : tmp.trimmed().toInt(); } //! -//! \brief AndroidConfigurations::getProductModel +//! \brief AndroidConfig::getProductModel //! \param device serial number //! \return the produce model of the device or if that cannot be read the serial number //! -QString AndroidConfig::getProductModel(const QString &device) const +QString getProductModel(const QString &device) { - if (m_serialNumberToDeviceName.contains(device)) - return m_serialNumberToDeviceName.value(device); + if (config().m_serialNumberToDeviceName.contains(device)) + return config().m_serialNumberToDeviceName.value(device); const QString model = getDeviceProperty(device, "ro.product.model").trimmed(); if (model.isEmpty()) return device; - if (!device.startsWith(QLatin1String("????"))) - m_serialNumberToDeviceName.insert(device, model); + if (!device.startsWith("????")) + config().m_serialNumberToDeviceName.insert(device, model); return model; } -QStringList AndroidConfig::getAbis(const QString &device) +QStringList getAbis(const QString &device) { - const FilePath adbTool = androidConfig().adbToolPath(); + const FilePath adbTool = AndroidConfig::adbToolPath(); QStringList result; // First try via ro.product.cpu.abilist Process adbProc; @@ -769,7 +811,7 @@ QStringList AndroidConfig::getAbis(const QString &device) return result; } -bool AndroidConfig::isValidNdk(const QString &ndkLocation) +bool isValidNdk(const QString &ndkLocation) { const FilePath ndkPath = FilePath::fromUserInput(ndkLocation); @@ -787,7 +829,7 @@ bool AndroidConfig::isValidNdk(const QString &ndkLocation) return true; } -QString AndroidConfig::bestNdkPlatformMatch(int target, const QtVersion *qtVersion) const +QString bestNdkPlatformMatch(int target, const QtVersion *qtVersion) { target = std::max(AndroidManager::defaultMinimumSDK(qtVersion), target); const QList<int> platforms = availableNdkPlatforms(qtVersion); @@ -798,19 +840,35 @@ QString AndroidConfig::bestNdkPlatformMatch(int target, const QtVersion *qtVersi return QString("android-%1").arg(AndroidManager::defaultMinimumSDK(qtVersion)); } -FilePath AndroidConfig::sdkLocation() const +FilePath sdkLocation() +{ + return config().m_sdkLocation; +} + +void setSdkLocation(const FilePath &sdkLocation) { - return m_sdkLocation; + config().m_sdkLocation = sdkLocation; } -void AndroidConfig::setSdkLocation(const FilePath &sdkLocation) +static FilePath sdkToolsVersionPath() { - m_sdkLocation = sdkLocation; + const FilePath sdkVersionPaths = config() + .m_sdkLocation.pathAppended(Constants::cmdlineToolsName) + .pathAppended("/latest/source.properties"); + if (sdkVersionPaths.exists()) + return sdkVersionPaths; + + // If it's a first time install use the path of Constants::cmdlineToolsName temporary download + const FilePath tmpSdkPath = config().m_temporarySdkToolsPath.pathAppended("source.properties"); + if (tmpSdkPath.exists()) + return tmpSdkPath; + + return {}; } -QVersionNumber AndroidConfig::sdkToolsVersion() const +QVersionNumber sdkToolsVersion() { - if (!m_sdkLocation.exists()) + if (!config().m_sdkLocation.exists()) return {}; const FilePath sdkToolsPropertiesPath = sdkToolsVersionPath(); @@ -818,40 +876,34 @@ QVersionNumber AndroidConfig::sdkToolsVersion() const return QVersionNumber::fromString(settings.value(sdkToolsVersionKey).toString()); } -QVersionNumber AndroidConfig::buildToolsVersion() const +QVersionNumber buildToolsVersion() { //TODO: return version according to qt version QVersionNumber maxVersion; - QDir buildToolsDir(m_sdkLocation.pathAppended("build-tools").toString()); + QDir buildToolsDir(config().m_sdkLocation.pathAppended("build-tools").toString()); const auto files = buildToolsDir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot); for (const QFileInfo &file: files) maxVersion = qMax(maxVersion, QVersionNumber::fromString(file.fileName())); return maxVersion; } -QStringList AndroidConfig::sdkManagerToolArgs() const -{ - return m_sdkManagerToolArgs; -} +QStringList sdkManagerToolArgs() { return config().m_sdkManagerToolArgs; } -void AndroidConfig::setSdkManagerToolArgs(const QStringList &args) -{ - m_sdkManagerToolArgs = args; -} +void setSdkManagerToolArgs(const QStringList &args) { config().m_sdkManagerToolArgs = args; } -FilePath AndroidConfig::ndkLocation(const QtVersion *qtVersion) const +FilePath ndkLocation(const QtVersion *qtVersion) { - if (!m_defaultNdk.isEmpty()) - return m_defaultNdk; // A selected default NDK is good for any Qt version + if (!config().m_defaultNdk.isEmpty()) + return config().m_defaultNdk; // A selected default NDK is good for any Qt version return sdkLocation().resolvePath(ndkSubPathFromQtVersion(*qtVersion)); } -QVersionNumber AndroidConfig::ndkVersion(const QtVersion *qtVersion) const +QVersionNumber ndkVersion(const QtVersion *qtVersion) { return ndkVersion(ndkLocation(qtVersion)); } -QVersionNumber AndroidConfig::ndkVersion(const FilePath &ndkPath) +QVersionNumber ndkVersion(const FilePath &ndkPath) { QVersionNumber version; if (!ndkPath.exists()) { @@ -896,48 +948,13 @@ QVersionNumber AndroidConfig::ndkVersion(const FilePath &ndkPath) return version; } -QStringList AndroidConfig::allEssentials() const -{ - QtVersions installedVersions = QtVersionManager::versions( - [](const QtVersion *v) { - return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE); - }); - - QStringList allPackages(defaultEssentials()); - for (const QtVersion *version : installedVersions) - allPackages.append(essentialsFromQtVersion(*version)); - allPackages.removeDuplicates(); - - return allPackages; -} - -static QStringList packagesWithoutNdks(const QStringList &packages) -{ - return Utils::filtered(packages, [] (const QString &p) { - return !p.startsWith(ndkPackageMarker()); }); -} +QUrl sdkToolsUrl() { return config().m_sdkToolsUrl; } -bool AndroidConfig::allEssentialsInstalled(AndroidSdkManager *sdkManager) -{ - QStringList essentialPkgs(allEssentials()); - const auto installedPkgs = sdkManager->installedSdkPackages(); - for (const AndroidSdkPackage *pkg : installedPkgs) { - if (essentialPkgs.contains(pkg->sdkStylePath())) - essentialPkgs.removeOne(pkg->sdkStylePath()); - if (essentialPkgs.isEmpty()) - break; - } - if (!m_defaultNdk.isEmpty()) - essentialPkgs = packagesWithoutNdks(essentialPkgs); - return essentialPkgs.isEmpty() ? true : false; -} +QByteArray getSdkToolsSha256() { return config().m_sdkToolsSha256; } -bool AndroidConfig::sdkToolsOk() const +static QStringList defaultEssentials() { - bool exists = sdkLocation().exists(); - bool writable = sdkLocation().isWritableDir(); - bool sdkToolsExist = !sdkToolsVersion().isNull(); - return exists && writable && sdkToolsExist; + return config().m_defaultSdkDepends.essentialPackages + config().m_commonEssentialPkgs; } static QStringList packagesExcludingBuiltWithDefaults(const QStringList &packages) @@ -979,7 +996,7 @@ static QString essentialBuiltWithBuildToolsPackage(int builtWithApiVersion) return installedBuildTool; } -QStringList AndroidConfig::essentialsFromQtVersion(const QtVersion &version) const +static QStringList essentialsFromQtVersion(const QtVersion &version) { if (auto androidQtVersion = dynamic_cast<const AndroidQtVersion *>(&version)) { bool ok; @@ -992,72 +1009,76 @@ QStringList AndroidConfig::essentialsFromQtVersion(const QtVersion &version) con builtWithPackages.append(essentialBuiltWithBuildToolsPackage(bw.apiVersion)); return builtWithPackages + packagesExcludingBuiltWithDefaults( - m_defaultSdkDepends.essentialPackages); + config().m_defaultSdkDepends.essentialPackages); } } - QVersionNumber qtVersion = version.qtVersion(); - for (const SdkForQtVersions &item : m_specificQtVersions) + const QVersionNumber qtVersion = version.qtVersion(); + for (const SdkForQtVersions &item : config().m_specificQtVersions) { if (item.containsVersion(qtVersion)) return item.essentialPackages; - - return m_defaultSdkDepends.essentialPackages; -} - -static FilePath ndkSubPath(const SdkForQtVersions &packages) -{ - const QString ndkPrefix = ndkPackageMarker(); - for (const QString &package : packages.essentialPackages) - if (package.startsWith(ndkPrefix)) - return FilePath::fromString(NdksSubDir) / package.sliced(ndkPrefix.length()); - - return {}; + } + return config().m_defaultSdkDepends.essentialPackages; } -FilePath AndroidConfig::ndkSubPathFromQtVersion(const QtVersion &version) const +QStringList allEssentials() { - if (auto androidQtVersion = dynamic_cast<const AndroidQtVersion *>(&version)) { - bool ok; - const AndroidQtVersion::BuiltWith bw = androidQtVersion->builtWith(&ok); - if (ok) - return FilePath::fromString(NdksSubDir) / bw.ndkVersion.toString(); - } + QtVersions installedVersions = QtVersionManager::versions( + [](const QtVersion *v) { + return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE); + }); - for (const SdkForQtVersions &item : m_specificQtVersions) - if (item.containsVersion(version.qtVersion())) - return ndkSubPath(item); + QStringList allPackages(defaultEssentials()); + for (const QtVersion *version : installedVersions) + allPackages.append(essentialsFromQtVersion(*version)); + allPackages.removeDuplicates(); - return ndkSubPath(m_defaultSdkDepends); + return allPackages; } -QStringList AndroidConfig::defaultEssentials() const +static QStringList packagesWithoutNdks(const QStringList &packages) { - return m_defaultSdkDepends.essentialPackages + m_commonEssentialPkgs; + return Utils::filtered(packages, [] (const QString &p) { + return !p.startsWith(ndkPackageMarker()); + }); } -bool SdkForQtVersions::containsVersion(const QVersionNumber &qtVersion) const +bool allEssentialsInstalled(AndroidSdkManager *sdkManager) { - return versions.contains(qtVersion) - || versions.contains(QVersionNumber(qtVersion.majorVersion(), - qtVersion.minorVersion())); + QStringList essentialPkgs(allEssentials()); + const auto installedPkgs = sdkManager->installedSdkPackages(); + for (const AndroidSdkPackage *pkg : installedPkgs) { + if (essentialPkgs.contains(pkg->sdkStylePath())) + essentialPkgs.removeOne(pkg->sdkStylePath()); + if (essentialPkgs.isEmpty()) + break; + } + if (!config().m_defaultNdk.isEmpty()) + essentialPkgs = packagesWithoutNdks(essentialPkgs); + return essentialPkgs.isEmpty() ? true : false; } -FilePath AndroidConfig::openJDKLocation() const +bool sdkToolsOk() { - return m_openJDKLocation; + const bool exists = sdkLocation().exists(); + const bool writable = sdkLocation().isWritableDir(); + const bool sdkToolsExist = !sdkToolsVersion().isNull(); + return exists && writable && sdkToolsExist; } -void AndroidConfig::setOpenJDKLocation(const FilePath &openJDKLocation) +FilePath openJDKLocation() { return config().m_openJDKLocation; } + +void setOpenJDKLocation(const FilePath &openJDKLocation) { - m_openJDKLocation = openJDKLocation; + config().m_openJDKLocation = openJDKLocation; } -QString AndroidConfig::toolchainHost(const QtVersion *qtVersion) const +QString toolchainHost(const QtVersion *qtVersion) { return toolchainHostFromNdk(ndkLocation(qtVersion)); } -QString AndroidConfig::toolchainHostFromNdk(const FilePath &ndkPath) +QString toolchainHostFromNdk(const FilePath &ndkPath) { // detect toolchain host QString toolchainHost; @@ -1087,27 +1108,15 @@ QString AndroidConfig::toolchainHostFromNdk(const FilePath &ndkPath) return toolchainHost; } -QString AndroidConfig::emulatorArgs() const -{ - return m_emulatorArgs; -} +QString emulatorArgs() { return config().m_emulatorArgs; } -void AndroidConfig::setEmulatorArgs(const QString &args) -{ - m_emulatorArgs = args; -} +void setEmulatorArgs(const QString &args) { config().m_emulatorArgs = args; } -bool AndroidConfig::automaticKitCreation() const -{ - return m_automaticKitCreation; -} +bool automaticKitCreation() { return config().m_automaticKitCreation; } -void AndroidConfig::setAutomaticKitCreation(bool b) -{ - m_automaticKitCreation = b; -} +void setAutomaticKitCreation(bool b) { config().m_automaticKitCreation = b; } -FilePath AndroidConfig::defaultSdkPath() +FilePath defaultSdkPath() { QString sdkFromEnvVar = QString::fromLocal8Bit(getenv("ANDROID_SDK_ROOT")); if (!sdkFromEnvVar.isEmpty()) @@ -1128,6 +1137,101 @@ FilePath AndroidConfig::defaultSdkPath() QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/Android/Sdk"); } +Environment toolsEnvironment() +{ + Environment env = Environment::systemEnvironment(); + FilePath jdkLocation = openJDKLocation(); + if (!jdkLocation.isEmpty()) { + env.set(Constants::JAVA_HOME_ENV_VAR, jdkLocation.toUserOutput()); + env.prependOrSetPath(jdkLocation.pathAppended("bin")); + } + return env; +} + +static FilePath androidStudioPath() +{ +#if defined(Q_OS_WIN) + const QLatin1String registryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio"); + const QLatin1String valueName("Path"); + const QSettings settings64(registryKey, QSettings::Registry64Format); + const QSettings settings32(registryKey, QSettings::Registry32Format); + return FilePath::fromUserInput( + settings64.value(valueName, settings32.value(valueName).toString()).toString()); +#endif + return {}; // TODO non-Windows +} + +FilePath getJdkPath() +{ + FilePath jdkHome = FilePath::fromString(qtcEnvironmentVariable(Constants::JAVA_HOME_ENV_VAR)); + if (jdkHome.exists()) + return jdkHome; + + if (HostOsInfo::isWindowsHost()) { + // Look for Android Studio's jdk first + const FilePath androidStudioSdkPath = androidStudioPath(); + if (!androidStudioSdkPath.isEmpty()) { + const QStringList allVersions{"jbr", "jre"}; + for (const QString &version : allVersions) { + const FilePath androidStudioSdkJbrPath = androidStudioSdkPath / version; + if (androidStudioSdkJbrPath.exists()) + return androidStudioSdkJbrPath; + } + } + + if (jdkHome.isEmpty()) { + QStringList allVersions; + QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\", + QSettings::NativeFormat); + allVersions = settings.childGroups(); +#ifdef Q_OS_WIN + if (allVersions.isEmpty()) { + settings.setDefaultFormat(QSettings::Registry64Format); + allVersions = settings.childGroups(); + } +#endif // Q_OS_WIN + + // Look for the highest existing JDK + allVersions.sort(); + std::reverse(allVersions.begin(), allVersions.end()); // Order descending + for (const QString &version : std::as_const(allVersions)) { + settings.beginGroup(version); + jdkHome = FilePath::fromUserInput(settings.value("JavaHome").toString()); + settings.endGroup(); + if (jdkHome.exists()) + break; + } + } + } else { + QStringList args; + if (HostOsInfo::isMacHost()) + args << "-c" + << "/usr/libexec/java_home"; + else + args << "-c" + << "readlink -f $(which java)"; + + Process findJdkPathProc; + findJdkPathProc.setCommand({"sh", args}); + findJdkPathProc.start(); + findJdkPathProc.waitForFinished(); + QByteArray jdkPath = findJdkPathProc.rawStdOut().trimmed(); + + if (HostOsInfo::isMacHost()) { + jdkHome = FilePath::fromUtf8(jdkPath); + } else { + jdkPath.replace("bin/java", ""); // For OpenJDK 11 + jdkPath.replace("jre", ""); + jdkPath.replace("//", "/"); + jdkHome = FilePath::fromUtf8(jdkPath); + } + } + + return jdkHome; +} + +} // namespace AndroidConfig + /////////////////////////////////// // AndroidConfigurations /////////////////////////////////// @@ -1200,12 +1304,12 @@ void AndroidConfigurations::removeUnusedDebuggers() QList<FilePath> uniqueNdks; for (const QtVersion *qt : qtVersions) { - FilePath ndkLocation = androidConfig().ndkLocation(qt); + FilePath ndkLocation = AndroidConfig::ndkLocation(qt); if (!uniqueNdks.contains(ndkLocation)) uniqueNdks.append(ndkLocation); } - uniqueNdks.append(FileUtils::toFilePathList(androidConfig().getCustomNdkList())); + uniqueNdks.append(FileUtils::toFilePathList(AndroidConfig::getCustomNdkList())); const QList<Debugger::DebuggerItem> allDebuggers = Debugger::DebuggerItemManager::debuggers(); for (const Debugger::DebuggerItem &debugger : allDebuggers) { @@ -1297,7 +1401,7 @@ static QVariant findOrRegisterDebugger(Toolchain *tc, debugger.setEngineType(Debugger::LldbEngineType); debugger.setUnexpandedDisplayName(custom + mainName .arg(getMultiOrSingleAbiString(allSupportedAbis())) - .arg(androidConfig().ndkVersion(ndk).toString()) + .arg(AndroidConfig::ndkVersion(ndk).toString()) + ' ' + debugger.engineTypeName()); debugger.setAutoDetected(true); debugger.reinitializeFromFile(); @@ -1316,10 +1420,10 @@ static QVariant findOrRegisterDebugger(Toolchain *tc, debugger.setEngineType(Debugger::GdbEngineType); // NDK 10 and older have multiple gdb versions per ABI, so check for that. - const bool oldNdkVersion = androidConfig().ndkVersion(ndk) <= QVersionNumber{11}; + const bool oldNdkVersion = AndroidConfig::ndkVersion(ndk) <= QVersionNumber{11}; debugger.setUnexpandedDisplayName(custom + mainName .arg(getMultiOrSingleAbiString(oldNdkVersion ? abisList : allSupportedAbis())) - .arg(androidConfig().ndkVersion(ndk).toString()) + .arg(AndroidConfig::ndkVersion(ndk).toString()) + ' ' + debugger.engineTypeName()); debugger.setAutoDetected(true); debugger.reinitializeFromFile(); @@ -1330,9 +1434,9 @@ static QVariant findOrRegisterDebugger(Toolchain *tc, void AndroidConfigurations::registerCustomToolchainsAndDebuggers() { const Toolchains existingAndroidToolchains = ToolchainManager::toolchains( - Utils::equal(&Toolchain::typeId, Utils::Id(Constants::ANDROID_TOOLCHAIN_TYPEID))); + Utils::equal(&Toolchain::typeId, Id(Constants::ANDROID_TOOLCHAIN_TYPEID))); - const FilePaths customNdks = FileUtils::toFilePathList(androidConfig().getCustomNdkList()); + const FilePaths customNdks = FileUtils::toFilePathList(AndroidConfig::getCustomNdkList()); const Toolchains customToolchains = autodetectToolchainsFromNdks(existingAndroidToolchains, customNdks, true); @@ -1351,8 +1455,8 @@ void AndroidConfigurations::updateAutomaticKitList() if (DeviceTypeKitAspect::deviceTypeId(k) == Constants::ANDROID_DEVICE_TYPE) { if (k->value(Constants::ANDROID_KIT_NDK).isNull() || k->value(Constants::ANDROID_KIT_SDK).isNull()) { if (QtVersion *qt = QtKitAspect::qtVersion(k)) { - k->setValueSilently(Constants::ANDROID_KIT_NDK, androidConfig().ndkLocation(qt).toString()); - k->setValue(Constants::ANDROID_KIT_SDK, androidConfig().sdkLocation().toString()); + k->setValueSilently(Constants::ANDROID_KIT_NDK, AndroidConfig::ndkLocation(qt).toString()); + k->setValue(Constants::ANDROID_KIT_SDK, AndroidConfig::sdkLocation().toString()); } } } @@ -1392,7 +1496,7 @@ void AndroidConfigurations::updateAutomaticKitList() for (const QtVersion *qt : qtVersionsForArch.value(tc->targetAbi())) { FilePath tcNdk = static_cast<const AndroidToolchain *>(tc)->ndkLocation(); - if (tcNdk != androidConfig().ndkLocation(qt)) + if (tcNdk != AndroidConfig::ndkLocation(qt)) continue; const Toolchains allLanguages @@ -1434,8 +1538,8 @@ void AndroidConfigurations::updateAutomaticKitList() k->setUnexpandedDisplayName(Tr::tr("Android %1 Clang %2") .arg(versionStr) .arg(getMultiOrSingleAbiString(abis))); - k->setValueSilently(Constants::ANDROID_KIT_NDK, androidConfig().ndkLocation(qt).toString()); - k->setValueSilently(Constants::ANDROID_KIT_SDK, androidConfig().sdkLocation().toString()); + k->setValueSilently(Constants::ANDROID_KIT_NDK, AndroidConfig::ndkLocation(qt).toString()); + k->setValueSilently(Constants::ANDROID_KIT_SDK, AndroidConfig::sdkLocation().toString()); }; if (existingKit) { @@ -1451,23 +1555,6 @@ void AndroidConfigurations::updateAutomaticKitList() KitManager::deregisterKits(unhandledKits); } -Environment AndroidConfig::toolsEnvironment() const -{ - Environment env = Environment::systemEnvironment(); - FilePath jdkLocation = openJDKLocation(); - if (!jdkLocation.isEmpty()) { - env.set(Constants::JAVA_HOME_ENV_VAR, jdkLocation.toUserOutput()); - env.prependOrSetPath(jdkLocation.pathAppended("bin")); - } - return env; -} - -AndroidConfig &androidConfig() -{ - static AndroidConfig theCurrentConfig; - return theCurrentConfig; -} - AndroidSdkManager *AndroidConfigurations::sdkManager() { return m_instance->m_sdkManager.get(); @@ -1482,97 +1569,15 @@ void AndroidConfigurations::save() { QtcSettings *settings = Core::ICore::settings(); settings->beginGroup(SettingsGroup); - androidConfig().save(*settings); + AndroidConfig::config().save(*settings); settings->endGroup(); } -static FilePath androidStudioPath() -{ -#if defined(Q_OS_WIN) - const QLatin1String registryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio"); - const QLatin1String valueName("Path"); - const QSettings settings64(registryKey, QSettings::Registry64Format); - const QSettings settings32(registryKey, QSettings::Registry32Format); - return FilePath::fromUserInput( - settings64.value(valueName, settings32.value(valueName).toString()).toString()); -#endif - return {}; // TODO non-Windows -} - -FilePath AndroidConfig::getJdkPath() -{ - FilePath jdkHome = FilePath::fromString(qtcEnvironmentVariable(Constants::JAVA_HOME_ENV_VAR)); - if (jdkHome.exists()) - return jdkHome; - - if (HostOsInfo::isWindowsHost()) { - // Look for Android Studio's jdk first - const FilePath androidStudioSdkPath = androidStudioPath(); - if (!androidStudioSdkPath.isEmpty()) { - const QStringList allVersions{"jbr", "jre"}; - for (const QString &version : allVersions) { - const FilePath androidStudioSdkJbrPath = androidStudioSdkPath / version; - if (androidStudioSdkJbrPath.exists()) - return androidStudioSdkJbrPath; - } - } - - if (jdkHome.isEmpty()) { - QStringList allVersions; - QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\", - QSettings::NativeFormat); - allVersions = settings.childGroups(); -#ifdef Q_OS_WIN - if (allVersions.isEmpty()) { - settings.setDefaultFormat(QSettings::Registry64Format); - allVersions = settings.childGroups(); - } -#endif // Q_OS_WIN - - // Look for the highest existing JDK - allVersions.sort(); - std::reverse(allVersions.begin(), allVersions.end()); // Order descending - for (const QString &version : std::as_const(allVersions)) { - settings.beginGroup(version); - jdkHome = FilePath::fromUserInput(settings.value("JavaHome").toString()); - settings.endGroup(); - if (jdkHome.exists()) - break; - } - } - } else { - QStringList args; - if (HostOsInfo::isMacHost()) - args << "-c" - << "/usr/libexec/java_home"; - else - args << "-c" - << "readlink -f $(which java)"; - - Process findJdkPathProc; - findJdkPathProc.setCommand({"sh", args}); - findJdkPathProc.start(); - findJdkPathProc.waitForFinished(); - QByteArray jdkPath = findJdkPathProc.rawStdOut().trimmed(); - - if (HostOsInfo::isMacHost()) { - jdkHome = FilePath::fromUtf8(jdkPath); - } else { - jdkPath.replace("bin/java", ""); // For OpenJDK 11 - jdkPath.replace("jre", ""); - jdkPath.replace("//", "/"); - jdkHome = FilePath::fromUtf8(jdkPath); - } - } - - return jdkHome; -} - void AndroidConfigurations::load() { QtcSettings *settings = Core::ICore::settings(); settings->beginGroup(SettingsGroup); - androidConfig().load(*settings); + AndroidConfig::config().load(*settings); settings->endGroup(); } @@ -1650,7 +1655,7 @@ void AndroidConfigurationsTest::testAndroidConfigAvailableNdkPlatforms() QFETCH(OsType, hostOs); QFETCH(QList<int>, expectedPlatforms); - const QList<int> foundPlatforms = availableNdkPlatformsImpl(ndkPath, abis, hostOs); + const QList<int> foundPlatforms = AndroidConfig::availableNdkPlatformsImpl(ndkPath, abis, hostOs); QCOMPARE(foundPlatforms, expectedPlatforms); } diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 05e93e02887..ca7825cf03e 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -36,132 +36,87 @@ public: int sdcardSize = 0; }; -struct SdkForQtVersions -{ - QList<QVersionNumber> versions; - QStringList essentialPackages; - -public: - bool containsVersion(const QVersionNumber &qtVersion) const; -}; - -class AndroidConfig -{ -public: - void load(const Utils::QtcSettings &settings); - void save(Utils::QtcSettings &settings) const; - - static QStringList apiLevelNamesFor(const SdkPlatformList &platforms); - static QString apiLevelNameFor(const SdkPlatform *platform); +namespace AndroidConfig { - Utils::FilePath sdkLocation() const; - void setSdkLocation(const Utils::FilePath &sdkLocation); - QVersionNumber sdkToolsVersion() const; - Utils::FilePath sdkToolsVersionPath() const; - QVersionNumber buildToolsVersion() const; - QStringList sdkManagerToolArgs() const; - void setSdkManagerToolArgs(const QStringList &args); +QStringList apiLevelNamesFor(const SdkPlatformList &platforms); +QString apiLevelNameFor(const SdkPlatform *platform); - Utils::FilePath ndkLocation(const QtSupport::QtVersion *qtVersion) const; - QVersionNumber ndkVersion(const QtSupport::QtVersion *qtVersion) const; - static QVersionNumber ndkVersion(const Utils::FilePath &ndkPath); +Utils::FilePath sdkLocation(); +void setSdkLocation(const Utils::FilePath &sdkLocation); +QVersionNumber sdkToolsVersion(); +QVersionNumber buildToolsVersion(); +QStringList sdkManagerToolArgs(); +void setSdkManagerToolArgs(const QStringList &args); - QUrl sdkToolsUrl() const { return m_sdkToolsUrl; } - QByteArray getSdkToolsSha256() const { return m_sdkToolsSha256; } +Utils::FilePath ndkLocation(const QtSupport::QtVersion *qtVersion); +QVersionNumber ndkVersion(const QtSupport::QtVersion *qtVersion); +QVersionNumber ndkVersion(const Utils::FilePath &ndkPath); - QStringList defaultEssentials() const; - QStringList essentialsFromQtVersion(const QtSupport::QtVersion &version) const; - QStringList allEssentials() const; - bool allEssentialsInstalled(Internal::AndroidSdkManager *sdkManager); - bool sdkToolsOk() const; +QUrl sdkToolsUrl(); +QByteArray getSdkToolsSha256(); - Utils::FilePath openJDKLocation() const; - void setOpenJDKLocation(const Utils::FilePath &openJDKLocation); +QStringList allEssentials(); +bool allEssentialsInstalled(Internal::AndroidSdkManager *sdkManager); +bool sdkToolsOk(); - QString toolchainHost(const QtSupport::QtVersion *qtVersion) const; - static QString toolchainHostFromNdk(const Utils::FilePath &ndkPath); +Utils::FilePath openJDKLocation(); +void setOpenJDKLocation(const Utils::FilePath &openJDKLocation); - QString emulatorArgs() const; - void setEmulatorArgs(const QString &args); +QString toolchainHost(const QtSupport::QtVersion *qtVersion); +QString toolchainHostFromNdk(const Utils::FilePath &ndkPath); - bool automaticKitCreation() const; - void setAutomaticKitCreation(bool b); +QString emulatorArgs(); +void setEmulatorArgs(const QString &args); - static Utils::FilePath defaultSdkPath(); - Utils::FilePath adbToolPath() const; - Utils::FilePath emulatorToolPath() const; - Utils::FilePath sdkManagerToolPath() const; - Utils::FilePath avdManagerToolPath() const; +bool automaticKitCreation(); +void setAutomaticKitCreation(bool b); - void setTemporarySdkToolsPath(const Utils::FilePath &path); +Utils::FilePath defaultSdkPath(); +Utils::FilePath adbToolPath(); +Utils::FilePath emulatorToolPath(); +Utils::FilePath sdkManagerToolPath(); +Utils::FilePath avdManagerToolPath(); - Utils::FilePath toolchainPath(const QtSupport::QtVersion *qtVersion) const; - static Utils::FilePath toolchainPathFromNdk(const Utils::FilePath &ndkLocation, - Utils::OsType hostOs = Utils::HostOsInfo::hostOs()); - static Utils::FilePath clangPathFromNdk(const Utils::FilePath &ndkLocation); +void setTemporarySdkToolsPath(const Utils::FilePath &path); - static Utils::FilePath makePathFromNdk(const Utils::FilePath &ndkLocation); +Utils::FilePath toolchainPath(const QtSupport::QtVersion *qtVersion); +Utils::FilePath toolchainPathFromNdk( + const Utils::FilePath &ndkLocation, Utils::OsType hostOs = Utils::HostOsInfo::hostOs()); +Utils::FilePath clangPathFromNdk(const Utils::FilePath &ndkLocation); - Utils::FilePath keytoolPath() const; +Utils::FilePath makePathFromNdk(const Utils::FilePath &ndkLocation); - QList<AndroidDeviceInfo> connectedDevices(QString *error = nullptr) const; +Utils::FilePath keytoolPath(); - QString bestNdkPlatformMatch(int target, const QtSupport::QtVersion *qtVersion) const; +QList<AndroidDeviceInfo> connectedDevices(QString *error = nullptr); - static QLatin1String displayName(const ProjectExplorer::Abi &abi); +QString bestNdkPlatformMatch(int target, const QtSupport::QtVersion *qtVersion); - QString getProductModel(const QString &device) const; - bool isConnected(const QString &serialNumber) const; +QLatin1String displayName(const ProjectExplorer::Abi &abi); - bool sdkFullyConfigured() const { return m_sdkFullyConfigured; } - void setSdkFullyConfigured(bool allEssentialsInstalled) { m_sdkFullyConfigured = allEssentialsInstalled; } +QString getProductModel(const QString &device); +bool isConnected(const QString &serialNumber); - static bool isValidNdk(const QString &ndkLocation); - QStringList getCustomNdkList() const; - void addCustomNdk(const QString &customNdk); - void removeCustomNdk(const QString &customNdk); - void setDefaultNdk(const Utils::FilePath &defaultNdk); - Utils::FilePath defaultNdk() const; +bool sdkFullyConfigured(); +void setSdkFullyConfigured(bool allEssentialsInstalled); - Utils::FilePath openSslLocation() const; - void setOpenSslLocation(const Utils::FilePath &openSslLocation); +bool isValidNdk(const QString &ndkLocation); +QStringList getCustomNdkList(); +void addCustomNdk(const QString &customNdk); +void removeCustomNdk(const QString &customNdk); +void setDefaultNdk(const Utils::FilePath &defaultNdk); +Utils::FilePath defaultNdk(); - static Utils::FilePath getJdkPath(); - static QStringList getAbis(const QString &device); - static int getSDKVersion(const QString &device); +Utils::FilePath openSslLocation(); +void setOpenSslLocation(const Utils::FilePath &openSslLocation); - Utils::Environment toolsEnvironment() const; +Utils::FilePath getJdkPath(); +QStringList getAbis(const QString &device); +int getSDKVersion(const QString &device); -private: - Utils::FilePath openJDKBinPath() const; - Utils::FilePath ndkSubPathFromQtVersion(const QtSupport::QtVersion &version) const; // relative! - - void parseDependenciesJson(); - - QList<int> availableNdkPlatforms(const QtSupport::QtVersion *qtVersion) const; - - Utils::FilePath m_sdkLocation; - Utils::FilePath m_temporarySdkToolsPath; - QStringList m_sdkManagerToolArgs; - Utils::FilePath m_openJDKLocation; - Utils::FilePath m_keystoreLocation; - Utils::FilePath m_openSslLocation; - QString m_emulatorArgs; - bool m_automaticKitCreation = true; - QUrl m_sdkToolsUrl; - QByteArray m_sdkToolsSha256; - QStringList m_commonEssentialPkgs; - SdkForQtVersions m_defaultSdkDepends; - QList<SdkForQtVersions> m_specificQtVersions; - QStringList m_customNdkList; - Utils::FilePath m_defaultNdk; - bool m_sdkFullyConfigured = false; - - //caches - mutable QHash<QString, QString> m_serialNumberToDeviceName; -}; +Utils::Environment toolsEnvironment(); -AndroidConfig &androidConfig(); +} // namespace AndroidConfig class AndroidConfigurations : public QObject { diff --git a/src/plugins/android/androidcreatekeystorecertificate.cpp b/src/plugins/android/androidcreatekeystorecertificate.cpp index 9cd6d7ee4ae..004ce94f7b8 100644 --- a/src/plugins/android/androidcreatekeystorecertificate.cpp +++ b/src/plugins/android/androidcreatekeystorecertificate.cpp @@ -262,8 +262,8 @@ void AndroidCreateKeystoreCertificate::buttonBoxAccepted() if (!m_stateNameLineEdit->text().isEmpty()) distinguishedNames += QLatin1String(", S=") + m_stateNameLineEdit->text().replace(',', QLatin1String("\\,")); - const CommandLine command(androidConfig().keytoolPath(), - { "-genkey", "-keyalg", "RSA", + const CommandLine command(AndroidConfig::keytoolPath(), + {"-genkey", "-keyalg", "RSA", "-keystore", m_keystoreFilePath.toString(), "-storepass", keystorePassword(), "-alias", certificateAlias(), diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp index cea404ef6f2..cb3d58a0682 100644 --- a/src/plugins/android/androiddebugsupport.cpp +++ b/src/plugins/android/androiddebugsupport.cpp @@ -110,8 +110,7 @@ void AndroidDebugSupport::start() QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(kit); if (!HostOsInfo::isWindowsHost() - && (qtVersion - && androidConfig().ndkVersion(qtVersion) >= QVersionNumber(11, 0, 0))) { + && (qtVersion && AndroidConfig::ndkVersion(qtVersion) >= QVersionNumber(11, 0, 0))) { qCDebug(androidDebugSupportLog) << "UseTargetAsync: " << true; setUseTargetAsync(true); } @@ -165,7 +164,7 @@ void AndroidDebugSupport::start() int sdkVersion = qMax(AndroidManager::minimumSDK(kit), minimumNdk); if (qtVersion) { - const FilePath ndkLocation = androidConfig().ndkLocation(qtVersion); + const FilePath ndkLocation = AndroidConfig::ndkLocation(qtVersion); FilePath sysRoot = ndkLocation / "platforms" / QString("android-%1").arg(sdkVersion) diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 489f25ccddb..f748be78bcb 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -297,7 +297,7 @@ bool AndroidDeployQtStep::init() m_apkPath = FilePath::fromString(node->data(Constants::AndroidApk).toString()); if (!m_apkPath.isEmpty()) { m_manifestName = FilePath::fromString(node->data(Constants::AndroidManifest).toString()); - m_command = androidConfig().adbToolPath(); + m_command = AndroidConfig::adbToolPath(); AndroidManager::setManifestPath(target(), m_manifestName); } else { QString jsonFile = AndroidQtVersion::androidDeploymentSettings(target()).toString(); @@ -335,13 +335,13 @@ bool AndroidDeployQtStep::init() } } else { m_uninstallPreviousPackageRun = true; - m_command = androidConfig().adbToolPath(); + m_command = AndroidConfig::adbToolPath(); m_apkPath = AndroidManager::packagePath(target()); m_workingDirectory = bc ? AndroidManager::buildDirectory(target()): FilePath(); } m_environment = bc ? bc->environment() : Environment(); - m_adbPath = androidConfig().adbToolPath(); + m_adbPath = AndroidConfig::adbToolPath(); // Start the AVD if not running. if (!m_avdName.isEmpty() && AndroidAvdManager::findAvd(m_avdName).isEmpty()) diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 09ec2c837d9..c5b7b78a80f 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -53,7 +53,7 @@ static constexpr char wifiDevicePort[] = "5555"; static QString displayNameFromInfo(const AndroidDeviceInfo &info) { - return info.type == IDevice::Hardware ? androidConfig().getProductModel(info.serialNumber) + return info.type == IDevice::Hardware ? AndroidConfig::getProductModel(info.serialNumber) : info.avdName; } @@ -415,7 +415,7 @@ void AndroidDevice::initAvdSettings() void AndroidDeviceManager::updateAvdList() { - if (androidConfig().adbToolPath().exists()) + if (AndroidConfig::adbToolPath().exists()) m_avdListRunner.start(m_avdListRecipe); } @@ -446,7 +446,7 @@ void AndroidDeviceManager::updateDeviceState(const ProjectExplorer::IDevice::Con expected_str<void> AndroidDeviceManager::createAvd(const CreateAvdInfo &info, bool force) { - CommandLine cmd(androidConfig().avdManagerToolPath(), {"create", "avd", "-n", info.name}); + CommandLine cmd(AndroidConfig::avdManagerToolPath(), {"create", "avd", "-n", info.name}); cmd.addArgs({"-k", info.sdkStylePath}); if (info.sdcardSize > 0) cmd.addArgs({"-c", QString("%1M").arg(info.sdcardSize)}); @@ -460,7 +460,7 @@ expected_str<void> AndroidDeviceManager::createAvd(const CreateAvdInfo &info, bo Process process; process.setProcessMode(ProcessMode::Writer); - process.setEnvironment(androidConfig().toolsEnvironment()); + process.setEnvironment(AndroidConfig::toolsEnvironment()); process.setCommand(cmd); process.setWriteData("yes\n"); // yes to "Do you wish to create a custom hardware profile" @@ -521,9 +521,9 @@ void AndroidDeviceManager::eraseAvd(const IDevice::Ptr &device, QWidget *parent) qCDebug(androidDeviceLog) << QString("Erasing Android AVD \"%1\" from the system.").arg(name); m_removeAvdProcess.reset(new Process); - const CommandLine command(androidConfig().avdManagerToolPath(), {"delete", "avd", "-n", name}); + const CommandLine command(AndroidConfig::avdManagerToolPath(), {"delete", "avd", "-n", name}); qCDebug(androidDeviceLog).noquote() << "Running command (removeAvd):" << command.toUserOutput(); - m_removeAvdProcess->setEnvironment(androidConfig().toolsEnvironment()); + m_removeAvdProcess->setEnvironment(AndroidConfig::toolsEnvironment()); m_removeAvdProcess->setCommand(command); connect(m_removeAvdProcess.get(), &Process::done, this, [this, device] { const QString name = device->displayName(); @@ -618,7 +618,7 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent) dialog.setLabelText(Tr::tr("Emulator command-line startup options " "(<a href=\"%1\">Help Web Page</a>):") .arg(helpUrl)); - dialog.setTextValue(androidConfig().emulatorArgs()); + dialog.setTextValue(AndroidConfig::emulatorArgs()); if (auto label = dialog.findChild<QLabel*>()) { label->setOpenExternalLinks(true); @@ -628,12 +628,12 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent) if (dialog.exec() != QDialog::Accepted) return; - androidConfig().setEmulatorArgs(dialog.textValue()); + AndroidConfig::setEmulatorArgs(dialog.textValue()); } QString AndroidDeviceManager::getRunningAvdsSerialNumber(const QString &name) const { - for (const AndroidDeviceInfo &dev : androidConfig().connectedDevices()) { + for (const AndroidDeviceInfo &dev : AndroidConfig::connectedDevices()) { if (!dev.serialNumber.startsWith("emulator")) continue; const QString stdOut = emulatorName(dev.serialNumber); @@ -661,7 +661,7 @@ static FilePath avdFilePath() void AndroidDeviceManager::setupDevicesWatcher() { - if (!androidConfig().adbToolPath().exists()) { + if (!AndroidConfig::adbToolPath().exists()) { qCDebug(androidDeviceLog) << "Cannot start ADB device watcher" << "because adb path does not exist."; return; @@ -693,10 +693,10 @@ void AndroidDeviceManager::setupDevicesWatcher() handleDevicesListChange(output); }); - const CommandLine command{androidConfig().adbToolPath(), {"track-devices"}}; + const CommandLine command{AndroidConfig::adbToolPath(), {"track-devices"}}; m_adbDeviceWatcherProcess->setCommand(command); m_adbDeviceWatcherProcess->setWorkingDirectory(command.executable().parentDir()); - m_adbDeviceWatcherProcess->setEnvironment(androidConfig().toolsEnvironment()); + m_adbDeviceWatcherProcess->setEnvironment(AndroidConfig::toolsEnvironment()); m_adbDeviceWatcherProcess->start(); // Setup AVD filesystem watcher to listen for changes when an avd is created/deleted, @@ -838,7 +838,7 @@ void AndroidDeviceManager::handleDevicesListChange(const QString &serialNumber) devMgr->setDeviceState(avdId, state); } else { const Id id = Id(Constants::ANDROID_DEVICE_ID).withSuffix(':' + serial); - QString displayName = androidConfig().getProductModel(serial); + QString displayName = AndroidConfig::getProductModel(serial); // Check if the device is connected via WiFi. A sample serial of such devices can be // like: "192.168.1.190:5555" static const auto ipRegex = QRegularExpression(ipRegexStr + QStringLiteral(":(\\d{1,5})")); @@ -921,16 +921,16 @@ AndroidDeviceManager::AndroidDeviceManager(QObject *parent) }); const auto onProcessSetup = [](Process &process) { - const CommandLine cmd(androidConfig().avdManagerToolPath(), {"list", "avd"}); + const CommandLine cmd(AndroidConfig::avdManagerToolPath(), {"list", "avd"}); qCDebug(androidDeviceLog).noquote() << "Running AVD Manager command:" << cmd.toUserOutput(); - process.setEnvironment(androidConfig().toolsEnvironment()); + process.setEnvironment(AndroidConfig::toolsEnvironment()); process.setCommand(cmd); }; const auto onProcessDone = [this, storage](const Process &process, DoneWith result) { const QString output = process.allOutput(); if (result != DoneWith::Success) { qCDebug(androidDeviceLog) - << "Avd list command failed" << output << androidConfig().sdkToolsVersion(); + << "Avd list command failed" << output << AndroidConfig::sdkToolsVersion(); return DoneResult::Error; } @@ -981,7 +981,7 @@ public: ":/android/images/androiddevice.png"); setConstructionFunction(&AndroidDevice::create); setCreator([] { - if (!androidConfig().sdkToolsOk()) { + if (!AndroidConfig::sdkToolsOk()) { AndroidDeviceWidget::infoDialog(Tr::tr("Android support is not yet configured.")); return IDevice::Ptr(); } diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 2b7b49933d1..9e8274d2f45 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -202,25 +202,23 @@ QJsonObject deploymentSettings(const Target *target) QJsonObject settings; settings["_description"] = qtcSignature; settings["qt"] = qt->prefix().toString(); - settings["ndk"] = androidConfig().ndkLocation(qt).toString(); - settings["sdk"] = androidConfig().sdkLocation().toString(); + settings["ndk"] = AndroidConfig::ndkLocation(qt).toString(); + settings["sdk"] = AndroidConfig::sdkLocation().toString(); if (!qt->supportsMultipleQtAbis()) { const QStringList abis = applicationAbis(target); QTC_ASSERT(abis.size() == 1, return {}); - settings["stdcpp-path"] = (androidConfig().toolchainPath(qt) + settings["stdcpp-path"] = (AndroidConfig::toolchainPath(qt) / "sysroot/usr/lib" / archTriplet(abis.first()) / "libc++_shared.so").toString(); } else { - settings["stdcpp-path"] = androidConfig() - .toolchainPath(qt) - .pathAppended("sysroot/usr/lib") - .toString(); + settings["stdcpp-path"] + = AndroidConfig::toolchainPath(qt).pathAppended("sysroot/usr/lib").toString(); } settings["toolchain-prefix"] = "llvm"; settings["tool-prefix"] = "llvm"; settings["useLLVM"] = true; - settings["ndk-host"] = androidConfig().toolchainHost(qt); + settings["ndk-host"] = AndroidConfig::toolchainHost(qt); return settings; } @@ -584,7 +582,7 @@ bool checkKeystorePassword(const FilePath &keystorePath, const QString &keystore { if (keystorePasswd.isEmpty()) return false; - const CommandLine cmd(androidConfig().keytoolPath(), + const CommandLine cmd(AndroidConfig::keytoolPath(), {"-list", "-keystore", keystorePath.toUserOutput(), "--storepass", keystorePasswd}); Process proc; @@ -605,7 +603,7 @@ bool checkCertificatePassword(const FilePath &keystorePath, const QString &keyst arguments << certificatePasswd; Process proc; - proc.setCommand({androidConfig().keytoolPath(), arguments}); + proc.setCommand({AndroidConfig::keytoolPath(), arguments}); proc.runBlocking(10s); return proc.result() == ProcessResult::FinishedWithSuccess; } @@ -618,7 +616,7 @@ bool checkCertificateExists(const FilePath &keystorePath, const QString &keystor "--storepass", keystorePasswd, "-alias", alias}; Process proc; - proc.setCommand({androidConfig().keytoolPath(), arguments}); + proc.setCommand({AndroidConfig::keytoolPath(), arguments}); proc.runBlocking(10s); return proc.result() == ProcessResult::FinishedWithSuccess; } @@ -626,7 +624,7 @@ bool checkCertificateExists(const FilePath &keystorePath, const QString &keystor Process *startAdbProcess(const QStringList &args, QString *err) { std::unique_ptr<Process> process(new Process); - const FilePath adb = androidConfig().adbToolPath(); + const FilePath adb = AndroidConfig::adbToolPath(); const CommandLine command{adb, args}; qCDebug(androidManagerLog).noquote() << "Running command (async):" << command.toUserOutput(); process->setCommand(command); @@ -664,7 +662,7 @@ static SdkToolResult runCommand(const CommandLine &command, const QByteArray &wr SdkToolResult runAdbCommand(const QStringList &args, const QByteArray &writeData, int timeoutS) { - return runCommand({androidConfig().adbToolPath(), args}, writeData, timeoutS); + return runCommand({AndroidConfig::adbToolPath(), args}, writeData, timeoutS); } } // namespace Android::AndroidManager diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp index 608f0b5262e..049cd67404d 100644 --- a/src/plugins/android/androidmanifesteditorwidget.cpp +++ b/src/plugins/android/androidmanifesteditorwidget.cpp @@ -592,7 +592,7 @@ void AndroidManifestEditorWidget::postSave() const FilePath docPath = m_textEditorWidget->textDocument()->filePath(); if (Target *target = androidTarget(docPath)) { if (BuildConfiguration *bc = target->activeBuildConfiguration()) { - QString androidNdkPlatform = androidConfig().bestNdkPlatformMatch( + QString androidNdkPlatform = AndroidConfig::bestNdkPlatformMatch( AndroidManager::minimumSDK(target), QtSupport::QtKitAspect::qtVersion( androidTarget(m_textEditorWidget->textDocument()->filePath())->kit())); diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index e1217188bb7..8257cb511a3 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -135,7 +135,7 @@ class AndroidPlugin final : public ExtensionSystem::IPlugin return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE); }).isEmpty(); - if (!androidConfig().sdkFullyConfigured() && qtForAndroidInstalled) + if (!AndroidConfig::sdkFullyConfigured() && qtForAndroidInstalled) askUserAboutAndroidSetup(); AndroidConfigurations::registerNewToolchains(); diff --git a/src/plugins/android/androidqmlpreviewworker.cpp b/src/plugins/android/androidqmlpreviewworker.cpp index fdf829fc515..5570e540966 100644 --- a/src/plugins/android/androidqmlpreviewworker.cpp +++ b/src/plugins/android/androidqmlpreviewworker.cpp @@ -128,7 +128,7 @@ FilePath AndroidQmlPreviewWorker::designViewerApkPath(const QString &abi) const CommandLine AndroidQmlPreviewWorker::adbCommand(const QStringList &arguments) const { - CommandLine cmd{androidConfig().adbToolPath()}; + CommandLine cmd{AndroidConfig::adbToolPath()}; if (!m_serialNumber.isEmpty()) cmd.addArgs(AndroidDeviceInfo::adbSelector(m_serialNumber)); cmd.addArg("shell"); @@ -200,7 +200,7 @@ void AndroidQmlPreviewWorker::startLogcat() QString args = QString("logcat --pid=%1").arg(m_viewerPid); if (!m_logcatStartTimeStamp.isEmpty()) args += QString(" -T '%1'").arg(m_logcatStartTimeStamp); - CommandLine cmd(androidConfig().adbToolPath()); + CommandLine cmd(AndroidConfig::adbToolPath()); cmd.setArguments(args); m_logcatProcess.setCommand(cmd); m_logcatProcess.setUseCtrlCStub(true); diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index eb9f1801380..67232b0c9d2 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -61,9 +61,9 @@ QString AndroidQtVersion::invalidReason() const { QString tmp = QtVersion::invalidReason(); if (tmp.isEmpty()) { - if (androidConfig().ndkLocation(this).isEmpty()) + if (AndroidConfig::ndkLocation(this).isEmpty()) return Tr::tr("NDK is not configured in Devices > Android."); - if (androidConfig().sdkLocation().isEmpty()) + if (AndroidConfig::sdkLocation().isEmpty()) return Tr::tr("SDK is not configured in Devices > Android."); if (qtAbis().isEmpty()) return Tr::tr("Failed to detect the ABIs used by the Qt version. Check the settings in " @@ -79,7 +79,7 @@ bool AndroidQtVersion::supportsMultipleQtAbis() const Abis AndroidQtVersion::detectQtAbis() const { - const bool conf = androidConfig().sdkFullyConfigured(); + const bool conf = AndroidConfig::sdkFullyConfigured(); return conf ? Utils::transform<Abis>(androidAbis(), &AndroidManager::androidAbi2Abi) : Abis(); } @@ -87,18 +87,17 @@ void AndroidQtVersion::addToEnvironment(const Kit *k, Utils::Environment &env) c { QtVersion::addToEnvironment(k, env); - const AndroidConfig &config = androidConfig(); // this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info) - env.set(QLatin1String("ANDROID_NDK_HOST"), config.toolchainHost(this)); - env.set(QLatin1String("ANDROID_NDK_ROOT"), config.ndkLocation(this).toUserOutput()); + env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfig::toolchainHost(this)); + env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfig::ndkLocation(this).toUserOutput()); env.set(QLatin1String("ANDROID_NDK_PLATFORM"), - config.bestNdkPlatformMatch(qMax(minimumNDK(), AndroidManager::minimumSDK(k)), this)); + AndroidConfig::bestNdkPlatformMatch(qMax(minimumNDK(), AndroidManager::minimumSDK(k)), this)); } void AndroidQtVersion::setupQmakeRunEnvironment(Utils::Environment &env) const { env.set(QLatin1String("ANDROID_NDK_ROOT"), - androidConfig().ndkLocation(this).toUserOutput()); + AndroidConfig::ndkLocation(this).toUserOutput()); } QString AndroidQtVersion::description() const diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 4f3448c6765..260bef647f5 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -184,7 +184,7 @@ void AndroidRunner::checkAVD() m_checkAVDTimer.stop(); AndroidManager::setDeviceSerialNumber(m_target, serialNumber); emit asyncStart(); - } else if (!androidConfig().isConnected(serialNumber)) { + } else if (!AndroidConfig::isConnected(serialNumber)) { // device was disconnected m_checkAVDTimer.stop(); } diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 30e0a3b14fb..7202c93f4cf 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -93,11 +93,9 @@ static FilePath debugServer(bool useLldb, const Target *target) QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(target->kit()); QString preferredAbi = AndroidManager::apkDevicePreferredAbi(target); - const AndroidConfig &config = androidConfig(); - if (useLldb) { // Search suitable lldb-server binary. - const FilePath prebuilt = config.ndkLocation(qtVersion) / "toolchains/llvm/prebuilt"; + const FilePath prebuilt = AndroidConfig::ndkLocation(qtVersion) / "toolchains/llvm/prebuilt"; const QString abiNeedle = lldbServerArch2(preferredAbi); // The new, built-in LLDB. @@ -117,7 +115,7 @@ static FilePath debugServer(bool useLldb, const Target *target) return lldbServer; } else { // Search suitable gdbserver binary. - const FilePath path = config.ndkLocation(qtVersion) + const FilePath path = AndroidConfig::ndkLocation(qtVersion) .pathAppended(QString("prebuilt/android-%1/gdbserver/gdbserver") .arg(gdbServerArch(preferredAbi))); if (path.exists()) @@ -429,7 +427,7 @@ void Android::Internal::AndroidRunnerWorker::asyncStartLogcat() } const QStringList logcatArgs = selector() << "logcat" << timeArg; - const FilePath adb = androidConfig().adbToolPath(); + const FilePath adb = AndroidConfig::adbToolPath(); qCDebug(androidRunWorkerLog).noquote() << "Running logcat command (async):" << CommandLine(adb, logcatArgs).toUserOutput(); m_adbLogcatProcess->setCommand({adb, logcatArgs}); @@ -632,7 +630,7 @@ void AndroidRunnerWorker::asyncStart() const Storage<PidUserPair> pidStorage; const LoopUntil iterator([pidStorage](int) { return pidStorage->first <= 0; }); - const FilePath adbPath = androidConfig().adbToolPath(); + const FilePath adbPath = AndroidConfig::adbToolPath(); const QStringList args = selector(); const auto onPidSetup = [adbPath, args, packageName = m_packageName, @@ -710,7 +708,7 @@ void AndroidRunnerWorker::handleJdbWaiting() } m_afterFinishAdbCommands.push_back(removeForward.join(' ')); - const FilePath jdbPath = androidConfig().openJDKLocation() + const FilePath jdbPath = AndroidConfig::openJDKLocation() .pathAppended("bin/jdb").withExecutableSuffix(); QStringList jdbArgs("-connect"); diff --git a/src/plugins/android/androidsdkdownloader.cpp b/src/plugins/android/androidsdkdownloader.cpp index a0b178c5f1d..8f0993363e0 100644 --- a/src/plugins/android/androidsdkdownloader.cpp +++ b/src/plugins/android/androidsdkdownloader.cpp @@ -106,7 +106,7 @@ GroupItem downloadSdkRecipe() Storage<StorageStruct> storage; const auto onSetup = [] { - if (androidConfig().sdkToolsUrl().isEmpty()) { + if (AndroidConfig::sdkToolsUrl().isEmpty()) { logError(Tr::tr("The SDK Tools download URL is empty.")); return SetupResult::StopWithError; } @@ -114,7 +114,7 @@ GroupItem downloadSdkRecipe() }; const auto onQuerySetup = [storage](NetworkQuery &query) { - query.setRequest(QNetworkRequest(androidConfig().sdkToolsUrl())); + query.setRequest(QNetworkRequest(AndroidConfig::sdkToolsUrl())); query.setNetworkAccessManager(NetworkAccessManager::instance()); NetworkQuery *queryPtr = &query; QProgressDialog *progressDialog = storage->progressDialog.get(); @@ -166,7 +166,7 @@ GroupItem downloadSdkRecipe() if (!storage->sdkFileName) return SetupResult::StopWithError; async.setConcurrentCallData(validateFileIntegrity, *storage->sdkFileName, - androidConfig().getSdkToolsSha256()); + AndroidConfig::getSdkToolsSha256()); storage->progressDialog->setRange(0, 0); storage->progressDialog->setLabelText(Tr::tr("Verifying package integrity...")); return SetupResult::Continue; @@ -197,7 +197,7 @@ GroupItem downloadSdkRecipe() logError(Tr::tr("Unarchiving error.")); return; } - androidConfig().setTemporarySdkToolsPath( + AndroidConfig::setTemporarySdkToolsPath( storage->sdkFileName->parentDir().pathAppended(Constants::cmdlineToolsName)); }; const auto onCancelSetup = [storage] { return std::make_pair(storage->progressDialog.get(), diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index d62cc9e50e6..76b4b5db72a 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -113,9 +113,9 @@ private: OutputFormatter *m_formatter = nullptr; }; -static QString sdkRootArg(const AndroidConfig &config) +static QString sdkRootArg() { - return "--sdk_root=" + config.sdkLocation().toString(); + return "--sdk_root=" + AndroidConfig::sdkLocation().toString(); } const QRegularExpression &assertionRegExp() @@ -172,9 +172,9 @@ static GroupItem licensesRecipe(const Storage<DialogStorage> &dialogStorage) "respective licenses are not accepted.") + "\n\n", LogMessageFormat); process.setProcessMode(ProcessMode::Writer); - process.setEnvironment(androidConfig().toolsEnvironment()); - process.setCommand(CommandLine(androidConfig().sdkManagerToolPath(), - {"--licenses", sdkRootArg(androidConfig())})); + process.setEnvironment(AndroidConfig::toolsEnvironment()); + process.setCommand(CommandLine(AndroidConfig::sdkManagerToolPath(), + {"--licenses", sdkRootArg()})); process.setUseCtrlCStub(true); Process *processPtr = &process; @@ -227,9 +227,9 @@ static GroupItem licensesRecipe(const Storage<DialogStorage> &dialogStorage) static void setupSdkProcess(const QStringList &args, Process *process, QuestionProgressDialog *dialog, int current, int total) { - process->setEnvironment(androidConfig().toolsEnvironment()); - process->setCommand({androidConfig().sdkManagerToolPath(), - args + androidConfig().sdkManagerToolArgs()}); + process->setEnvironment(AndroidConfig::toolsEnvironment()); + process->setCommand({AndroidConfig::sdkManagerToolPath(), + args + AndroidConfig::sdkManagerToolArgs()}); QObject::connect(process, &Process::readyReadStandardOutput, dialog, [process, dialog, current, total] { QTextCodec *codec = QTextCodec::codecForLocale(); @@ -269,7 +269,7 @@ static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage, const int total = change.count(); const LoopList uninstallIterator(change.toUninstall); const auto onUninstallSetup = [dialogStorage, uninstallIterator, total](Process &process) { - const QStringList args = {"--uninstall", *uninstallIterator, sdkRootArg(androidConfig())}; + const QStringList args = {"--uninstall", *uninstallIterator, sdkRootArg()}; QuestionProgressDialog *dialog = dialogStorage->m_dialog.get(); setupSdkProcess(args, &process, dialog, uninstallIterator.iteration(), total); dialog->appendMessage(Tr::tr("Uninstalling %1...").arg(*uninstallIterator) + '\n', @@ -280,7 +280,7 @@ static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage, const LoopList installIterator(change.toInstall); const int offset = change.toUninstall.count(); const auto onInstallSetup = [dialogStorage, installIterator, offset, total](Process &process) { - const QStringList args = {*installIterator, sdkRootArg(androidConfig())}; + const QStringList args = {*installIterator, sdkRootArg()}; QuestionProgressDialog *dialog = dialogStorage->m_dialog.get(); setupSdkProcess(args, &process, dialog, offset + installIterator.iteration(), total); dialog->appendMessage(Tr::tr("Installing %1...").arg(*installIterator) + '\n', @@ -310,7 +310,7 @@ static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage, static GroupItem updateRecipe(const Storage<DialogStorage> &dialogStorage) { const auto onUpdateSetup = [dialogStorage](Process &process) { - const QStringList args = {"--update", sdkRootArg(androidConfig())}; + const QStringList args = {"--update", sdkRootArg()}; QuestionProgressDialog *dialog = dialogStorage->m_dialog.get(); setupSdkProcess(args, &process, dialog, 0, 1); dialog->appendMessage(Tr::tr("Updating installed packages....") + '\n', NormalMessageFormat); @@ -369,7 +369,7 @@ const AndroidSdkPackageList &AndroidSdkManager::allSdkPackages() QStringList AndroidSdkManager::notFoundEssentialSdkPackages() { - QStringList essentials = androidConfig().allEssentials(); + QStringList essentials = AndroidConfig::allEssentials(); const AndroidSdkPackageList &packages = allSdkPackages(); for (AndroidSdkPackage *package : packages) { essentials.removeOne(package->sdkStylePath()); @@ -381,7 +381,7 @@ QStringList AndroidSdkManager::notFoundEssentialSdkPackages() QStringList AndroidSdkManager::missingEssentialSdkPackages() { - const QStringList essentials = androidConfig().allEssentials(); + const QStringList essentials = AndroidConfig::allEssentials(); const AndroidSdkPackageList &packages = allSdkPackages(); QStringList missingPackages; for (AndroidSdkPackage *package : packages) { @@ -461,7 +461,7 @@ BuildToolsList AndroidSdkManager::filteredBuildTools(int minApiLevel, void AndroidSdkManager::refreshPackages() { - if (androidConfig().sdkManagerToolPath() != m_d->lastSdkManagerPath) + if (AndroidConfig::sdkManagerToolPath() != m_d->lastSdkManagerPath) reloadPackages(); } @@ -479,14 +479,14 @@ bool AndroidSdkManager::packageListingSuccessful() const Runs the \c sdkmanger tool with arguments \a args. Returns \c true if the command is successfully executed. Output is copied into \a output. The function blocks the calling thread. */ -static bool sdkManagerCommand(const AndroidConfig &config, const QStringList &args, QString *output) +static bool sdkManagerCommand(const QStringList &args, QString *output) { QStringList newArgs = args; - newArgs.append(sdkRootArg(config)); + newArgs.append(sdkRootArg()); Process proc; - proc.setEnvironment(config.toolsEnvironment()); + proc.setEnvironment(AndroidConfig::toolsEnvironment()); proc.setTimeOutMessageBoxEnabled(true); - proc.setCommand({config.sdkManagerToolPath(), newArgs}); + proc.setCommand({AndroidConfig::sdkManagerToolPath(), newArgs}); qCDebug(sdkManagerLog).noquote() << "Running SDK Manager command (sync):" << proc.commandLine().toUserOutput(); proc.runBlocking(60s, EventLoopMode::On); @@ -516,10 +516,10 @@ void AndroidSdkManagerPrivate::reloadSdkPackages() qDeleteAll(m_allPackages); m_allPackages.clear(); - lastSdkManagerPath = androidConfig().sdkManagerToolPath(); + lastSdkManagerPath = AndroidConfig::sdkManagerToolPath(); m_packageListingSuccessful = false; - if (androidConfig().sdkToolsVersion().isNull()) { + if (AndroidConfig::sdkToolsVersion().isNull()) { // Configuration has invalid sdk path or corrupt installation. emit m_sdkManager.packageReloadFinished(); return; @@ -527,8 +527,8 @@ void AndroidSdkManagerPrivate::reloadSdkPackages() QString packageListing; QStringList args({"--list", "--verbose"}); - args << androidConfig().sdkManagerToolArgs(); - m_packageListingSuccessful = sdkManagerCommand(androidConfig(), args, &packageListing); + args << AndroidConfig::sdkManagerToolArgs(); + m_packageListingSuccessful = sdkManagerCommand(args, &packageListing); if (m_packageListingSuccessful) { SdkManagerOutputParser parser(m_allPackages); parser.parsePackageListing(packageListing); diff --git a/src/plugins/android/androidsdkmanagerdialog.cpp b/src/plugins/android/androidsdkmanagerdialog.cpp index a2297bdac3a..8ae1cfd77b5 100644 --- a/src/plugins/android/androidsdkmanagerdialog.cpp +++ b/src/plugins/android/androidsdkmanagerdialog.cpp @@ -40,9 +40,9 @@ public: m_argumentDetailsEdit = new QPlainTextEdit; m_argumentDetailsEdit->setReadOnly(true); - m_process.setEnvironment(androidConfig().toolsEnvironment()); - m_process.setCommand({androidConfig().sdkManagerToolPath(), - {"--help", "--sdk_root=" + androidConfig().sdkLocation().toString()}}); + m_process.setEnvironment(AndroidConfig::toolsEnvironment()); + m_process.setCommand({AndroidConfig::sdkManagerToolPath(), + {"--help", "--sdk_root=" + AndroidConfig::sdkLocation().toString()}}); connect(&m_process, &Process::done, this, [this] { const QString output = m_process.allOutput(); QString argumentDetails; @@ -64,7 +64,7 @@ public: connect(dialogButtons, &QDialogButtonBox::rejected, this, &OptionsDialog::reject); m_argumentsEdit = new QLineEdit; - m_argumentsEdit->setText(androidConfig().sdkManagerToolArgs().join(" ")); + m_argumentsEdit->setText(AndroidConfig::sdkManagerToolArgs().join(" ")); using namespace Layouting; @@ -235,8 +235,8 @@ AndroidSdkManagerDialog::AndroidSdkManagerDialog(AndroidSdkManager *sdkManager, OptionsDialog dlg(m_sdkManager, this); if (dlg.exec() == QDialog::Accepted) { QStringList arguments = dlg.sdkManagerArguments(); - if (arguments != androidConfig().sdkManagerToolArgs()) { - androidConfig().setSdkManagerToolArgs(arguments); + if (arguments != AndroidConfig::sdkManagerToolArgs()) { + AndroidConfig::setSdkManagerToolArgs(arguments); m_sdkManager->reloadPackages(); } } @@ -244,19 +244,19 @@ AndroidSdkManagerDialog::AndroidSdkManagerDialog(AndroidSdkManager *sdkManager, connect(obsoleteCheckBox, &QCheckBox::stateChanged, this, [this](int state) { const QString obsoleteArg = "--include_obsolete"; - QStringList args = androidConfig().sdkManagerToolArgs(); + QStringList args = AndroidConfig::sdkManagerToolArgs(); if (state == Qt::Checked && !args.contains(obsoleteArg)) { args.append(obsoleteArg); - androidConfig().setSdkManagerToolArgs(args); + AndroidConfig::setSdkManagerToolArgs(args); } else if (state == Qt::Unchecked && args.contains(obsoleteArg)) { args.removeAll(obsoleteArg); - androidConfig().setSdkManagerToolArgs(args); + AndroidConfig::setSdkManagerToolArgs(args); } m_sdkManager->reloadPackages(); }); connect(channelCheckbox, &QComboBox::currentIndexChanged, this, [this](int index) { - QStringList args = androidConfig().sdkManagerToolArgs(); + QStringList args = AndroidConfig::sdkManagerToolArgs(); QString existingArg; for (int i = 0; i < 4; ++i) { const QString arg = "--channel=" + QString::number(i); @@ -268,17 +268,17 @@ AndroidSdkManagerDialog::AndroidSdkManagerDialog(AndroidSdkManager *sdkManager, if (index == 0 && !existingArg.isEmpty()) { args.removeAll(existingArg); - androidConfig().setSdkManagerToolArgs(args); + AndroidConfig::setSdkManagerToolArgs(args); } else if (index > 0) { // Add 1 to account for Stable (second item) being channel 0 const QString channelArg = "--channel=" + QString::number(index - 1); if (existingArg != channelArg) { if (!existingArg.isEmpty()) { args.removeAll(existingArg); - androidConfig().setSdkManagerToolArgs(args); + AndroidConfig::setSdkManagerToolArgs(args); } args.append(channelArg); - androidConfig().setSdkManagerToolArgs(args); + AndroidConfig::setSdkManagerToolArgs(args); } } m_sdkManager->reloadPackages(); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 8a01427f822..cdfdd5c029a 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -314,7 +314,7 @@ AndroidSettingsWidget::AndroidSettingsWidget() "and extracted to the selected path.\n" "After the SDK Tools are properly set up, you are prompted to install any essential\n" "packages required for Qt to build for Android.") - .arg(androidConfig().sdkToolsUrl().toString())); + .arg(AndroidConfig::sdkToolsUrl().toString())); auto sdkManagerToolButton = new QPushButton(Tr::tr("SDK Manager")); @@ -380,22 +380,22 @@ AndroidSettingsWidget::AndroidSettingsWidget() connect(m_openJdkLocationPathChooser, &PathChooser::rawPathChanged, this, &AndroidSettingsWidget::validateJdk); - if (androidConfig().openJDKLocation().isEmpty()) - androidConfig().setOpenJDKLocation(AndroidConfig::getJdkPath()); - m_openJdkLocationPathChooser->setFilePath(androidConfig().openJDKLocation()); + if (AndroidConfig::openJDKLocation().isEmpty()) + AndroidConfig::setOpenJDKLocation(AndroidConfig::getJdkPath()); + m_openJdkLocationPathChooser->setFilePath(AndroidConfig::openJDKLocation()); m_openJdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select JDK Path")); - if (androidConfig().sdkLocation().isEmpty()) - androidConfig().setSdkLocation(AndroidConfig::defaultSdkPath()); - m_sdkLocationPathChooser->setFilePath(androidConfig().sdkLocation()); + if (AndroidConfig::sdkLocation().isEmpty()) + AndroidConfig::setSdkLocation(AndroidConfig::defaultSdkPath()); + m_sdkLocationPathChooser->setFilePath(AndroidConfig::sdkLocation()); m_sdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select Android SDK Folder")); m_openSslPathChooser->setPromptDialogTitle(Tr::tr("Select OpenSSL Include Project File")); - if (androidConfig().openSslLocation().isEmpty()) - androidConfig().setOpenSslLocation(androidConfig().sdkLocation() / ("android_openssl")); - m_openSslPathChooser->setFilePath(androidConfig().openSslLocation()); + if (AndroidConfig::openSslLocation().isEmpty()) + AndroidConfig::setOpenSslLocation(AndroidConfig::sdkLocation() / ("android_openssl")); + m_openSslPathChooser->setFilePath(AndroidConfig::openSslLocation()); - m_createKitCheckBox->setChecked(androidConfig().automaticKitCreation()); + m_createKitCheckBox->setChecked(AndroidConfig::automaticKitCreation()); downloadNdkToolButton->setIcon(downloadIcon); @@ -454,21 +454,21 @@ AndroidSettingsWidget::AndroidSettingsWidget() connect(m_ndkListWidget, &QListWidget::currentTextChanged, this, [this, removeCustomNdkButton](const QString &ndk) { updateUI(); - removeCustomNdkButton->setEnabled(androidConfig().getCustomNdkList().contains(ndk)); + removeCustomNdkButton->setEnabled(AndroidConfig::getCustomNdkList().contains(ndk)); }); connect(addCustomNdkButton, &QPushButton::clicked, this, &AndroidSettingsWidget::addCustomNdkItem); connect(removeCustomNdkButton, &QPushButton::clicked, this, [this] { if (isDefaultNdkSelected()) - androidConfig().setDefaultNdk({}); - androidConfig().removeCustomNdk(m_ndkListWidget->currentItem()->text()); + AndroidConfig::setDefaultNdk({}); + AndroidConfig::removeCustomNdk(m_ndkListWidget->currentItem()->text()); m_ndkListWidget->takeItem(m_ndkListWidget->currentRow()); }); connect(m_makeDefaultNdkButton, &QPushButton::clicked, this, [this] { const FilePath defaultNdk = isDefaultNdkSelected() ? FilePath() : FilePath::fromUserInput(m_ndkListWidget->currentItem()->text()); - androidConfig().setDefaultNdk(defaultNdk); + AndroidConfig::setDefaultNdk(defaultNdk); updateUI(); }); @@ -503,7 +503,7 @@ AndroidSettingsWidget::AndroidSettingsWidget() if (result != Tasking::DoneWith::Success) return; // Make sure the sdk path is created before installing packages - const FilePath sdkPath = androidConfig().sdkLocation(); + const FilePath sdkPath = AndroidConfig::sdkLocation(); if (!sdkPath.createDir()) { QMessageBox::warning(this, Android::Internal::dialogTitle(), Tr::tr("Failed to create the SDK Tools path %1.") @@ -543,12 +543,12 @@ void AndroidSettingsWidget::updateNdkList() ndk->installedLocation().toUserOutput())); } - const auto customNdks = androidConfig().getCustomNdkList(); + const auto customNdks = AndroidConfig::getCustomNdkList(); for (const QString &ndk : customNdks) { if (AndroidConfig::isValidNdk(ndk)) { m_ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndk)); } else { - androidConfig().removeCustomNdk(ndk); + AndroidConfig::removeCustomNdk(ndk); } } @@ -564,7 +564,7 @@ void AndroidSettingsWidget::addCustomNdkItem() const QString ndkPath = QFileDialog::getExistingDirectory(this, Tr::tr("Select an NDK"), homePath); if (AndroidConfig::isValidNdk(ndkPath)) { - androidConfig().addCustomNdk(ndkPath); + AndroidConfig::addCustomNdk(ndkPath); if (m_ndkListWidget->findItems(ndkPath, Qt::MatchExactly).size() == 0) { m_ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndkPath)); } @@ -582,9 +582,9 @@ void AndroidSettingsWidget::addCustomNdkItem() bool AndroidSettingsWidget::isDefaultNdkSelected() const { - if (!androidConfig().defaultNdk().isEmpty()) { + if (!AndroidConfig::defaultNdk().isEmpty()) { if (const QListWidgetItem *item = m_ndkListWidget->currentItem()) { - return FilePath::fromUserInput(item->text()) == androidConfig().defaultNdk(); + return FilePath::fromUserInput(item->text()) == AndroidConfig::defaultNdk(); } } return false; @@ -592,8 +592,8 @@ bool AndroidSettingsWidget::isDefaultNdkSelected() const void AndroidSettingsWidget::validateJdk() { - androidConfig().setOpenJDKLocation(m_openJdkLocationPathChooser->filePath()); - expected_str<void> test = testJavaC(androidConfig().openJDKLocation()); + AndroidConfig::setOpenJDKLocation(m_openJdkLocationPathChooser->filePath()); + expected_str<void> test = testJavaC(AndroidConfig::openJDKLocation()); m_androidSummary->setPointValid(JavaPathExistsAndWritableRow, test); @@ -605,14 +605,14 @@ void AndroidSettingsWidget::validateJdk() void AndroidSettingsWidget::validateOpenSsl() { - androidConfig().setOpenSslLocation(m_openSslPathChooser->filePath()); + AndroidConfig::setOpenSslLocation(m_openSslPathChooser->filePath()); - m_openSslSummary->setPointValid(OpenSslPathExistsRow, androidConfig().openSslLocation().exists()); + m_openSslSummary->setPointValid(OpenSslPathExistsRow, AndroidConfig::openSslLocation().exists()); - const bool priFileExists = androidConfig().openSslLocation().pathAppended("openssl.pri").exists(); + const bool priFileExists = AndroidConfig::openSslLocation().pathAppended("openssl.pri").exists(); m_openSslSummary->setPointValid(OpenSslPriPathExists, priFileExists); const bool cmakeListsExists - = androidConfig().openSslLocation().pathAppended("CMakeLists.txt").exists(); + = AndroidConfig::openSslLocation().pathAppended("CMakeLists.txt").exists(); m_openSslSummary->setPointValid(OpenSslCmakeListsPathExists, cmakeListsExists); updateUI(); @@ -621,8 +621,8 @@ void AndroidSettingsWidget::validateOpenSsl() void AndroidSettingsWidget::onSdkPathChanged() { const FilePath sdkPath = m_sdkLocationPathChooser->filePath().cleanPath(); - androidConfig().setSdkLocation(sdkPath); - FilePath currentOpenSslPath = androidConfig().openSslLocation(); + AndroidConfig::setSdkLocation(sdkPath); + FilePath currentOpenSslPath = AndroidConfig::openSslLocation(); if (currentOpenSslPath.isEmpty() || !currentOpenSslPath.exists()) currentOpenSslPath = sdkPath.pathAppended("android_openssl"); m_openSslPathChooser->setFilePath(currentOpenSslPath); @@ -633,24 +633,24 @@ void AndroidSettingsWidget::onSdkPathChanged() void AndroidSettingsWidget::validateSdk() { const FilePath sdkPath = m_sdkLocationPathChooser->filePath().cleanPath(); - androidConfig().setSdkLocation(sdkPath); + AndroidConfig::setSdkLocation(sdkPath); - const FilePath path = androidConfig().sdkLocation(); + const FilePath path = AndroidConfig::sdkLocation(); m_androidSummary->setPointValid(SdkPathExistsAndWritableRow, path.exists() && path.isWritableDir()); m_androidSummary->setPointValid(SdkToolsInstalledRow, - !androidConfig().sdkToolsVersion().isNull()); + !AndroidConfig::sdkToolsVersion().isNull()); m_androidSummary->setPointValid(PlatformToolsInstalledRow, - androidConfig().adbToolPath().exists()); + AndroidConfig::adbToolPath().exists()); m_androidSummary->setPointValid(BuildToolsInstalledRow, - !androidConfig().buildToolsVersion().isNull()); + !AndroidConfig::buildToolsVersion().isNull()); m_androidSummary->setPointValid(SdkManagerSuccessfulRow, m_sdkManager.packageListingSuccessful()); // installedSdkPlatforms should not trigger a package reload as validate SDK is only called // after AndroidSdkManager::packageReloadFinished. m_androidSummary->setPointValid(PlatformSdkInstalledRow, !m_sdkManager.installedSdkPlatforms().isEmpty()); m_androidSummary->setPointValid(AllEssentialsInstalledRow, - androidConfig().allEssentialsInstalled(&m_sdkManager)); + AndroidConfig::allEssentialsInstalled(&m_sdkManager)); const bool sdkToolsOk = m_androidSummary->rowsOk({SdkPathExistsAndWritableRow, SdkToolsInstalledRow, @@ -659,7 +659,7 @@ void AndroidSettingsWidget::validateSdk() BuildToolsInstalledRow, PlatformSdkInstalledRow, AllEssentialsInstalledRow}); - androidConfig().setSdkFullyConfigured(sdkToolsOk && componentsOk); + AndroidConfig::setSdkFullyConfigured(sdkToolsOk && componentsOk); if (sdkToolsOk && !componentsOk) { const QStringList notFoundEssentials = m_sdkManager.notFoundEssentialSdkPackages(); if (!notFoundEssentials.isEmpty()) { @@ -783,7 +783,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) void AndroidSettingsWidget::createKitToggled() { - androidConfig().setAutomaticKitCreation(m_createKitCheckBox->isChecked()); + AndroidConfig::setAutomaticKitCreation(m_createKitCheckBox->isChecked()); } void AndroidSettingsWidget::updateUI() @@ -794,7 +794,7 @@ void AndroidSettingsWidget::updateUI() const QListWidgetItem *currentItem = m_ndkListWidget->currentItem(); const FilePath currentNdk = FilePath::fromUserInput(currentItem ? currentItem->text() : ""); const QString infoText = Tr::tr("(SDK Version: %1, NDK Version: %2)") - .arg(androidConfig().sdkToolsVersion().toString()) + .arg(AndroidConfig::sdkToolsVersion().toString()) .arg(currentNdk.isEmpty() ? "" : AndroidConfig::ndkVersion(currentNdk).toString()); m_androidSummary->setInfoText(androidSetupOk ? infoText : ""); @@ -809,7 +809,7 @@ void AndroidSettingsWidget::updateUI() for (int row = 0; row < m_ndkListWidget->count(); ++row) { QListWidgetItem *item = m_ndkListWidget->item(row); const bool isDefaultNdk = - FilePath::fromUserInput(item->text()) == androidConfig().defaultNdk(); + FilePath::fromUserInput(item->text()) == AndroidConfig::defaultNdk(); item->setFont(isDefaultNdk ? markedFont : font); } } @@ -821,7 +821,7 @@ void AndroidSettingsWidget::updateUI() void AndroidSettingsWidget::downloadSdk() { - if (androidConfig().sdkToolsOk()) { + if (AndroidConfig::sdkToolsOk()) { QMessageBox::warning(this, Android::Internal::dialogTitle(), Tr::tr("The selected path already has a valid SDK Tools package.")); validateSdk(); diff --git a/src/plugins/android/androidsignaloperation.cpp b/src/plugins/android/androidsignaloperation.cpp index 5016b2573e2..9e92e860b4d 100644 --- a/src/plugins/android/androidsignaloperation.cpp +++ b/src/plugins/android/androidsignaloperation.cpp @@ -13,7 +13,7 @@ namespace Android { namespace Internal { AndroidSignalOperation::AndroidSignalOperation() - : m_adbPath(androidConfig().adbToolPath()) + : m_adbPath(AndroidConfig::adbToolPath()) , m_timeout(new QTimer(this)) { m_timeout->setInterval(5000); diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 988176ab2f0..e430249bdba 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -77,7 +77,7 @@ bool AndroidToolchain::isValid() const } const bool isChildofNdk = compilerCommand().isChildOf(m_ndkLocation); - const bool isChildofSdk = compilerCommand().isChildOf(androidConfig().sdkLocation()); + const bool isChildofSdk = compilerCommand().isChildOf(AndroidConfig::sdkLocation()); return GccToolchain::isValid() && typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID && targetAbi().isValid() && (isChildofNdk || isChildofSdk) @@ -86,9 +86,8 @@ bool AndroidToolchain::isValid() const void AndroidToolchain::addToEnvironment(Environment &env) const { - const AndroidConfig &config = androidConfig(); env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfig::toolchainHostFromNdk(m_ndkLocation)); - const FilePath javaHome = config.openJDKLocation(); + const FilePath javaHome = AndroidConfig::openJDKLocation(); if (javaHome.exists()) { env.set(Constants::JAVA_HOME_ENV_VAR, javaHome.toUserOutput()); const FilePath javaBin = javaHome.pathAppended("bin"); @@ -97,8 +96,8 @@ void AndroidToolchain::addToEnvironment(Environment &env) const if (!currentJavaFilePath.isChildOf(javaBin)) env.prependOrSetPath(javaBin); } - env.set(QLatin1String("ANDROID_HOME"), config.sdkLocation().toUserOutput()); - env.set(QLatin1String("ANDROID_SDK_ROOT"), config.sdkLocation().toUserOutput()); + env.set(QLatin1String("ANDROID_HOME"), AndroidConfig::sdkLocation().toUserOutput()); + env.set(QLatin1String("ANDROID_SDK_ROOT"), AndroidConfig::sdkLocation().toUserOutput()); } void AndroidToolchain::fromMap(const Store &data) @@ -147,7 +146,7 @@ static FilePaths uniqueNdksForCurrentQtVersions() FilePaths uniqueNdks; for (const QtSupport::QtVersion *version : androidQtVersions) { - FilePath ndk = androidConfig().ndkLocation(version); + FilePath ndk = AndroidConfig::ndkLocation(version); if (!uniqueNdks.contains(ndk)) uniqueNdks.append(ndk); } @@ -161,8 +160,6 @@ ToolchainList autodetectToolchainsFromNdks( const bool isCustom) { QList<Toolchain *> result; - const AndroidConfig config = androidConfig(); - const Id LanguageIds[] { ProjectExplorer::Constants::CXX_LANGUAGE_ID, ProjectExplorer::Constants::C_LANGUAGE_ID diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index 815819682cb..a6c08ffb054 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -169,9 +169,9 @@ AvdDialog::DeviceType AvdDialog::tagToDeviceType(const QString &type_tag) static bool avdManagerCommand(const QStringList &args, QString *output) { - CommandLine cmd(androidConfig().avdManagerToolPath(), args); + CommandLine cmd(AndroidConfig::avdManagerToolPath(), args); Process proc; - proc.setEnvironment(androidConfig().toolsEnvironment()); + proc.setEnvironment(AndroidConfig::toolsEnvironment()); qCDebug(avdDialogLog).noquote() << "Running AVD Manager command:" << cmd.toUserOutput(); proc.setCommand(cmd); proc.runBlocking(); @@ -189,7 +189,7 @@ void AvdDialog::parseDeviceDefinitionsList() if (!avdManagerCommand({"list", "device"}, &output)) { qCDebug(avdDialogLog) << "Avd list command failed" << output - << androidConfig().sdkToolsVersion(); + << AndroidConfig::sdkToolsVersion(); return; } diff --git a/src/plugins/android/avddialog.h b/src/plugins/android/avddialog.h index 95e78f98343..2e92da15a05 100644 --- a/src/plugins/android/avddialog.h +++ b/src/plugins/android/avddialog.h @@ -20,7 +20,6 @@ QT_END_NAMESPACE namespace Utils { class InfoLabel; } namespace Android { -class AndroidConfig; class SdkPlatform; namespace Internal { diff --git a/src/plugins/android/javalanguageserver.cpp b/src/plugins/android/javalanguageserver.cpp index 671786756e4..90d536dcaef 100644 --- a/src/plugins/android/javalanguageserver.cpp +++ b/src/plugins/android/javalanguageserver.cpp @@ -305,7 +305,7 @@ void JLSClient::updateProjectFiles() const QStringList classPaths = node->data(Constants::AndroidClassPaths).toStringList(); - const FilePath &sdkLocation = androidConfig().sdkLocation(); + const FilePath &sdkLocation = AndroidConfig::sdkLocation(); const QString &targetSDK = AndroidManager::buildTargetSDK(m_currentTarget); const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar") .arg(targetSDK); |