“error: closed” displayed when trying to connect to Android device via adb through TCP
“error: closed” displayed when trying to connect to Android device via adb through TCP
我正在 ARMv7 开发板上构建 Android 系统。出于某种原因,我想使用 "adb shell" 从我的 PC 上操作系统。由于 Android 系统使用 NFS 服务器作为其根文件系统,因此开发板和 PC 通过以太网连接。这是我尝试过的方法(我在 Android 设备上具有根访问权限):
在 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 服务器并重新启动它,但它也不起作用。
研究了adb
的源码,用gdb调试,终于找到了根本原因。
基本上,为了响应主机命令 adb shell
,adbd
(Android 设备上的守护进程 运行)应该打开一个伪终端,然后 fork 运行 shell 的另一个子进程。这些在 create_subproc_pty
函数中实现 system/core/adb/services.c
:
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
。
要解决这个问题,只需selectCharacter Devices - Unix98 PTY
驱动程序和重建内核,然后adb shell
就可以了。
我正在 ARMv7 开发板上构建 Android 系统。出于某种原因,我想使用 "adb shell" 从我的 PC 上操作系统。由于 Android 系统使用 NFS 服务器作为其根文件系统,因此开发板和 PC 通过以太网连接。这是我尝试过的方法(我在 Android 设备上具有根访问权限):
在 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 服务器并重新启动它,但它也不起作用。
研究了adb
的源码,用gdb调试,终于找到了根本原因。
基本上,为了响应主机命令 adb shell
,adbd
(Android 设备上的守护进程 运行)应该打开一个伪终端,然后 fork 运行 shell 的另一个子进程。这些在 create_subproc_pty
函数中实现 system/core/adb/services.c
:
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
。
要解决这个问题,只需selectCharacter Devices - Unix98 PTY
驱动程序和重建内核,然后adb shell
就可以了。