Skip to content

Commit

Permalink
Do not list adb devices when a device id is given
Browse files Browse the repository at this point in the history
Summary:
On Android, this method gets called twice: first when establishing
a host-server connection, then when attaching to a process id.

Each call takes several seconds to finish (especially slower on Windows)
and eliminating the call for the typical case improves latency significantly.

Reviewed By: labath

Differential Revision: https://reviews.llvm.org/D79586
  • Loading branch information
emrekultursay authored and labath committed May 29, 2020
1 parent 2c22c14 commit 7ff2de4
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 14 deletions.
24 changes: 10 additions & 14 deletions lldb/source/Plugins/Platform/Android/AdbClient.cpp
Expand Up @@ -94,30 +94,26 @@ Status ReadAllBytes(Connection &conn, void *buffer, size_t size) {

Status AdbClient::CreateByDeviceID(const std::string &device_id,
AdbClient &adb) {
DeviceIDList connect_devices;
auto error = adb.GetDevices(connect_devices);
if (error.Fail())
return error;

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;

if (android_serial.empty()) {
if (connect_devices.size() != 1)
DeviceIDList connected_devices;
error = adb.GetDevices(connected_devices);
if (error.Fail())
return error;

if (connected_devices.size() != 1)
return Status("Expected a single connected device, got instead %zu - try "
"setting 'ANDROID_SERIAL'",
connect_devices.size());
adb.SetDeviceID(connect_devices.front());
connected_devices.size());
adb.SetDeviceID(connected_devices.front());
} else {
auto find_it = std::find(connect_devices.begin(), connect_devices.end(),
android_serial);
if (find_it == connect_devices.end())
return Status("Device \"%s\" not found", android_serial.c_str());

adb.SetDeviceID(*find_it);
adb.SetDeviceID(android_serial);
}
return error;
}
Expand Down
51 changes: 51 additions & 0 deletions lldb/unittests/Platform/Android/AdbClientTest.cpp
@@ -0,0 +1,51 @@
//===-- AdbClientTest.cpp -------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "gtest/gtest.h"
#include "Plugins/Platform/Android/AdbClient.h"
#include <cstdlib>

static void set_env(const char *var, const char *value) {
#ifdef _WIN32
_putenv_s(var, value);
#else
setenv(var, value, true);
#endif
}

using namespace lldb;
using namespace lldb_private;

namespace lldb_private {
namespace platform_android {

class AdbClientTest : public ::testing::Test {
public:
void SetUp() override { set_env("ANDROID_SERIAL", ""); }

void TearDown() override { set_env("ANDROID_SERIAL", ""); }
};

TEST(AdbClientTest, CreateByDeviceId) {
AdbClient adb;
Status error = AdbClient::CreateByDeviceID("device1", adb);
EXPECT_TRUE(error.Success());
EXPECT_EQ("device1", adb.GetDeviceID());
}

TEST(AdbClientTest, CreateByDeviceId_ByEnvVar) {
set_env("ANDROID_SERIAL", "device2");

AdbClient adb;
Status error = AdbClient::CreateByDeviceID("", adb);
EXPECT_TRUE(error.Success());
EXPECT_EQ("device2", adb.GetDeviceID());
}

} // end namespace platform_android
} // end namespace lldb_private
8 changes: 8 additions & 0 deletions lldb/unittests/Platform/Android/CMakeLists.txt
@@ -0,0 +1,8 @@
include_directories(${LLDB_SOURCE_DIR}/source/Plugins/Platform/Android)

add_lldb_unittest(AdbClientTest
AdbClientTest.cpp

LINK_LIBS
lldbPluginPlatformAndroid
)
2 changes: 2 additions & 0 deletions lldb/unittests/Platform/CMakeLists.txt
Expand Up @@ -6,3 +6,5 @@ add_lldb_unittest(LLDBPlatformTests
LINK_COMPONENTS
Support
)

add_subdirectory(Android)

0 comments on commit 7ff2de4

Please sign in to comment.