28using namespace std::chrono;
34#define LLDB_PROPERTIES_android
35#include "PlatformAndroidProperties.inc"
38#define LLDB_PROPERTIES_android
39#include "PlatformAndroidPropertiesEnum.inc"
45 m_collection_sp = std::make_shared<OptionValueProperties>(
47 m_collection_sp->Initialize(g_android_properties);
52 static PluginProperties g_settings;
57const unsigned int g_android_default_cache_size =
63 PlatformLinux::Initialize();
66#if defined(__ANDROID__)
68 default_platform_sp->SetSystemArchitecture(HostInfo::GetArchitecture());
85 PlatformLinux::Terminate();
91 const char *arch_name;
97 const char *triple_cstr =
98 arch ? arch->
GetTriple().getTriple().c_str() :
"<null>";
100 LLDB_LOGF(log,
"PlatformAndroid::%s(force=%s, arch={%s,%s})", __FUNCTION__,
101 force ?
"true" :
"false", arch_name, triple_cstr);
105 if (!create && arch && arch->
IsValid()) {
106 const llvm::Triple &triple = arch->
GetTriple();
107 switch (triple.getVendor()) {
108 case llvm::Triple::PC:
112#if defined(__ANDROID__)
116 case llvm::Triple::VendorType::UnknownVendor:
125 switch (triple.getEnvironment()) {
126 case llvm::Triple::Android:
129#if defined(__ANDROID__)
133 case llvm::Triple::EnvironmentType::UnknownEnvironment:
145 LLDB_LOGF(log,
"PlatformAndroid::%s() creating remote-android platform",
151 log,
"PlatformAndroid::%s() aborting creation of remote-android platform",
162 "Properties for the Android platform plugin.",
168 : PlatformLinux(is_host), m_sdk_version(0) {}
172 return "Local Android user platform plug-in.";
173 return "Remote Android user platform plug-in.";
181 "can't connect to the host platform, always connected");
189 std::optional<URI> parsed_url =
URI::Parse(url);
192 if (parsed_url->hostname !=
"localhost")
195 auto error = PlatformLinux::ConnectRemote(args);
196 if (
error.Success()) {
210 return PlatformLinux::GetFile(source, destination);
222 uint32_t mode = 0, size = 0, mtime = 0;
223 error = sync_service->Stat(source_spec, mode, size, mtime);
228 return sync_service->PullFile(source_spec, destination);
230 std::string source_file = source_spec.
GetPath(
false);
233 LLDB_LOGF(log,
"Got mode == 0 on '%s': try to get file via 'shell cat'",
234 source_file.c_str());
236 if (strchr(source_file.c_str(),
'\'') !=
nullptr)
238 "Doesn't support single-quotes in filenames");
247 snprintf(cmd,
sizeof(cmd),
"%scat '%s'",
GetRunAs().c_str(),
248 source_file.c_str());
250 return adb->ShellToFile(cmd, minutes(1), destination);
254 const FileSpec &destination, uint32_t uid,
257 return PlatformLinux::PutFile(source, destination, uid, gid);
259 FileSpec destination_spec(destination.
GetPath(
false), FileSpec::Style::posix);
262 destination_spec.
GetPath(
false));
269 return sync_service->PushFile(source, destination_spec);
275 const uint64_t src_offset,
276 const uint64_t src_size,
281 return GetFile(src_file_spec, dst_file_spec);
283 std::string source_file = src_file_spec.
GetPath(
false);
284 if (source_file.find(
'\'') != std::string::npos)
286 "Doesn't support single-quotes in filenames");
290 static constexpr llvm::StringLiteral k_zip_separator(
"!/");
291 size_t pos = source_file.find(k_zip_separator);
292 if (pos != std::string::npos)
293 source_file.resize(pos);
302 snprintf(cmd,
sizeof(cmd),
303 "%sdd if='%s' iflag=skip_bytes,count_bytes "
304 "skip=%" PRIu64
" count=%" PRIu64
" status=none",
305 GetRunAs().c_str(), source_file.c_str(), src_offset, src_size);
307 return adb->ShellToFile(cmd, minutes(1), dst_file_spec);
312 if (
error.Success()) {
320 return g_android_default_cache_size;
330 std::string version_string;
336 adb->Shell(
"getprop ro.build.version.sdk", seconds(5), &version_string);
337 version_string = llvm::StringRef(version_string).trim().str();
339 if (
error.Fail() || version_string.empty()) {
341 LLDB_LOGF(log,
"Get SDK version failed. (error: %s, output: %s)",
342 error.AsCString(), version_string.c_str());
354 llvm::StringRef extension = module_sp->GetFileSpec().GetFileNameExtension();
355 if (extension !=
".oat" && extension !=
".odex")
357 "Symbol file downloading only supported for oat and odex files");
360 if (!module_sp->GetPlatformFileSpec())
366 "Symbol file generation only supported on SDK 23+");
369 if (module_sp->GetSectionList()->FindSectionByName(
ConstString(
".symtab")) !=
378 error = adb->Shell(
"mktemp --directory --tmpdir /data/local/tmp", seconds(5),
380 if (
error.Fail() || tmpdir.empty())
382 "Failed to generate temporary directory on the device (%s)",
384 tmpdir = llvm::StringRef(tmpdir).trim().str();
387 std::unique_ptr<std::string, std::function<void(std::string *)>>
388 tmpdir_remover(&tmpdir, [&adb](std::string *s) {
390 command.
Printf(
"rm -rf %s", s->c_str());
394 if (log &&
error.Fail())
395 LLDB_LOGF(log,
"Failed to remove temp directory: %s",
399 FileSpec symfile_platform_filespec(tmpdir);
400 symfile_platform_filespec.AppendPathComponent(
"symbolized.oat");
404 command.
Printf(
"oatdump --symbolize=%s --output=%s",
405 module_sp->GetPlatformFileSpec().GetPath(
false).c_str(),
406 symfile_platform_filespec.GetPath(
false).c_str());
407 error = adb->Shell(command.
GetData(), minutes(1),
nullptr);
413 return GetFile(symfile_platform_filespec, dst_file_spec);
424 std::vector<const char *> dl_open_names = {
"__dl_dlopen",
"dlopen"};
425 const char *dl_open_name =
nullptr;
427 for (
auto name : dl_open_names) {
429 ConstString(name), eFunctionNameTypeFull, matching_symbols);
430 if (matching_symbols.
GetSize()) {
436 if (dl_open_name == dl_open_names[0])
438 extern "C" void* dlopen(const char*, int) asm("__dl_dlopen");
439 extern "C" void* dlsym(void*, const char*) asm("__dl_dlsym");
440 extern "C" int dlclose(void*) asm("__dl_dlclose");
441 extern "C" char* dlerror(void) asm("__dl_dlerror");
458 ePropertyPlatformPackageName,
"");
463 if (!run_as.empty()) {
472 return std::string(
"run-as '") + run_as.str() +
"' ";
static llvm::raw_ostream & error(Stream &strm)
static DynamicLoaderDarwinKernelProperties & GetGlobalProperties()
#define LLDB_LOGF(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool TripleEnvironmentWasSpecified() const
bool TripleVendorWasSpecified() const
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A command line argument class.
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
A uniqued constant string class.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
A class to manage flag bits.
FileSpec CopyByAppendingPathComponent(llvm::StringRef component) const
bool IsRelative() const
Returns true if the filespec represents a relative path.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
ConstString GetPathAsConstString(bool denormalize=true) const
Get the full path as a ConstString.
void FindFunctionSymbols(ConstString name, lldb::FunctionNameType name_type_mask, SymbolContextList &sc_list)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static lldb::OptionValuePropertiesSP GetSettingForPlatformPlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool CreateSettingForPlatformPlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static bool UnregisterPlugin(ABICreateInstance create_callback)
A plug-in interface definition class for debugging a process.
Target & GetTarget()
Get the target object pointer for this module.
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
const char * GetData() const
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Defines a list of symbol context objects.
uint32_t GetSize() const
Get accessor for a symbol context list size.
const ModuleList & GetImages() const
Get accessor for the images for this process.
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::Platform > PlatformSP
std::shared_ptr< lldb_private::Module > ModuleSP
static std::optional< URI > Parse(llvm::StringRef uri)