如何在Android模拟器上获取root权限?

204

我拥有所有Android SDK版本(从1.5到2.3.3),并尝试了许多在Android模拟器中获取root权限的方法。我不使用任何Android设备,而是在模拟器(AVD)上测试所有东西。

我需要在任何一个Android模拟器中获取root权限,以使用“iptables”和“busybox”功能。要使用iptables,我必须具有root权限。至少“su”命令应该在终端模拟器中执行。

我还安装了“z4root”应用程序,但它需要很长时间才能完成root,而且会卡住。有人说,如果我们将系统降级到RC30以下,就可以获得root权限。如果这是真的,那么该怎么做呢?我同时使用Linux和Windows操作系统。

请有人告诉我任何root模拟器的方法。


12
请注意,安卓模拟器已经被“rooted”。默认情况下,您无需执行任何操作即可获取root adb shell权限,因为它已经以root身份运行。这里讨论的是安装一个破解的“su”或类似的shim来允许应用程序代码启动作为root运行的辅助程序。 - Chris Stratton
在一篇被不友好删除的答案中,指出仿真器内核通常都缺乏对 iptables 的支持。 - Chris Stratton
请提供如何在Android 2.3模拟器上获取root访问权限的方法,以及如何在Android SDK模拟器上获取root访问权限的方法。这些链接分别是:https://dev59.com/VlTTa4cB1Zd3GeqPpRo7 和 http://stackoverflow.com/questions/8425352/root-access-on-android-sdk-emulator。 - Paul Verest
3
使用Genymotion https://www.genymotion.com/ 它非常快速,并且默认具有root权限。 - klimat
1
你安装了错误的镜像。请参见此处 --> https://dev59.com/JlcP5IYBdhLWcg3wu8a1 - otto
显示剩余3条评论
15个回答

172
如果您有具有root访问权限的虚拟设备,则应该可以完成此工作。
$ > adb shell
generic_x86:/ $
generic_x86:/ $ exit
$ > adb root
restarting adbd as root
$ > adb shell
generic_x86:/ #
如果您不需要 Google Play 应用程序,可能对此答案感兴趣。该答案解释了如何使用 Google APIs(又名Google Play服务)创建具有 root 访问权限的虚拟设备,但不包含 Google Play 应用程序。 如果您确实需要 Google Play 应用程序,则可能会对其他答案感兴趣,这些答案说明如何对 Android 虚拟设备进行 root 化。

89
иҝҗиЎҢadb rootе‘Ҫд»ӨдјҡжҳҫзӨәвҖңadbd cannot run as root in production buildsвҖқй”ҷиҜҜгҖӮжӮЁжҳҜеҗҰеңЁдҪҝз”Ёзү№е®ҡзҡ„жЁЎжӢҹеҷЁпјҹиҜ·жҸҗдҫӣжӣҙеӨҡиҜҰз»ҶдҝЎжҒҜгҖӮ - orodbhen
6
这个根目录不能用于任何应用程序。 - Enyby
8
如果有人试图在新的Google Play系统镜像上使用此方法,adbd在ramdisk.img中被设置为安全模式。我能够通过使用来自Google APIs镜像的ramdisk.img进行解决。我已在7.0和8.0镜像上测试过。 - tstaylor7
82
如果adb root命令出现错误信息:adbd cannot run as root in production builds,请参考https://dev59.com/JlcP5IYBdhLWcg3wu8a1#45668555--你需要使用“Google APIs System Image”而不是“Google Play System Image”。 - Jerry101
12
@JRaymond 我输入了adb root,但之后没有任何输出。 - user7691120
显示剩余12条评论

98

如何对Android模拟器进行root (在Android 7.1.1/ Nougat上测试通过)

要求:

