如何在Android模拟器上获得root访问权限?


146

我拥有所有Android SDK版本(从1.5到2.3.3),并且尝试了许多方法来在Android仿真器中扎根。我不使用任何Android设备,而是在模拟器(AVD)上测试所有内容。

我需要在任何一个Android模拟器中都具有root用户访问权限,才能使用“ iptables”和“ busybox”功能。要使用iptables,我必须具有root用户访问权限。Atleast'su'命令应在终端仿真器中执行。

我还安装了z4root应用程序

但是,这需要很长时间,并且无法生根,并且会卡住。有人说,如果我们将系统降级到RC30以下,则可以获取root用户访问权限。如果这是真的,那该怎么办呢?我同时使用Linux和Windows OS。

请有人告诉我任何方法来建立我的模拟器。


我认为您可以使用存储在filecrop(Android系统中为VISIONary)上的“ Root.apk”来启动仿真器,因为在每次重新启动时,它都会启动系统。Z4root无法工作,因为它需要重新启动才能使root用户访问正常。对不起,英语不好,我是法语。
JeremLeOuf 2012年

我在哪里可以得到这个?有手册吗?
android开发人员

6
请注意,Android模拟器已经“扎根”。您无需执行任何操作即可获得根adb shell,因为它在默认情况下已作为root运行。这里讨论的是安装被黑的“ su”或类似的填充程序,以允许应用程序代码启动以root用户身份运行的帮助程序。
克里斯·斯特拉顿

2
使用Genymotion genymotion.com它非常快速,默认情况下具有root用户。
klimat 2014年

1
您安装了wrnong映像。看到这里-> stackoverflow.com/questions/43923996/…–
wwwwwwwwwwww

Answers:


136

这些答案都不必要地复杂:)

$ > adb shell
generic_x86:/ $
generic_x86:/ $ exit
$ > adb root
restarting adbd as root
$ > adb shell
generic_x86:/ #

52
运行adb root结果为“ adbd无法在生产版本中以root身份运行”。您在使用特定的模拟器吗?请提供更多详细信息。
orodbhen

3
您不能将此根目录用于任何应用程序。
Enyby

5
如果有人试图使其在新的Google Play系统映像上运行,则将adbd设置为在ramdisk.img中进行保护。我可以使用Google API映像中的ramdisk.img来解决此问题。我在7.0和8.0图像上都进行了测试。
tstaylor7

46
如果adb root出现错误adbd cannot run as root in production builds,请参阅stackoverflow.com/a/45668555/1682419-您需要“ Google API系统映像”而不是“ Google Play系统映像”。
Jerry101 '17

10
@JRaymond我输入了adb根目录,但此后未打印任何内容

75

如何启动android模拟器(在Android 7.1.1 / Nougat上测试)

要求

