【问题标题】:“error: closed” displayed when trying to connect to Android device via adb through TCP尝试通过 TCP 通过 adb 连接到 Android 设备时显示“错误:关闭”
【发布时间】:2015-03-27 06:36:16
【问题描述】:

我正在 ARMv7 开发板上构建 Android 系统。出于某种原因,我想使用“adb shell”从我的 PC 操作系统。由于 Android 系统使用 NFS 服务器作为其根文件系统,因此开发板和 PC 通过以太网连接。这是我尝试过的(我在 Android 设备上具有 root 访问权限):

在安卓设备上(使用putty通过串口访问):

android@ubuntu:~$ setprop service.adb.tcp.port 5555
android@ubuntu:~$ stop adbd
android@ubuntu:~$ start adbd

在 Ubuntu 主机上:

android@ubuntu:~$ adb connect 192.168.0.85:5555
connected to 192.168.0.85:5555
android@ubuntu:~$ adb shell
error: closed
android@ubuntu:~$ adb devices
List of devices attached
192.168.0.85:5555       device

如消息所示,通过 adb 的连接似乎成功(连接到 ...),但是我不能“adb shell”连接它。最奇怪的是我仍然可以看到通过“adb devices”连接的设备。

我试图杀死 adb 服务器并重新启动它,但它也不起作用。

【问题讨论】:

    标签: android tcp adb


    【解决方案1】:

    研究了adb的源码,用gdb调试,终于找到了根本原因。

    基本上,为了响应主机命令adb shelladbd(Android 设备上运行的守护进程)应该打开一个伪终端,并 fork 另一个运行 shell 的子进程。这些在system/core/adb/services.c 中的create_subproc_pty 函数中实现:

    static int create_subproc_pty(const char *cmd, const char *arg0, const char *arg1, pid_t *pid)
    {
        ....
    
        int ptm;
    
        ptm = unix_open("/dev/ptmx", O_RDWR | O_CLOEXEC); // | O_NOCTTY);
        if(ptm < 0){
            printf("[ cannot open /dev/ptmx - %s ]\n",strerror(errno));
            return -1;
        }
    
        ....
    
        *pid = fork();
        if(*pid < 0) {
            printf("- fork failed: %s -\n", strerror(errno));
            adb_close(ptm);
            return -1;
        }
    
        ....
    }
    

    我在我的开发板上发现,unix_open 函数失败了。那是因为 PTY 驱动程序没有内置在内核中,所以在系统上找不到设备/dev/ptmx

    要解决这个问题,只需选择Character Devices - Unix98 PTY驱动并重建内核,然后adb shell就可以工作了。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 2016-09-21
      • 2014-07-19
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2018-10-21
      • 2012-11-04
      相关资源
      最近更新 更多