当Android设备缺少/system/bin/sh时,我该如何获得可用的adb shell?

3

我正在尝试为Measy U2C HDMI棒构建Android Jellybean源代码。我已经成功构建并安装了所有分区(启动、内核、杂项、恢复、系统...)。但我遇到的问题是系统分区似乎没有挂载。运行以下命令时出现问题:

adb ls /system

我得到了以下输出:
000041ed 00000400 51301410 .
000041c0 00000800 00000003 lost+found
000041ed 00000000 00000001 ..

我想要通过adb shell进入设备,并尝试调试为什么系统分区无法挂载,但是adb希望在/system/bin/sh中有一个可用的shell。

$ adb shell
- exec '/system/bin/sh' failed: No such file or directory (2) -

我的问题是,我该如何让adb在其他地方查找shell命令,以便我可以让它工作?或者有没有其他方法可以远程连接到设备并进行调试?/sbin/busybox中有一个busybox安装程序,因此如果我可以以某种方式调用它,我就可以解决这个问题。


1
放错地方了吗?这里是开发问答。你的问题似乎与系统有关... - Phantômaxx
1个回答

3
"

"SHELL_COMMAND" 在 adb/services.c 中似乎是硬编码的,可以在非官方副本中浏览到该文件:

"

https://github.com/android/platform_system_core/blob/master/adb/services.c

假设您正在从源代码构建,那么您应该能够更改此内容。但是,如果您想将其指向较短的路径,则还可以编辑二进制文件并将终止空值上移。

另一种调查问题的方法可能是在引导到恢复分区后尝试手动挂载有问题的系统分区,以查看会出现什么错误。

还有一个想法是在启动脚本中放置一些内容,以启动侦听某些内容的备用shell,您可以使用adb将其转发到套接字 - 我没有想到一个明显的原因为什么设置adb转发会取决于设备端shell,但我没有通过实验或检查代码验证这一点。

如果您想变得非常聪明,我相信您可以在根文件系统上创建一个包含sh副本的/system/bin。我的回忆是您可以将文件系统挂载到非空目录上 - 不确定是否存在与该目录的打开文件描述符有关的问题,例如对于运行的sh本身,但是您的挂载已失败,您可以尝试在其他位置手动挂载以调试该问题。


我试着将mksh复制到sbin并在那里调用它,但它有库依赖性,所以我最终重新编译了adb,并将SHELL_COMMAND指向/sbin/busybox,然后将其重新刷新到/sbin目录中。它足够好用,虽然我必须在交互式shell中输入的每个命令名之前加上“busybox<command name>”。对于我需要的东西来说已经足够接近了,我不会费心去弄清为什么。 - Kirby Todd
你要么没有将其他命令作为符号链接到busybox,要么没有将它们添加到你的路径中。 - Chris Stratton

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