说明:

  1. 安装SuperSu.apk文件
  • 首先安装SuperSu应用程序,只需拖放即可(如果运行最新的模拟器版本或通过adb侧载,即 adb -e install supersu.apk

  • 安装后,运行它会显示一个屏幕,如下所示,指示“未安装SU二进制文件..”。此错误仅确认设备尚未root。

enter image description here


  1. 使模拟器的系统分区可写
  • 正如其名称所示,我们需要给模拟器写入系统文件的权限。

  • 输入以下代码即可实现:emulator -avd {模拟器名称} -writable-system

如果您有多个AVD,请使用命令 emulator -list-avds 获取AVD列表。

注意:请导航到安装了Android SDK的 tools 文件夹并在那里按Shift和右键打开命令提示符。


  1. 将su二进制文件推送到系统目录中
  • 解压包含不同架构su二进制文件的Recovery flashable.zip文件

重要提示!仅使用与您的avd架构匹配的su二进制文件,例如x86、arm等,并注意提取这些二进制文件的路径。

  • 确保您正在以root身份运行adb,同时需要重新挂载。 只需输入以下代码

adb root

adb remount

现在是时候推送su二进制文件了:

这是我成功使用的代码: adb -e push C:\Users\User1\Desktop\rootemu\x86\su.pie /system/bin/su

(不用担心我的su二进制文件具体位置,只要没有空格,任何位置都可以)

注意:在控制台中执行以下操作以找出binxbin:> adb shell, > ls /system/xbin/su

如果失败了,请尝试将其推送到这个目录:/system/xbin/su。此外,对于运行Android 5.1及以下版本的模拟器,请使用su而不是su.pie
  1. 更改su二进制文件的权限
  • 接下来,让我们通过adb在模拟器设备上对su二进制文件进行一些修改:
adb -e shell
su root
cd /system/bin
chmod 06755 su

重要提示!!请注意su二进制文件的路径(我的是/system/bin)


  1. 设置su二进制文件的install指令并设置一个daemon

输入以下代码:

su --install

设置守护进程:

su --daemon&

重要!!注意空格


  1. 将SELinux设置为宽容模式(即关闭SELinux)
  • 最后通过以下代码关闭selinux:

setenforce 0


打开 SuperSU 应用,它可能会要求更新二进制文件,您可以使用普通方法。
注意:如果您遇到启动循环问题,请勿更新二进制文件,只需按原样使用即可。
这就是全部内容了!打开任何需要SU权限的应用程序进行双重检查,确实SuperSU会询问您是否希望授予它su权限。

enter image description here

要使根目录持久更新su二进制文件(使用普通方法),然后从临时目录(Users\AppData\Local\Temp\Android Emulator,该文件通常随机命名为例如1359g.tmp并具有较大的大小)复制system.img并替换默认的system.img更新: 我注意到在Linux中获取临时系统映像比在Windows中更容易。您可以尝试使用快照映像。
## 2018年8月4日更新
随着模拟器27.3.x的出现,通过快照功能(如果复制system.img方法不起作用)现在更容易保留根目录:
理想情况下,这更像是带有配置的虚拟设备休眠,因此所有内容都得以保存。
快照
您现在可以为给定设备配置保存多个AVD快照,并选择在启动模拟器时加载哪些已保存的快照。通过加载快照来启动虚拟设备就像从睡眠状态唤醒物理设备一样,而不是从关闭状态启动它。
这意味着启动模拟器的唯一要求是在正常的emulator -avd [avdname]命令中添加-writable-system参数来启动模拟器。(仅使用emulator -avd [avdname]运行模拟器不会启动已root的版本/副本,可能会导致某些错误)。

在API 22级上测试过

此外,有关启动循环问题,请参阅其他文章:Android模拟器:如何避免启动后的循环?和更新内容。

备注

参考中的大部分内容都是针对较旧的Android版本,因此需要修改不同的命令和路径。

鸣谢:


1
请注意:在控制台中执行以下命令以确定bin或xbin:> adb shell,> ls /system/xbin/su - djdance
2
我正在使用Pixel 2 XL:人们似乎与Pixel XL有相同的问题:https://forum.xda-developers.com/pixel-xl/how-to/guide-pixel-xl-android-9-0-pie-unlock-t3825866/page2 - noraj
4
这里漏掉了一步骤——在第一步之后,您需要关闭模拟器。因为第二步中的命令实际上是启动模拟器...如果您不关闭它,将会出现一个错误,提示运行多个模拟器是一项实验性功能。 - Sira Lam
2
第一个链接已失效。 - pookie
3
adb root:ADB以root权限运行的命令。 adbd cannot run as root in production builds: adbd在生产版本中无法以root权限运行。 - rulet
显示剩余19条评论

33

以下是您需要在模拟器运行时运行的命令列表,我已经测试了这个解决方案适用于Android 2.2上的AVD:

adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system  
adb push su /system/xbin/su  
adb shell chmod 06755 /system  
adb shell chmod 06755 /system/xbin/su

这个前提假设su二进制文件位于工作目录中。你可以在这里找到su和超级用户:http://forum.xda-developers.com/showthread.php?t=682828。 每次启动模拟器时,您需要运行这些命令。您可以编写一个脚本来启动模拟器并对其进行root。


17
请在此处包含您博客文章的相关部分。SO是一个回答问题的地方,而不是链接。 - cHao
4
没有这样的文件或目录 'SU'。 - Mahendran
4
这在2.2、2.3或2.3.3的模拟器上无法运行,我仅收到adb推送的错误提示:内存不足、目录不为空等。 - Pointer Null
2
@mice:正如错误提示所说,由于虚拟设备上的空间不足,您无法推送二进制文件。在启动模拟器时,您可以添加“-partition-size”选项来指定分区大小。请尝试使用“tools/emulator -avd MyAndroidVirtualDeviceName -partition-size 256”启动您的模拟器。 - a.b.d
2
在较新的模拟器上,重新挂载命令可能无法正常工作,您可以使用以下命令替换:`adb root` `adb remount` - Kamran Ahmed
显示剩余8条评论

20

对于带有5.1.1和6.0的AVD,我在Windows中使用了以下脚本:

set adb=adb -s emulator-5558
set arch=x64
set pie=
adb start-server
%adb% root
%adb% remount
rem %adb% shell mount -o remount,rw /system
%adb% shell setenforce 0
%adb% install common/Superuser.apk
%adb% push %arch%/su%pie% /system/bin/su
%adb% shell chmod 0755 /system/bin/su
%adb% push %arch%/su%pie% /system/xbin/su
%adb% shell chmod 0755 /system/xbin/su
%adb% shell su --install
%adb% shell "su --daemon&"
rem %adb% shell mount -o remount,ro /system

exit /b

需要从SuperSU获取UPDATE.zip。将它们解压到任何文件夹中。创建批处理文件并填写上述内容。不要忘记指定必要的架构和设备:set adb=adb -s emulator-5558set arch=x64。如果您运行的是Android 5.0或更高版本,请将set pie=更改为set pie=.pie。运行它。您将获得当前运行的临时root权限。
如果在重新挂载系统分区时出现错误,则需要从命令行启动AVD。请参见下面的第一步,适用于Android 7。
如果您想使其持久化-请在SuperSU中更新二进制文件,并将来自临时文件夹的system.img存储为默认system.img的替换。
如何将结果的临时root转换为永久性:
首先-进入SuperSu。它提供了一个二进制升级。以正常方式更新。拒绝重启。
其次-仅适用于模拟器。相同的AVD。问题在于系统映像中的更改不会被保存。您需要将它们保留给自己。
对于不同的模拟器已经有了不同的说明。
对于AVD,您可以尝试查找临时文件system.img,将其保存在某个地方,并在启动模拟器时使用。
在Windows中,它位于%LOCALAPPDATA%\Temp\AndroidEmulator,名称类似于TMP4980.tmp
您需要将其复制到一个名为avd device的文件夹(%HOMEPATH%\.android\avd\%AVD_NAME%.avd\),并将其重命名为system.img
现在,在启动时将使用它,而不是通常使用的那个。如果SDK中的映像已更新,则会有旧映像。
在这种情况下,您需要删除此system.img,然后重新创建它。
俄语的更详细手册:http://4pda.ru/forum/index.php?showtopic=318487&view=findpost&p=45421931

对于Android 7,您需要执行额外的步骤: 1. 手动运行模拟器。 转到sdk文件夹sdk\tools\lib64\qt\lib。 使用选项-writable-system -selinux disabled从此文件夹运行模拟器。 像这样:

F:\android\sdk\tools\lib64\qt\lib>F:\android\sdk\tools\emulator.exe -avd 7.0_x86 -verbose -writable-system -selinux disabled
  1. 您需要以root权限重新启动adbd:

    adb -s emulator-5554 root

并且重新挂载系统:

adb -s emulator-5554 remount

每次运行模拟器只能执行一次。任何其他的重新挂载都可能会破坏写入模式。因此,您不需要运行任何其他带有重新挂载的命令,例如mount -o remount,rw /system

其他步骤保持不变 - 上传二进制文件,将其作为守护程序运行等等。

AVD Android 7 x86 带有 root 权限的图片: AVD Android 7 x86 with root


如果您在执行su二进制文件时看到与PIE有关的错误 - 那么您上传到模拟器的二进制文件是错误的。您必须在存档中上传名为su.pie的二进制文件,但在模拟器上,它必须被命名为su,而不是su.pie

我使用以下步骤从临时文件夹中获取system.img: 1)cp /tmp/android/emulator-X8F7Hr ~/Desktop/system.img 2)将此system.img从临时文件夹复制到Android SDK的system-images文件夹中。 但是,当我重新启动模拟器时,模拟器不处于root状态...请指导我正确的路径。 - Satya
我已经在正常模式下更新了二进制文件并复制到AVD目录,但是root权限仍然没有保留。 - Satya
@Satya 是的。但是没有成功。我无法从根目录重新挂载系统以进行读写操作 - 权限被拒绝。如果没有它,就无法获得根权限。我认为需要更新SuperSU。而且你不能在预览版上获得根权限。等待完整版本发布。 - Enyby
在avd目录中,编辑hardware-qemu.ini文件并将disk.systemPartition.initPath重命名为disk.systemPartition.path。更多信息请参见此处:https://android.googlesource.com/platform/external/qemu.git/+/aa8236dc1b1ea300ab18716db5b8fab42aca3ca7/android/avd/hardware-properties.ini#317。 - Henri Gourvest
@HenriGourvest 我以前试过。以前它没有工作。因为模拟器非常改装 QEMU。也许现在可以工作-没有测试。 - Enyby
显示剩余8条评论

