From 1d0d90b906a5c39910fa37398ef7d84dbf8f4611 Mon Sep 17 00:00:00 2001 From: Tamas Berghammer Date: Wed, 12 Aug 2015 11:10:19 +0000 Subject: [PATCH] Fetch SDK version from PlatformAndroid The SDK version implies the features supported by a given android device. This version number will be used in future changes to execute the right command on the device. Differential revision: http://reviews.llvm.org/D11935 llvm-svn: 244737 --- .../Plugins/Platform/Android/PlatformAndroid.cpp | 47 +++++++++++++++++++++- .../Plugins/Platform/Android/PlatformAndroid.h | 8 ++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Platform/Android/PlatformAndroid.cpp b/lldb/source/Plugins/Platform/Android/PlatformAndroid.cpp index ed74957..22b7918 100644 --- a/lldb/source/Plugins/Platform/Android/PlatformAndroid.cpp +++ b/lldb/source/Plugins/Platform/Android/PlatformAndroid.cpp @@ -13,6 +13,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/PluginManager.h" #include "lldb/Host/HostInfo.h" +#include "lldb/Host/StringConvert.h" #include "Utility/UriParser.h" // Project includes @@ -133,7 +134,8 @@ PlatformAndroid::CreateInstance (bool force, const ArchSpec *arch) } PlatformAndroid::PlatformAndroid (bool is_host) : - PlatformLinux(is_host) + PlatformLinux(is_host), + m_sdk_version(0) { } @@ -257,3 +259,46 @@ PlatformAndroid::DownloadModuleSlice (const FileSpec &src_file_spec, return GetFile (src_file_spec, dst_file_spec); } + +Error +PlatformAndroid::DisconnectRemote() +{ + Error error = PlatformLinux::DisconnectRemote(); + if (error.Success()) + { + m_device_id.clear(); + m_sdk_version = 0; + } + return error; +} + +uint32_t +PlatformAndroid::GetSdkVersion() +{ + if (!IsConnected()) + return 0; + + if (m_sdk_version != 0) + return m_sdk_version; + + int status = 0; + std::string version_string; + Error error = RunShellCommand("getprop ro.build.version.sdk", + GetWorkingDirectory(), + &status, + nullptr, + &version_string, + 1); + if (error.Fail() || status != 0 || version_string.empty()) + { + Log* log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM); + if (log) + log->Printf("Get SDK version failed. (status: %d, error: %s, output: %s)", + status, error.AsCString(), version_string.c_str()); + return 0; + } + version_string.erase(version_string.size() - 1); // Remove trailing new line + + m_sdk_version = StringConvert::ToUInt32(version_string.c_str()); + return m_sdk_version; +} diff --git a/lldb/source/Plugins/Platform/Android/PlatformAndroid.h b/lldb/source/Plugins/Platform/Android/PlatformAndroid.h index b02a1b5..be43fff 100644 --- a/lldb/source/Plugins/Platform/Android/PlatformAndroid.h +++ b/lldb/source/Plugins/Platform/Android/PlatformAndroid.h @@ -73,6 +73,12 @@ namespace platform_android { const FileSpec& destination, uint32_t uid = UINT32_MAX, uint32_t gid = UINT32_MAX) override; + + uint32_t + GetSdkVersion(); + + Error + DisconnectRemote () override; protected: const char * @@ -86,6 +92,8 @@ namespace platform_android { private: std::string m_device_id; + uint32_t m_sdk_version; + DISALLOW_COPY_AND_ASSIGN (PlatformAndroid); }; -- 2.7.4