我正在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对其进行了调试,最后找到了根本原因。
基本上,为了响应host命令adb shell
,adbd
(运行在Android设备上的守护程序)应打开一个伪终端,并派生另一个运行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
在系统上找不到该设备。
要解决此问题,只需选择Character Devices - Unix98 PTY
驱动程序并重建内核,然后即可adb shell
使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句