“;错误:关闭”;尝试通过TCP通过adb连接到Android设备时显示

“;错误:关闭”;尝试通过TCP通过adb连接到Android设备时显示,android,tcp,adb,Android,Tcp,Adb,我正在ARMv7开发板上构建Android系统。出于某种原因,我想使用“adb外壳”从我的PC上操作系统。由于Android系统使用NFS服务器作为其根文件系统,因此开发板和PC通过以太网连接。以下是我尝试过的(我在Android设备上有root访问权限): 在Android设备上(使用putty通过串行端口访问): 在Ubuntu主机上: android@ubuntu:~$ adb connect 192.168.0.85:5555 connected to 192.168.0.85:5555

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

在Android设备上(使用putty通过串行端口访问):

在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外壳”连接到它。最奇怪的是,我仍然可以看到通过“adb设备”连接的设备


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

我研究了
adb
的源代码,用gdb进行调试,最终找到了根本原因

基本上,为了响应主机命令,
adbshell
adbd
(在Android设备上运行的守护进程)应该打开一个伪终端,并派生另一个子进程来运行shell。这些功能在
system/core/adb/services.c
中的
create\u sublog\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;
    }

    ....
}
static int create_subproc_pty(常量字符*cmd,常量字符*arg0,常量字符*arg1,pid_t*pid)
{
....
int ptm;
ptm=unix_open(“/dev/ptmx”,O|RDWR | O|u CLOEXEC);//| O|NOCTTY);
如果(ptm<0){
printf(“[无法打开/dev/ptmx-%s]\n”,strerror(errno));
返回-1;
}
....
*pid=fork();
如果(*pid<0){
printf(“-fork失败:%s-\n”,strerror(errno));
亚行关闭(ptm);
返回-1;
}
....
}
我在开发板上发现,
unix\u open
函数失败。这是因为PTY驱动程序没有内置到内核中,所以在系统上找不到设备
/dev/ptmx

要解决这个问题,只需选择
字符设备-Unix98 PTY
驱动程序并重建内核,那么
adb shell
就可以工作了

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;
    }

    ....
}