【问题标题】:adb shell su works but adb root does notadb shell su 有效,但 adb root 无效
【发布时间】:2014-10-18 02:27:50
【问题描述】:

我已将解锁的 Galaxy S3 (SGH-T999) 植根

现在,我正在尝试从 Windows 命令提示符 运行 adb root,但是,我收到了 adbd cannot run as root in production builds 错误。所以,我检查的第一件事就是我的手机是否真的root了?

所以我尝试了以下方法:

打开命令提示符

$adb devices // lists my device
$adb shell //goes to shell
$su // opens a 'SuperSu' prompt on my phone and I 'Grant' permission
# // Before following the rooting instructions, I was getting 'no su command found' in the previous step. So, I believe my phone is ROOTED. **Correct me if I'm wrong.**

但是,当我执行adb root 时,我收到adbd cannot run as root in production builds 错误。 所以,我想,除了上面所做的之外,我可能还需要做一些额外的事情。我尝试了以下 SO 问题中的所有解决方案:

以上都不适合我。他们所做的只是在 SHELL 内部授予 ROOT 访问权限。我想让adb root 工作,这样我就可以在不进入 shell 的情况下执行各种 adb 命令。

【问题讨论】:

  • 在 android > 4.3 中不起作用。 su 不见了。

标签: android shell adb root


【解决方案1】:

根据设计,adb root 命令仅适用于开发版本(即enguserdebug,默认情况下具有ro.debuggable=1)。因此,要在您的其他root 设备上启用adb root 命令,只需将ro.debuggable=1 行添加到以下文件之一:

/system/build.prop
/system/default.prop
/data/local.prop

如果您希望 adb shell 默认以 root 开头 - 然后添加 ro.secure=0

或者,您可以使用修改后的 adbd 二进制文件(不检查 ro.debuggable

来自https://android.googlesource.com/platform/system/core/+/master/adb/daemon/main.cpp

#if defined(ALLOW_ADBD_ROOT)
// The properties that affect `adb root` and `adb unroot` are ro.secure and
// ro.debuggable. In this context the names don't make the expected behavior
// particularly obvious.
//
// ro.debuggable:
//   Allowed to become root, but not necessarily the default. Set to 1 on
//   eng and userdebug builds.
//
// ro.secure:
//   Drop privileges by default. Set to 1 on userdebug and user builds.

【讨论】:

  • 我在哪里可以获得上述编译的可执行文件?
  • 我将 ro.debuggable 和 ro.secure 的新值添加到您指定的文件中,但它们在每次重新启动时仍会被覆盖,并且更改没有任何效果。
  • 我的平板电脑没有 vi 或 edlin。如何编辑这些 .prop 文件?并且文件本身不授予任何人任何写入权限,包括 root。
  • 我能够编辑 build.prop 文件并且它有效!谢谢。请参阅下面归功于 Alex P 的我的回答。
【解决方案2】:

在一些开发人员友好的 ROM 中,您只需在 设置 > 开发人员选项 > Root 访问权限 中启用 Root 访问权限。之后adb root 变为可用。不幸的是,它不适用于市场上的大多数库存 ROM。

【讨论】:

  • 我在开发选项中没有看到“根访问”选项。
  • @Amalgovinus 我认为这取决于您使用的房间。 :)
  • @NgaNguyenDuy 你能确定你使用的是哪个ROM吗?
【解决方案3】:

我在尝试 root 模拟器时遇到了这个问题,我发现这是因为我运行的是装有 Google Play 的 Nexus 5x 模拟器。创建了一个没有 google play 的不同模拟器,adb root 将为您创建设备。希望这可以帮助某人。

【讨论】:

  • 我们如何区分这两个模拟器?
  • @Sanjay 当您打开 Android 虚拟设备管理器时,您应该会看到一个 Play Store 选项卡,并且您要确保尝试 root 的设备上没有 Play Store 图标。
  • 2020,这对我有帮助,但我确实需要一种方法来在没有根手机的情况下启用 Play 商店但不确定是否可行
【解决方案4】:

我用于在 abd shell 中进入 su 模式

adb shell "su"

【讨论】:

  • 在 Mac OS 上,我收到“/system/bin/sh: su: not found”错误。请问有什么建议吗?
  • @SachinG 也许您使用了错误的引号类型?尝试运行这个adb shell "su -c whoami"
  • @gkpln3 仍然遇到同样的错误。 /system/bin/sh: su: 未找到
【解决方案5】:

我有一个扎根的三星 Galaxy Trend Plus (GT-S7580)。

