ADB 源码网络调试 禁用 说明
1、adbd 连接关键 代码
/system/core/adb/daemon/ 目录下是关于 adbd 主要代码
此目录 下 main.cpp 中是 adbd 的主函数 从这个开始查找 关于 usb 调试 和 网络调试的代码
2、adbd_main
在 main方法中 主要是掉用 adbd_main(DEFAULT_ADB_PORT) 方法
int main(int argc, char** argv) {
//.... 省略源代码....
return adbd_main(DEFAULT_ADB_PORT);
}
int adbd_main(int server_port) {
//.... 省略源代码....
bool is_usb = false;
#if defined(__ANDROID__)
if (access(USB_FFS_ADB_EP0, F_OK) == 0) {
// Listen on USB.
usb_init();
is_usb = true;
}
#endif
//.... 省略源代码....
int port;
if (sscanf(prop_port.c_str(), "%d", &port) == 1 && port > 0) {
D("using tcp port=%d", port);
// Listen on TCP and VSOCK port specified by service.adb.tcp.port property.
addrs.push_back(android::base::StringPrintf("tcp:%d", port));
addrs.push_back(android::base::StringPrintf("vsock:%d", port));
setup_adb(addrs);
} else if (!is_usb) {
// Listen on default port.
addrs.push_back(
android::base::StringPrintf("tcp:%d", DEFAULT_ADB_LOCAL_TRANSPORT_PORT));
addrs.push_back(
android::base::StringPrintf("vsock:%d", DEFAULT_ADB_LOCAL_TRANSPORT_PORT));
setup_adb(addrs);
}
} else {
addrs = android::base::Split(prop_addr, ",");
setup_adb(addrs);
}
D("adbd_main(): pre init_jdwp()");
init_jdwp();
D("adbd_main(): post init_jdwp()");
D("Event loop starting");
fdevent_loop();
return 0;
}
在 adbd_main 方法 中主要 看到有两个方法与连接相关 usb_init(); setup_adb(addrs);
先查看 usb_init() 方法
**3、usb_init() **
usb_init() 方法是在/system/core/adb/daemon/ 目录下 usb.cpp 文件下
void usb_init() {
std::thread(usb_ffs_open_thread).detach();
}
在线程中执行usb_ffs_open_thread 方法
static void usb_ffs_open_thread() {
adb_thread_setname("usb ffs open");
while (true) {
unique_fd control;
unique_fd bulk_out;
unique_fd bulk_in;
if (!open_functionfs(&control, &bulk_out, &bulk_in)) {
std::this_thread::sleep_for(1s);
continue;
}
atransport* transport = new atransport();
transport->serial = "UsbFfs";
std::promise<void> destruction_notifier;
std::future<void> future = destruction_notifier.get_future();
transport->SetConnection(std::make_unique<UsbFfsConnection>(
std::move(control), std::move(bulk_out), std::move(bulk_in),
std::move(destruction_notifier)));
register_transport(transport);
future.wait();
}
}
/* the fdevent select pump is single threaded */
void register_transport(atransport* transport) {
tmsg m;
m.transport = transport;
m.action = 1;
D("transport: %s registered", transport->serial.c_str());
if (transport_write_action(transport_registration_send, &m)) {
PLOG(FATAL) << "cannot write transport registration socket";
}
}
通过追踪 register_transport -->transport_write_action 可以推测出 usb_init 是初始化 usb 通讯 并进行监听的连接的
**3、setup_adb(addrs) **
回到 adb_main 方法中 来看下面的代码
// If one of these properties is set, also listen on that port.
// If one of the properties isn't set and we couldn't listen on usb, listen
// on the default port.
// 如果设置了这些属性之一,也要监听该端口。如果其中一个属性没有设置并且我们不能在usb上监听,就在默认端口上监听。
std::vector<std::string> addrs;
std::string prop_addr = android::base::GetProperty("service.adb.listen_addrs", "");
if (prop_addr.empty()) {
std::string prop_port = android::base::GetProperty("service.adb.tcp.port", "");
if (prop_port.empty()) {
prop_port = android::base::GetProperty("persist.adb.tcp.port", "");
}
#if !defined(__ANDROID__)
if (prop_port.empty() && getenv("ADBD_PORT")) {
prop_port = getenv("ADBD_PORT");
}
#endif
int port;
if (sscanf(prop_port.c_str(), "%d", &port) == 1 && port > 0) {
D("using tcp port=%d", port);
// Listen on TCP and VSOCK port specified by service.adb.tcp.port property.
//监听service. adm . TCP .port属性指定的TCP和VSOCK端口。
addrs.push_back(android::base::StringPrintf("tcp:%d", port));
addrs.push_back(android::base::StringPrintf("vsock:%d", port));
setup_adb(addrs);
} else if (!is_usb) {
// Listen on default port.
//监听默认端口。
addrs.push_back(
android::base::StringPrintf("tcp:%d", DEFAULT_ADB_LOCAL_TRANSPORT_PORT));
addrs.push_back(
android::base::StringPrintf("vsock:%d", DEFAULT_ADB_LOCAL_TRANSPORT_PORT));
setup_adb(addrs);
}
} else {
addrs = android::base::Split(prop_addr, ",");
setup_adb(addrs);
}
通过以上的注释 可以这部分代码就是用来设置tcp 端口 并进行监听的
进一步查看 一下 setup_adb(addrs)方法
static void setup_adb(const std::vector<std::string>& addrs) {
#if defined(__ANDROID__)
// Get the first valid port from addrs and setup mDNS.
int port = -1;
std::string error;
for (const auto& addr : addrs) {
port = get_host_socket_spec_port(addr, &error);
if (port != -1) {
break;
}
}
if (port == -1) {
port = DEFAULT_ADB_LOCAL_TRANSPORT_PORT;
}
LOG(INFO) << "Setup mdns on port= " << port;
setup_mdns(port);
#endif
for (const auto& addr : addrs) {
LOG(INFO) << "adbd listening on " << addr;
local_init(addr);
}
}
在 adb/socket_spec.cpp 中找到 get_host_socket_spec_port 方法
int get_host_socket_spec_port(std::string_view spec, std::string* error) {
int port;
if (spec.starts_with("tcp:")) {
if (!parse_tcp_socket_spec(spec, nullptr, &port, nullptr, error)) {
return -1;
}
} else if (spec.starts_with("vsock:")) {
#if ADB_LINUX
std::string spec_str(spec);
std::vector<std::string> fragments = android::base::Split(spec_str, ":");
if (fragments.size() != 2) {
*error = "given vsock server socket string was invalid";
return -1;
}
if (!android::base::ParseInt(fragments[1], &port)) {
*error = "could not parse vsock port";
errno = EINVAL;
return -1;
}
if (port < 0) {
*error = "vsock port was negative.";
errno = EINVAL;
return -1;
}
#else // ADB_LINUX
*error = "vsock is only supported on linux";
return -1;
#endif // ADB_LINUX
} else {
*error = "given socket spec string was invalid";
return -1;
}
return port;
}
可以 看到setup_adb 就是来监听 网络端口 并进行调试的
所以把这部分代码注释掉 即可禁用掉 网络调试