adb shell su可以工作,但adb root无法工作

118

我已经root了我的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能够正常工作,这样我就可以执行各种adb命令,而不必进入shell。

7
无法在 Android 4.3 及以上版本中运行。su 文件缺失。 - drdrej
我需要使用adb pull从数据中复制文件,但它要求Root权限。 - Paul K.
11个回答

47

按设计,adb root命令仅在开发版本中运行(即默认具有ro.debuggable=1enguserdebug)。因此,要在已经rooted的设备上启用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.

12
我可以在哪里获取上述编译后的可执行文件? - Syed Waqas Bukhary
7
我已经向你指定的文件中添加了 ro.debuggable 和 ro.secure 的新值,但它们在每次重启时仍会被覆盖,并且更改没有任何效果。 - Pythagoras of Samos
1
我的平板电脑上没有vi或edlin。我该如何编辑这些.prop文件呢? 而且这个文件本身不允许任何人包括root进行写入操作。 - JDOaktown
我成功地编辑了build.prop文件,它起作用了!谢谢。请查看我的答案,感谢Alex P. - JDOaktown

36
在一些开发者友好型的ROM中,你可以在设置中启用Root访问权限,路径为设置 > 开发选项 > Root访问权限。之后adb root就会变得可用。不幸的是,大多数市场上的原厂ROM都不支持此功能。

77
开发者选项中没有“Root访问”选项。 - Alkanshel
2
@Amalgovinus 我认为这取决于你使用的房间。 :) - NgaNguyenDuy
1
@NgaNguyenDuy 你能否告诉我你正在使用哪个ROM? - Lobster Fighter

31

在尝试对模拟器进行root时,我遇到了这个问题。后来发现是因为我使用的是带有Google Play的Nexus 5x模拟器。创建一个没有Google Play的不同模拟器,然后使用adb root命令即可为设备进行root。希望这能帮助到某些人。


我们如何区分两个模拟器? - Sanjay
1
@Sanjay 当您打开 Android 虚拟设备管理器时,您应该看到一个 Play Store 选项卡,并确保在您尝试 root 的设备上没有 Play Store 图标。 - Andrew Steinmetz
2
2020年,这对我很有帮助,但我确实需要一种在启用Play商店的设备上进行操作的方法,而不需要root手机,但不确定是否可能。 - trigster

10

我有一台已经root过的三星Galaxy Trend Plus(GT-S7580)手机。

运行'adb root'命令时,出现了“adbd cannot run as root in production builds”的错误信息。

对于开启了开发者选项-》Root访问权限的设备,选择“仅限ADB”选项即可为设备提供adb root访问权限(如NgaNguyenDuy所建议的那样)。

然后按照通过ADB以root身份运行脚本中的解决方案尝试运行命令。

在我的情况下,我只想运行“netcfg rndis0 dhcp”命令,我是这样做的:

adb shell "su -c netcfg rndis0 dhcp"

请检查您在运行时是否有任何错误。
如果仍然无法工作,请检查您是否正确地获取了设备的root权限。 如果还是没有成功,请尝试安装自定义ROM,例如Cyanogen Mod,以便'adb root'正常工作。

10

我在adb shell中使用以下命令进入su模式:

adb shell "su"


5
在Mac OS上,我遇到了"/system/bin/sh: su: not found"的错误。有任何建议吗? - Sachin G
2
@SachinG 或许你使用了错误类型的引号?尝试运行这个命令 adb shell "su -c whoami" - gkpln3
@gkpln3 仍然出现相同的错误。/system/bin/sh:su:未找到 - Sachin G

8
您需要替换boot.img/sbin/文件夹中的adbd二进制文件为支持su的版本。您还需要进行一些default.prop编辑。
相比其他厂商,三星似乎让这个过程更加困难。我有一些adbd二进制文件供您尝试,但这将需要解编译并重新编译带有新二进制文件的boot.img的知识。此外,如果您的启动加载程序已锁定,则无法进行此操作。
此外,Chainfire在应用商店中提供了一个可以授予adbd root权限的应用程序:https://play.google.com/store/apps/details?id=eu.chainfire.adbd&hl=en 最后,如果您想要编写具有SU权限的Windows脚本,可以使用以下命令样式...但是,您至少需要在手机上第一次运行时授予SU权限...
adb shell "su -c ls" <-使用su权限列出工作目录。 adb shell "su -c echo anytext > /data/test.file"
这些只是一些例子。如果您明确说明您要完成的任务,我可能能够给出更具体的建议。
-scosler

6

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

在Android 9之前:如果您的设备上的adbd编译时没有该标志,它将始终在启动时降低权限,因此“adb root”将毫无作用。我不得不对setuid()setgid()setgroups()和能力丢弃二进制文件中的调用进行修补,才能在我的电子书阅读器上获得永久的根化adbd(参考链接)

在Android 10中,当手机/平板解锁时(ro.boot.verifiedbootstate == "orange"),则无论如何都可以使用adb root模式。


2
如果你确实需要将ADB设置为root,最快最简单的方法是安装Android定制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


2

在我的情况下,(设备已经被root)

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

如果您在Magisk中安装了“adb root”模块,则仍需手动切换到root,方法是使用su root命令。否则,看起来您已经获得了root权限,但实际上您并没有。


2
我有一台运行Android 7.0的三星Galaxy Tab S2。 以下是今天我如何进行root操作的步骤:
  1. 使用Odin对设备进行root操作

  2. 阅读Alex P.在这个线程中的回答,了解如何编辑system\build.prop文件。

  3. 在平板电脑上下载版本为v1.3.9的System Tools Android: All-In-One toolbox

  4. 运行应用,通过“Root Check”确认您的Odin root操作成功

  5. 在同一个应用程序中,进入“Root Manager”,并使用“Build.prop editor”来更新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.的答案点赞。

更多信息 以及这里 还有这里


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