运行“adb root”给我同样的“adbd cannot run as root in production builds”错误。

对于具有开发者选项 -> Root 访问权限的设备,选择“仅 ADB”以提供对设备的 adb root 访问权限(如 NgaNguyenDuy 所建议的那样)。

然后尝试按照Launch a script as root through ADB 的解决方案运行命令。 就我而言,我只是想运行“netcfg rndis0 dhcp”命令,我是这样做的:

adb shell "su -c netcfg rndis0 dhcp"

请检查您在这种方式运行时是否出错。

如果仍然无法正常工作,请检查您是否正确植根设备。 如果还是不行,请尝试安装自定义 ROM,例如 Cyanogen Mod,以使“adb root”正常工作。

【讨论】:

    【解决方案6】:

    您需要将 boot.img/sbin/ 文件夹中的 adbd 二进制文件替换为支持 su 的文件。您还必须进行一些 default.prop 编辑。

    三星似乎比其他供应商更难做到这一点。我有一些你可以尝试的 adbd 二进制文件,但它需要使用新的二进制文件反编译和重新编译 boot.img 的知识。此外,如果你有一个锁定的引导加载程序......这不会发生。

    Chainfire 也有一个应用可以在 Play 商店中授予 adbd root 权限:https://play.google.com/store/apps/details?id=eu.chainfire.adbd&hl=en

    最后,如果您尝试编写具有 SU 权限的 Windows 脚本,您可以使用以下命令样式执行此操作...但是,您至少需要在第一次授予(在电话上)SU 权限跑了……

    adb shell "su -c ls" /data/test.file"

    这些只是一些例子。如果您具体说明您要完成的工作,我可能会提供更具体的建议

    -斯科斯勒

    【讨论】:

      【解决方案7】:

      adbd 有一个编译标志/选项来启用 root 访问:ALLOW_ADBD_ROOT=1

      直到 Android 9:如果您设备上的 adbd 编译时没有该标志,则在启动时它总是会放弃特权,因此“adb root”根本没有帮助。 I had to patchsetuid()setgid()setgroups() 的调用以及我自己从二进制文件中退出以在我的电子书阅读器上获得永久根目录的 adbd。

      在 Android 10 中,这种情况发生了变化;当手机/平板解锁时(ro.boot.verifiedbootstate == "orange"),无论如何都可以使用adb root模式。

      【讨论】:

        【解决方案8】:

        如果您确实需要将ADBroot 运行,最快最简单的方法是安装Android Custom ROM,最流行的是CyanogenMod,因为它在开发者选项菜单中有Root Access 选项,其中您可以选择授予apps and ADB 的root 访问权限。我以前使用过 CM,但由于它不再开发,我尝试在那里寻找一些解决方案。尽管 CyanogenMod 仍然是一个不错的选择,因为它没有英国媒体报道。

        我从朋友那里发现的另一种选择是使用 adbd insecure 应用程序,您可以从这里尝试:https://forum.xda-developers.com/showthread.php?t=1687590。就我而言,它适用于 Android 自定义内核,但不适用于 Android 库存 ROM(仅限 vanilla android)。您也可以尝试其他方法,例如修改 Android ROM 的boot.img

        【讨论】:

          【解决方案9】:

          就我而言,(设备已植根)

          linux$ adb shell      #  in linux shell
          mobile$ su root       #=> notice the $ will become #
          mobile# whoami        #=> root
          

          如果你在 Magisk 中安装了“adb root”模块,你仍然需要通过su root 手动切换到root,否则,它看起来就像你是 root,但实际上你不是 root。

          【讨论】:

            【解决方案10】:

            我有一台运行 Android 7.0 的三星 Galaxy Tab S2。 这是我今天扎根的方法:

            1. Root the device using Odin

            2. 在此线程中阅读Alex P.'s answer,了解编辑 system\build.prop 文件。

            3. 下载到您的平板电脑上:v1.3.9 System Tools Android: All-In-One toolbox

            4. 运行应用程序;在“系统实用程序”下确认您的 Odin 根使用“根检查”工作

            5. 在同一应用程序中转到“根管理器”并使用“Build.prop 编辑器”来影响 system\build.prop 中的更改(由 Alex P. 指定)。

            最终确认:

            C:\Android\sdk\platform-tools>adb shell
            gts28vewifi:/ $ whoami
            shell
            gts28vewifi:/ $ su
            gts28vewifi:/ # su root
            gts28vewifi:/ # whoami
            root
            
            1. 支持 Alex P. 的回答。

            Further info and here and here too

            【讨论】: