From 5009bafea25dd4725cabb381733d2cbefc33ba54 Mon Sep 17 00:00:00 2001 From: Vikas Pachdha Date: Fri, 5 May 2017 12:26:23 +0200 Subject: Android: Fix C++ debugging Target Async mode enabled only for ndk version > 11 Task-number: QTCREATORBUG-18111 Change-Id: I218b6c23c1da13091f0035193a43e6117748055a Reviewed-by: Christian Stenger Reviewed-by: hjk Reviewed-by: Tobias Hunger --- src/plugins/android/androidconfigurations.cpp | 54 +++++++++++++++++++++++++++ src/plugins/android/androidconfigurations.h | 1 + src/plugins/android/androiddebugsupport.cpp | 4 +- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 42027743b8..1287f4946f 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -61,7 +61,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -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)(?[0-9]{1,2})(?[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 9107680810..d5c59936d3 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 25967ba2e2..9da8ff511a 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(); if (aspect->useCppDebugger()) { -- cgit v1.2.1