我正在ARMv7开发板上构建Android系统.由于某种原因,我想使用“ adb shell”从PC上操纵系统.由于Android系统使用NFS服务器作为其根文件系统,因此开发板和PC通过以太网连接.这是我尝试过的方法(我在Android设备上具有root用户访问权限):
在Android设备上(通过带腻子的串行端口访问):
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设备”连接的设备.
我试图杀死adb服务器并重新启动它,但是它也不起作用.
解决方法:
我研究了adb的源代码,使用gdb进行了调试,最后找到了根本原因.
基本上,为了响应主机命令adb shell,adbd(在Android设备上运行的守护程序)应打开一个伪终端,并派生另一个运行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将起作用.
标签:tcp,adb,android
来源: https://codeday.me/bug/20191120/2044887.html