【问题标题】:How can I get a working adb shell on android when /system/bin/sh is missing?当 /system/bin/sh 丢失时,如何在 android 上获得工作的 adb shell?
【发布时间】:2014-02-11 14:11:13
【问题描述】:

我正在尝试从 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 安装,所以如果我能以某种方式调用它,我就能解决这个问题。

【问题讨论】:

  • 问错问题了?这是一个开发问答。您的问题似乎与系统相关...

标签: android shell adb


【解决方案1】:

“SHELL_COMMAND”似乎在 adb/services.c 中被硬编码,其非官方副本可在

中浏览

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

鉴于您是从源代码构建的,您应该能够更改这一点。但由于您想将其指向更短的路径,您也可以编辑二进制文件并将终止的 null 向上移动。

另一种调查问题的方法是查看在引导到恢复分区后是否可以获得工作的 adb shell,然后尝试在那里手动挂载有问题的系统分区,看看会导致什么错误。

还有一个想法是在启动脚本中放置一些东西,它会启动一个备用 shell 来监听你可以将套接字转发给使用 adb 的东西 - 我没有想到一个明显的原因设置 adb forwards 将取决于设备端的 shell,但我还没有通过实验或检查代码来验证。

如果你想变得非常聪明,我相信你可以在 root 文件系统上创建一个包含sh 副本的 /system/bin。我的回忆是,您可以在非空目录上挂载文件系统 - 不确定该目录的打开文件描述符是否会出现问题,例如正在运行的 sh 本身,但无论如何您的挂载都失败了,并且您可以尝试在其他地方手动挂载以调试该问题。

【讨论】:

  • 我尝试将 mksh 复制到 sbin 并在那里调用它,但它具有库依赖关系,所以,是的,我最终使用指向 /sbin/busybox 的 SHELL_COMMAND 重新编译 adb 并将其重新刷新到 /sbin 目录。它工作得很好,尽管我必须在交互式 shell 中输入所有内容之前都使用“busybox ”。它足够满足我的需要,我不会费心去弄清楚为什么会这样。
  • 你要么没有其他命令作为busybox的符号链接,要么没有它们在你的路径中。
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2017-11-17
  • 2017-09-01
  • 1970-01-01
  • 2014-08-11
相关资源
最近更新 更多