尝试通过TCP连接adb到安卓设备时显示“error: closed”。

3
我正在ARMv7开发板上构建Android系统。由于某些原因,我想使用“adb shell”从我的PC操纵该系统。由于Android系统使用NFS服务器作为其根文件系统,所以开发板和PC通过以太网连接。这是我尝试过的内容(我在Android设备上拥有root访问权限):
在Android设备上(通过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服务器,但也没有用。
1个回答

3

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

基本上,为了响应主机命令adb shell,Android设备上运行的守护进程adbd应该打开一个伪终端,并分叉出另一个子进程来运行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 就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接