[Lldb-commits] [lldb] [lldb] refactor PlatformAndroid and make threadsafe (PR #145382)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri Aug 8 04:11:41 PDT 2025
================
@@ -85,86 +72,217 @@ static Status ReadAllBytes(Connection &conn, void *buffer, size_t size) {
error = Status::FromErrorStringWithFormat(
"Unable to read requested number of bytes. Connection status: %d.",
status);
+
return error;
}
-Status AdbClient::CreateByDeviceID(const std::string &device_id,
- AdbClient &adb) {
- Status error;
- std::string android_serial;
- if (!device_id.empty())
- android_serial = device_id;
- else if (const char *env_serial = std::getenv("ANDROID_SERIAL"))
- android_serial = env_serial;
+static Status ReadAdbMessage(Connection &conn, std::vector<char> &message) {
+ message.clear();
- if (android_serial.empty()) {
- DeviceIDList connected_devices;
- error = adb.GetDevices(connected_devices);
- if (error.Fail())
- return error;
+ char buffer[5];
+ buffer[4] = 0;
+
+ auto error = ReadAllBytes(conn, buffer, 4);
+ if (error.Fail())
+ return error;
+
+ unsigned int packet_len = 0;
+ sscanf(buffer, "%x", &packet_len);
+
+ message.resize(packet_len, 0);
+ error = ReadAllBytes(conn, &message[0], packet_len);
+ if (error.Fail())
+ message.clear();
- if (connected_devices.size() != 1)
- return Status::FromErrorStringWithFormat(
- "Expected a single connected device, got instead %zu - try "
- "setting 'ANDROID_SERIAL'",
- connected_devices.size());
- adb.SetDeviceID(connected_devices.front());
- } else {
- adb.SetDeviceID(android_serial);
- }
return error;
}
-AdbClient::AdbClient() = default;
-
-AdbClient::AdbClient(const std::string &device_id) : m_device_id(device_id) {}
+static Status GetResponseError(Connection &conn, const char *response_id) {
+ if (strcmp(response_id, kFAIL) != 0)
+ return Status::FromErrorStringWithFormat(
+ "Got unexpected response id from adb: \"%s\"", response_id);
-AdbClient::~AdbClient() = default;
+ std::vector<char> error_message;
+ auto error = ReadAdbMessage(conn, error_message);
+ if (!error.Success())
+ return error;
-void AdbClient::SetDeviceID(const std::string &device_id) {
- m_device_id = device_id;
+ std::string error_str(&error_message[0], error_message.size());
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log, "ADB error: %s", error_str.c_str());
+ return Status(error_str);
}
-const std::string &AdbClient::GetDeviceID() const { return m_device_id; }
+static Status ReadResponseStatus(Connection &conn) {
+ char response_id[5];
-Status AdbClient::Connect() {
+ const size_t packet_len = 4;
+ response_id[packet_len] = 0;
+
+ auto error = ReadAllBytes(conn, response_id, packet_len);
+ if (error.Fail())
+ return error;
+
+ if (strncmp(response_id, kOKAY, packet_len) != 0)
+ return GetResponseError(conn, response_id);
+
+ return error;
+}
+
+static Status SendAdbMessage(Connection &conn, const std::string &packet) {
Status error;
- m_conn = std::make_unique<ConnectionFileDescriptor>();
+
+ char length_buffer[5];
+ snprintf(length_buffer, sizeof(length_buffer), "%04x",
+ static_cast<int>(packet.size()));
+
+ ConnectionStatus status;
+
+ conn.Write(length_buffer, 4, status, &error);
+ if (error.Fail())
+ return error;
+
+ conn.Write(packet.c_str(), packet.size(), status, &error);
+ return error;
+}
+
+static Status ConnectToAdb(Connection &conn) {
std::string port = "5037";
- if (const char *env_port = std::getenv("ANDROID_ADB_SERVER_PORT")) {
+ if (const char *env_port = std::getenv("ANDROID_ADB_SERVER_PORT"))
port = env_port;
- }
std::string uri = "connect://127.0.0.1:" + port;
- m_conn->Connect(uri.c_str(), &error);
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log, "Connecting to ADB server at %s", uri.c_str());
+
+ Status error;
+ conn.Connect(uri.c_str(), &error);
return error;
}
-Status AdbClient::GetDevices(DeviceIDList &device_list) {
- device_list.clear();
-
- auto error = SendMessage("host:devices");
+static Status EnterSyncMode(Connection &conn) {
+ auto error = SendAdbMessage(conn, "sync:");
if (error.Fail())
return error;
- error = ReadResponseStatus();
+ return ReadResponseStatus(conn);
+}
+
+static Status SelectTargetDevice(Connection &conn,
+ const std::string &device_id) {
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log, "Selecting device: %s", device_id.c_str());
+
+ std::ostringstream msg;
+ msg << "host:transport:" << device_id;
+
+ auto error = SendAdbMessage(conn, msg.str());
if (error.Fail())
return error;
- std::vector<char> in_buffer;
- error = ReadMessage(in_buffer);
+ return ReadResponseStatus(conn);
+}
- llvm::StringRef response(&in_buffer[0], in_buffer.size());
- llvm::SmallVector<llvm::StringRef, 4> devices;
- response.split(devices, "\n", -1, false);
+Expected<std::string> AdbClient::ResolveDeviceID(StringRef device_id) {
+ StringRef preferred_serial;
+ if (!device_id.empty()) {
+ preferred_serial = device_id;
+ } else if (const char *env_serial = std::getenv("ANDROID_SERIAL")) {
+ preferred_serial = env_serial;
+ }
----------------
labath wrote:
```suggestion
if (!device_id.empty())
preferred_serial = device_id;
else if (const char *env_serial = std::getenv("ANDROID_SERIAL"))
preferred_serial = env_serial;
```
https://llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single-statement-bodies-of-if-else-loop-statements
https://github.com/llvm/llvm-project/pull/145382
More information about the lldb-commits
mailing list