diff options
author | Vikas Pachdha <vikas.pachdha@qt.io> | 2017-05-05 12:26:23 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2017-05-08 15:13:29 +0000 |
commit | 5009bafea25dd4725cabb381733d2cbefc33ba54 (patch) | |
tree | 4e721fb81950d66a1abad8b453590d35502bde30 | |
parent | 63e395c876b6d2de74c48dd287c04d037b4e26a1 (diff) |
Android: Fix C++ debuggingv4.3.0-rc1
Target Async mode enabled only for ndk version > 11
Task-number: QTCREATORBUG-18111
Change-Id: I218b6c23c1da13091f0035193a43e6117748055a
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
-rw-r--r-- | src/plugins/android/androidconfigurations.cpp | 54 | ||||
-rw-r--r-- | src/plugins/android/androidconfigurations.h | 1 | ||||
-rw-r--r-- | src/plugins/android/androiddebugsupport.cpp | 4 |
3 files changed, 58 insertions, 1 deletions
diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 42027743b83..1287f4946fa 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -61,7 +61,9 @@ #include <QDirIterator> #include <QFileInfo> #include <QHostAddress> +#include <QLoggingCategory> #include <QProcess> +#include <QRegularExpression> #include <QSettings> #include <QStringList> #include <QTcpSocket> @@ -72,6 +74,10 @@ using namespace ProjectExplorer; using namespace Utils; +namespace { +Q_LOGGING_CATEGORY(avdConfigLog, "qtc.android.androidconfig") +} + namespace Android { using namespace Internal; @@ -114,6 +120,7 @@ namespace { const QLatin1String changeTimeStamp("ChangeTimeStamp"); const QLatin1String sdkToolsVersionKey("Pkg.Revision"); + const QLatin1String ndkRevisionKey("Pkg.Revision"); static QString sdkSettingsFileName() { @@ -758,6 +765,53 @@ FileName AndroidConfig::ndkLocation() const return m_ndkLocation; } +QVersionNumber AndroidConfig::ndkVersion() const +{ + QVersionNumber version; + if (!m_ndkLocation.exists()) { + qCDebug(avdConfigLog) << "Can not find ndk version. Check NDK path." + << m_ndkLocation.toString(); + return version; + } + + Utils::FileName ndkPropertiesPath(m_ndkLocation); + ndkPropertiesPath.appendPath("source.properties"); + if (ndkPropertiesPath.exists()) { + // source.properties files exists in NDK version > 11 + QSettings settings(ndkPropertiesPath.toString(), QSettings::IniFormat); + auto versionStr = settings.value(ndkRevisionKey).toString(); + version = QVersionNumber::fromString(versionStr); + } else { + // No source.properties. There should be a file named RELEASE.TXT + Utils::FileName ndkReleaseTxtPath(m_ndkLocation); + ndkReleaseTxtPath.appendPath("RELEASE.TXT"); + Utils::FileReader reader; + QString errorString; + if (reader.fetch(ndkReleaseTxtPath.toString(), &errorString)) { + // RELEASE.TXT contains the ndk version in either of the following formats: + // r6a + // r10e (64 bit) + QString content = QString::fromUtf8(reader.data()); + QRegularExpression re("(r)(?<major>[0-9]{1,2})(?<minor>[a-z]{1,1})"); + QRegularExpressionMatch match = re.match(content); + if (match.hasMatch()) { + QString major = match.captured("major"); + QString minor = match.captured("minor"); + // Minor version: a = 0, b = 1, c = 2 and so on. + // Int equivalent = minorVersionChar - 'a'. i.e. minorVersionChar - 97. + version = QVersionNumber::fromString(QString("%1.%2.0").arg(major) + .arg((int)minor[0].toLatin1() - 97)); + } else { + qCDebug(avdConfigLog) << "Can not find ndk version. Can not parse RELEASE.TXT." + << content; + } + } else { + qCDebug(avdConfigLog) << "Can not find ndk version." << errorString; + } + } + return version; +} + void AndroidConfig::setNdkLocation(const FileName &ndkLocation) { m_ndkLocation = ndkLocation; diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 91076808109..d5c59936d32 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -115,6 +115,7 @@ public: QVersionNumber sdkToolsVersion() const; Utils::FileName ndkLocation() const; + QVersionNumber ndkVersion() const; void setNdkLocation(const Utils::FileName &ndkLocation); Utils::FileName antLocation() const; diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp index 25967ba2e2a..9da8ff511a6 100644 --- a/src/plugins/android/androiddebugsupport.cpp +++ b/src/plugins/android/androiddebugsupport.cpp @@ -104,8 +104,10 @@ RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration * params.displayName = AndroidManager::packageName(target); params.remoteSetupNeeded = true; params.useContinueInsteadOfRun = true; - if (!Utils::HostOsInfo::isWindowsHost()) // Workaround for NDK 11c(b?) + if (!Utils::HostOsInfo::isWindowsHost() && + AndroidConfigurations::currentConfig().ndkVersion() >= QVersionNumber(11, 0, 0)) { params.useTargetAsync = true; + } auto aspect = runConfig->extraAspect<DebuggerRunConfigurationAspect>(); if (aspect->useCppDebugger()) { |