adb 的源代码分析,以及如何改造为外网远程连接的方式

ADB(Android Debug Bridge)的远程连接改造涉及对其架构的深入理解。下面我将从源代码架构分析外网远程连接改造方案两方面进行详细说明。

🔧 一、ADB 源代码架构分析

1. 核心组件与通信流程

ADB 采用 C/S 三层架构 ,代码位于 AOSP 的 system/core/adb目录。

组件 运行位置 功能 关键代码文件
adb client 主机(PC) 命令行接口,解析用户命令并发送给 adb server adb_client.cpp, commandline.cpp
adb server 主机(PC) 守护进程,管理设备连接,转发 client 与 daemon 间的数据 adb.cpp, adb_server.cpp, transport.cpp
adbd 设备(Android) 设备端守护进程,执行具体调试命令 adbd.cpp, services.cpp, socket.cpp

通信流程示例(以 adb push为例):

  1. Client → Serveradb client连接 localhost:5037,发送 host:transport:<serial>sync:命令。

  2. Server → Daemonadb server通过 USB/TCP 将命令转发给 adbd

  3. Daemon 处理adbd解析命令,执行文件写入操作。

  4. 数据通道:建立单独的数据连接传输文件内容。

关键数据结构:

  • atransport:代表一个设备连接,包含读写函数指针。

  • asocket:抽象套接字,用于进程间通信。

  • amessage:消息头,包含命令和长度。

2. 编译与配置

  • 通过 ADB_HOST宏区分编译主机端(adb)与设备端(adbd)。

  • 设备端 adbdinit进程启动,配置在 init.rc中。

  • 默认仅监听 USB,网络调试需通过 adb tcpip 5555激活。

🌐 二、改造为外网远程连接的方案

方案一:SSH 隧道转发(推荐,最安全)

原理:将远程主机的 adb server 端口(5037)通过 SSH 隧道映射到本地。

步骤:

  1. 准备环境:确保远程 Linux 主机可 SSH 访问,且已连接 Android 设备。

  2. 建立隧道

    复制代码
    # 将远程 5037 端口映射到本地 5037
    ssh -L 5037:localhost:5037 user@remote-host
  3. 本地连接

    复制代码
    # 此时本地 adb 会通过隧道连接远程 adb server
    adb devices

优点:加密传输,无需修改 ADB 代码,利用现有 SSH 安全机制。

方案二:ADB 直接暴露 + 认证加固(需修改源码)

原理:修改 adb server 使其监听公网 IP,并添加认证机制。

代码修改要点:

  1. 修改监听地址adb_listen函数):

    复制代码
    // 在 adb_server.cpp 中,将监听从 localhost 改为 0.0.0.0
    int adb_listen(const char* host, int port) {
        // 将 host 默认改为 "0.0.0.0" 或配置项
    }
  2. 添加 TLS/SSL 加密 :在 transport.cppsocket_transport中替换为 SSL 套接字。

  3. 实现 Token 认证:在连接建立时,要求客户端提供预共享密钥。

缺点:改动较大,需自行维护安全机制。

方案三:内网穿透工具(frp/ngrok)

原理:通过公网服务器中转流量。

配置示例(frp):

  1. 公网服务器(frps.ini):

    复制代码
    [common]
    bind_port = 7000
  2. 内网设备(frpc.ini):

    复制代码
    [common]
    server_addr = your-server-ip
    server_port = 7000
    
    [adb]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 5555
    remote_port = 8555
  3. 连接

    复制代码
    adb connect your-server-ip:8555

方案四:虚拟局域网(ZeroTier/Tailscale)

原理:将设备与主机加入同一虚拟局域网,获得虚拟内网 IP。

步骤:

  1. 在手机和 PC 上安装 ZeroTier,加入同一网络。

  2. 手机执行 adb tcpip 5555

  3. PC 通过虚拟 IP 连接:

    复制代码
    adb connect 手机虚拟IP:5555

🔒 三、安全建议

  1. 最小化暴露:仅将 adb 端口暴露给可信 IP(通过防火墙限制)。

  2. 使用 VPN/隧道:优先采用 SSH 或 VPN 等加密通道。

  3. 定期更新:关注 AOSP 安全更新,及时同步补丁。

  4. 监控日志 :检查 adb logcat中的异常连接尝试。

📦 四、参考实现代码片段

若选择方案二(直接修改 ADB),关键修改如下:

adb_server.cpp中添加配置解析:

复制代码
// 新增配置项
const char* listen_host = getenv("ADB_LISTEN_HOST");
if (listen_host == nullptr) {
    listen_host = "127.0.0.1"; // 默认本地
}
int port = 5037;
// 创建监听 socket
server_fd = socket_listen(listen_host, port);

transport.cpp中增加连接认证:

复制代码
static void handle_connection(int fd) {
    // 读取客户端发送的 token
    char token[32];
    read(fd, token, sizeof(token));
    if (!validate_token(token)) {
        close(fd);
        return;
    }
    // 继续原有逻辑
}

🎯 总结

方案 安全性 复杂度 适用场景
SSH 隧道 ⭐⭐⭐⭐⭐(加密) 低(无需改代码) 个人开发、临时调试
内网穿透 ⭐⭐⭐(依赖工具) 无公网 IP、长期远程
虚拟局域网 ⭐⭐⭐⭐(加密) 多设备、跨地域团队
直接暴露+认证 ⭐⭐(需自行实现) 定制化需求、内网环境

推荐选择 :对于大多数场景,SSH 隧道 是最安全、最简单的方案;若需长期稳定连接,可使用 虚拟局域网​ 工具。如需深度定制,可参考上述代码修改要点进行二次开发。

相关推荐
weixin_458580122 小时前
CSS如何为Bootstrap模态框增加进入动画_利用transition实现
jvm·数据库·python
资深数据库专家2 小时前
恒生 PK 中电金信
数据库·oracle·人大金仓数据库
justjinji2 小时前
Go语言如何用Jaeger_Go语言Jaeger链路追踪教程【完整】
jvm·数据库·python
m0_743623922 小时前
开发者工具怎么看HTML_Elements面板使用指南【操作】
jvm·数据库·python
Wyz201210242 小时前
C#怎么实现EF Core迁移 C#如何用Entity Framework Core进行数据库迁移和更新表结构【数据库】
jvm·数据库·python
u0109147602 小时前
如何在Kubernetes集群部署phpMyAdmin_Deployment与Service配置
jvm·数据库·python
m0_640309302 小时前
怎么通过SSH通道连接SQL Server_跳板机安全配置指南
jvm·数据库·python
HHHHH1010HHHHH2 小时前
CSS如何处理网格布局中的绝对定位_利用relative网格项作为参考系
jvm·数据库·python
yejqvow122 小时前
CSS项目样式如何模块化_应用BEM规范构建组件化逻辑
jvm·数据库·python