13

我认为最简单的方法是为命令sh创建一个别名,例如:

adb shell
mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
cd /system/bin
cat sh > su && chmod 4775 su

在 Android 模拟器 3.0 及以上版本上测试通过。


这对我也起作用了(在x86_64 android 5.02模拟器上),而在xbin中安装的建议则没有。 - Yannick
19
我收到了 "mount: '/system' not in /proc/mounts" 的信息。这句话的意思是在 "/proc/mounts" 中没有找到 "/system" 目录的挂载信息。 - Kenny Wyland
1
系统故障,错误代码为72。 - Duna

9
  1. 应使用未安装"Play商店"的虚拟设备。 注意: 如果您已经在模拟设备中存有一些数据库,则可以创建一个新的虚拟设备或编辑现有虚拟设备的设置。

  2. 创建并启动avd后,在任意位置打开终端,无论是在Android Studio还是从开始菜单中打开终端。

  3. 运行adb root命令。

现在你可以使用adb shell命令打开设备的shell窗口。

如果您连接了带有开发者选项的物理设备,则会收到类似于"adb.exe:more than one device / emulator"的消息。 在这种情况下,您可以使用命令'adb -e shell'

对于adb shell初学者的其他有用提示:

运行'ls'来查看所有文件。 使用cd更改目录。 输入目录名称的几个字母+ TAB自动完成名称。 '..'返回上级目录。