使用说明

  1. 安装SuperSu.apk

    • 首先安装SuperSu应用程序,只需拖放即可(如果运行最新的仿真器版本或通过adb进行侧面加载,例如adb -e install supersu.apk

    • 安装后,运行时将显示如下屏幕,指示“未安装SU二进制文件。”。此错误只是确认设备尚未生根。

在此处输入图片说明


  1. 使模拟器的系统分区可写

    • 正如它建议的那样,我们需要授予仿真器写入系统文件的权限。

    • 键入以下代码以完成此操作: emulator -avd {emulator_name} -writable-system

如果您有多个AVD,则可以使用以下命令获取avds列表: emulator -list-avds

注意:导航至安装了Android SDK 的工具文件夹,然后通过按住shift键并单击鼠标右键单击以打开命令提示符。


  1. 在系统目录中推送su二进制文件

    • 解压缩Recovery flashable.zip(包含不同体系结构的二进制文件)

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

  • 确保您以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及以下版本的模拟器,请使用susu.pie


  1. 更改su二进制文件的权限

    • 接下来,让我们对su binary的权限进行一些修改。我们必须通过adb在模拟器设备中执行此操作:

    adb -e shell su root cd /system/bin chmod 06755 su

重要!!注意su二进制路径(我的是/ system / bin)


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

输入代码:

su --install

并设置守护程序:

su --daemon&

重要!!注意间距


  1. 将SELinux设置为许可(即关闭SE Linux)

    • 最后通过以下代码关闭selinux:

setenforce 0


  1. 打开SuperSU应用程序,它可能会要求更新二进制文件,您可以使用Normal方法。

注意:如果您遇到引导循环,而不是不更新二进制文件,请直接使用它。


差不多了!!

打开任何需要SU权限的应用程序只是为了仔细检查,实际上SuperSU会询问您是否要授予它su权限。

在此处输入图片说明

要让root持久更新su二进制文件(使用Normal方法),然后从temp目录中复制system.img(Users\AppData\Local\Temp\Android Emulator该文件通常是随机命名的,例如1359g.tmp,具有较大的大小)并替换default system.img

更新

我注意到,在Linux中,比Windows更容易获得临时系统映像。您可以尝试使用快照图像。

更新2018年8月4日

随着模拟器的出现,27.3.x它现在通过快照功能(如果复制system.img方法无效)使保留根变得更加容易:

理想情况下,它更像是具有完整配置的虚拟设备hibernarig,因此可以保留所有内容。

快照

现在,您可以为给定的设备配置保存多个AVD快照,并选择在启动仿真器时加载哪些已保存的快照。通过加载快照来启动虚拟设备非常类似于将物理设备从睡眠状态中唤醒,而不是从关机状态中引导虚拟设备。

这意味着启动仿真器的唯一要求是将-writable-system参数添加到正常emulator -avd [avdname]命令中以启动仿真器。(仅与一起运行模拟器emulator -avd [avdname]不会启动根目录版本/副本,否则可能会导致某些错误

经过API等级22测试

有关bootloop的问题,请参见另一篇文章:Android模拟器:生根后如何避免启动循环?及其更新。

备注

参考中的大多数内容是针对较早的android版本的,因此是我修改了不同命令和路径的原因。

致谢;


1
注意:要弄清bin或xbin,请在控制台之前执行:> adb shell,> ls / system / xbin / su
djdance

1
@xavier_fakerat是的,我停止更新二进制文件。问题是,每次重新启动后,我都必须重新安装计算机并su --install && su --daemon&在仿真器上运行,然后setenforce 0获得root权限。您知道重启时对root的任何永久修复吗?
Cristian Holdunu '17

1
真好!此方法还适用于可以通过adb访问root的实际设备。
Mygod '18年

1
您回答了我,为什么在不使用-writable-system的情况下,为根目录镜像后android仿真器意外关闭。这是因为快照。
罗德里罗克

1
我使用的是Pixel 2 XL:人们似乎对Pixel XL也有同样的问题:forum.xda-developers.com/pixel-xl/how-to/…–
noraj

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。每次启动模拟器时,都需要运行这些命令。您可以编写一个脚本来启动仿真器并将其启动。


15
请在此处添加博客文章的相关部分。SO是答案的地方,而不是链接。
cHao 2011年

2
没有这样的文件或目录“SU”
马亨德兰

4
这不工作的模拟器2.2,2.3或2.3.3我只得到错误亚行推:内存不足,DIR不是空的,等等
指针空

2
@mice:如错误所示,您无法推送二进制文件,因为虚拟设备上没有足够的空间。启动仿真器时,可以添加-partition-size选项以指定分区大小。尝试通过tools/emulator -avd MyAndroidVirtualDeviceName -partition-size 256
Abd 2012年

2
在较新的仿真器上,重新安装命令可能不起作用,您可以将以下命令替换 adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system 为: adb root adb remount
Kamran Ahmed

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。将它们解压缩到任何文件夹。创建上面内容的bat文件。不要忘记指定必要的体系结构和设备:set adb=adb -s emulator-5558set arch=x64。如果您运行的Android高于或等于5.0,请更改set pie=set pie=.pie。运行。您将获得当前运行的临时根目录。

如果重新安装系统分区时出错,则需要从命令行启动AVD。请参阅以下针对Android 7的第一步。

如果要使其永久存在-在SuperSU中更新二进制文件,并将temp文件夹中的system.img存储为默认system.img的替换。

如何在永久性上转换所得的临时根

首先-它去了SuperSu。它提供了二进制升级。以正常方式更新。重新启动拒绝。

第二-仅与仿真器有关。相同的AVD。底线是不会保存系统映像中的更改。您需要自己保留它们。

已经有针对不同仿真器的说明。

对于AVD,您可以尝试找到一个临时文件system.img,将其保存在某个地方,然后在启动模拟器时使用。

在Windows中,它位于中,%LOCALAPPDATA%\Temp\AndroidEmulator名称类似TMP4980.tmp

您将其复制到文件夹avd设备(%HOMEPATH%\.android\avd\%AVD_NAME%.avd\),然后重命名为system.img

现在将在开始时使用它,而不是通常使用的方法。如果SDK中的映像已更新,则为true,它将具有旧的映像。

在这种情况下,您将需要删除this 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. 您需要adbd从root 重新启动:

    adb -s emulator-5554根目录

并重新安装系统:

adb -s emulator-5554 remount

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

另一个步骤保持不变-上传二进制文件,将二进制文件作为守护程序运行,依此类推。

来自具有根目录的AVD Android 7 x86的图片: 带根的AVD Android 7 x86


如果您在执行su二进制文件时看到有关PIE的错误-那么您将错误的二进制文件上传到仿真器。您必须su.pie在归档文件中上传名为的二进制文件,但在仿真器上必须将其命名为su,而不是su.pie


您能告诉我使根永久化的步骤吗?
萨蒂亚2015年

update binary in SuperSU and store system.img from temp folder as replace of default system.img.
Enyby 2015年

我使用以下步骤从temp 1中获取system.img:cp / tmp / android / emulator-X8F7Hr〜/ Desktop / system.img 2)从temp中将此system.img复制到Android SDK的系统映像中重新启动仿真器,然后仿真器不处于root状态...请引导我正确的路径
Satya 2015年

最好复制到avd目录。但首先,您必须以正常模式在SuperSu中更新二进制文件。
Enyby 2015年

我已在正常模式下更新了二进制文件并复制到了AVD目录中,然后根目录也没有保留
Satya 2015年

13

我相信最简单的方法是为命令创建别名sh,例如

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

在Android Emulator 3.0及更高版本上进行了测试。


这也对我有用(在x86_64 android 5.02模拟器上),但是上面在xbin中安装的建议却没有。
亚尼克(Yannick)

7
我得到了mount: '/system' not in /proc/mounts
肯尼·怀兰德

系统失败,72
多瑙河

3

这是我随身携带的所有物品。或者您可以使用以下脚本:

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

2

我刚刚将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会看到根。但是我不更新二进制文件


1

我使用了上面解决方案中的部分方法;但是,它们不能完全正常工作。在最新版本的Andy上,这对我有用:

在安迪(Root Shell)上[要获取,请右键单击HandyAndy图标并选择Term Shell]

在外壳内,运行以下命令:

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

然后,安装SuperSU并安装SU二进制文件。这将替换我们刚刚创建的SU二进制文件。(可选)删除SuperSU并通过CWM安装Superuser。再次安装su二进制文件。现在,root有效!


1

我尝试了许多上述建议,包括SuperSU,但仍无济于事,但发现更简单的方法可以满足我的需求。就我而言,我只希望能够在命令提示符下运行sqlite。我只是用旧版本的Android(Lollipop)启动了一个模拟器,并立即获得了root访问权限。


-1

我发现默认情况下植根了默认的API 23 x86_64仿真器。


据我所知,仅仅是因为当您键入“ adb root”时有一个#号,并不意味着应用程序可以利用root特权。任何尝试在/ system中任何位置进行写入的尝试都会导致RO错误,甚至尝试将其重新安装为RW。
Fusseldieb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.