我感谢你简短而完整的回答。 - Matt

6
我知道这个问题很老了,但是我们可以通过使用Magisk来在模拟器中获取root权限,具体步骤请参考https://github.com/shakalaca/MagiskOnEmulator。基本上,它会修补initrd.img(如果存在),并修补ramdisk.img以便与Magisk配合使用。

它适用于 Android 11 模拟器且很容易使用,实际上是 2021 年最佳答案。 - Louis
最佳答案 - HostMAX
强烈推荐。具备 magisk 模块的便利性 :) - A. Abramov
在安卓系统中无法工作。 - wyx

5

4

这里是我整理好的包,包含了您所需的所有内容。 或者您可以使用这个脚本:

echo on
set device=emulator-5554
set avd_name=
set adb=d:\Poprygun\DevTools\Android\Android-sdk\platform-tools\adb -s %device%
set emulator=d:\Poprygun\DevTools\Android\Android-sdk\emulator\emulator
set arch=x86
set pie=

echo Close all ANDROID emulators and press any key
pause
start %emulator% -avd Nexus_One_API_25 -verbose -writable-system
echo Wait until ANDROID emulator loading and press any key
pause

%adb% start-server
%adb% root
%adb% remount
%adb% shell setenforce 0
%adb% install D:\SuperSU\SuperSU.apk
%adb% push D:\SuperSU\su\%arch%\su.pie /system/bin/su
%adb% shell chmod 0755 /system/bin/su
%adb% push D:\SuperSU\su\%arch%\su.pie /system/xbin/su
%adb% shell chmod 0755 /system/xbin/su
%adb% shell su --install
%adb% shell "su --daemon&"
pause
exit /b

3

我刚刚替换并为su分配了属性到~/Android/Sdk/system-images/android-22/google_apis/x86/system.img,现在在android 5上,即使是新系统,我也始终拥有root权限,只需安装SuperSu.apk即可。

Android 6 is necessary only
adb root
adb shell
>/system/xbin/su --daemon &
>setenfoce 0

此后,SuperSu.apk检测到已经获取了root权限。但是我没有更新二进制文件。


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