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

我有所有的 Android SDK 版本(从1.5到2.3.3) ,并且我尝试了很多方法来获得 Android 模拟器的根。我不使用任何 Android 设备,并在模拟器(AVD)上测试一切。

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

我还安装了 z4root应用程序,

但它需要很长的时间,没有完成根,并得到卡住。有人说,如果我们将系统降级到 RC30以下,这样我们就可以获得 root 访问权限。如果这是真的,那么该怎么做呢?我同时使用 Linux 和 Windows 操作系统。

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

383967 次浏览

下面是模拟器运行时必须运行的命令列表,我在 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 和 superuser: http://forum.xda-developers.com/showthread.php?t=682828。 每次启动模拟器时都需要运行这些命令。您可以编写一个脚本来启动模拟器并为其根目录。

我认为最简单的方法是为命令 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及更高版本上进行了测试。

对于5.1.1和6.0版本的 AVD,我在 windows 中使用了 next script:

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 中更新二进制文件,从临时文件夹中存储 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 中的映像被更新,则它将拥有旧的映像。

在这种情况下,您需要删除这个 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:

    模拟器 -5554根

重装系统:

adb -s emulator-5554 remount

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

另一个步骤保持不变——上传二进制文件,运行二进制文件作为守护进程,等等。

图片来自 AVD Android 7 x86 with root: AVD Android 7 x86 with root


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

我使用了上述解决方案中的一部分方法,但它们并没有完全奏效。在最新版本的安迪身上,这招对我很管用:

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

在 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 访问权限的虚拟设备,那么下面的代码应该可以完成这项工作:

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

如果你不知道,你可能会对这个 回答的另一个问题感兴趣,这个问题解释了如何创建一个有 root 访问权限的虚拟设备,使用 Google API (又名 Google Play 服务) ,但不使用 Google Play 应用程序。

如果你真的需要 Google Play 应用程序,你可能会对其他指导如何根植 Android 虚拟设备的答案感兴趣。

如何根 Android 模拟器(在 Android7.1.1/Nougat 上测试)

要求 :

说明

  1. 安装 SuperSu.apk
  • 首先安装 SuperSu 应用程序,只需要拖放(如果运行最新的模拟器版本或通过 adb 也就是 adb -e install supersu.apk的副载)

  • 安装之后,当您运行它时,它会显示一个屏幕,如下所示,指示“没有安装 SU 二进制文件。.这个错误只是确认设备还没有被植根。

enter image description here


  1. 使仿真器的系统分区可写
  • 正如它建议的那样,我们需要授予模拟器编写系统文件的权限。

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

如果您有一个以上的 AVD,您可以得到一个列表的 AVD 使用命令: emulator -list-avds

注意: 导航到安装 Android SDK 的 工具文件夹,然后通过单击 shift 和右键打开命令提示符。


  1. 在系统目录中推送 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 二进制文件的权限
  • 接下来,让我们稍微修改一下 su 二进制文件的权限。我们必须通过 adb 在模拟器设备中实现这一点:
adb -e shell
su root
cd /system/bin
chmod 06755 su

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


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

输入密码:

su --install

以及设置守护进程:

su --daemon&

重要! ! 注意间隔


  1. 将 SELinux 设置为 Permissive (即关闭 SELinux)
  • 最后通过这段代码关闭 selinux:

setenforce 0


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

注意: 如果您正在经历引导循环,不要更新二进制文件,只是使用它的原样。


差不多就是这样! !

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

enter image description here

为了让根目录持久化更新 su 二进制文件(使用 Normal 方法) ,然后从 temp 目录复制 system.img (Users\AppData\Local\Temp\Android Emulator文件通常被随机命名为 e.g 1359g.tmp,大号) ,并替换默认的 system.img

更新 :

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

# # 2018年8月4日最新情况

随着模拟器 27.3.x的出现,现在通过快照特性(如果复制 system.img方法不起作用)使得保存 root 变得更加容易:

理想情况下,这更像是在虚拟设备中保持配置完整,因此所有内容都保留了下来。

快照

您现在可以为给定的设备保存多个 AVD 快照 配置时,选择要加载的保存快照 通过加载快照启动虚拟设备是 更像是从睡眠状态中唤醒一个物理实体,而不是启动 它从断电状态。

这意味着启动模拟器的唯一要求是将 -writable-system参数添加到普通的 emulator -avd [avdname]命令中以启动模拟器。(仅使用 emulator -avd [avdname]运行模拟器不会启动根版本/副本,或者可能导致一些错误)

在 API 22级测试

关于引导循环问题,请参阅另一篇文章: Android 仿真器: 如何避免生根后的引导循环?及其更新。

备注

参考的大部分内容都是针对旧的 android 版本,因此我修改了不同的命令和路径。

鸣谢;

我尝试了上面的许多建议,包括 SuperSU,但是没有一个可以实现,但是我发现了一些更简单的方法,它们对我的目标很有用。在我的例子中,我只希望能够在命令提示符下运行 sqlite。我只是用旧版本的 Android (Lollipop)启动了一个模拟器,并立即获得了 root 访问权限。

我只是将 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 文件,但是我不会更新二进制文件

我发现默认的 API 23 x86 _ 64模拟器在默认情况下是有根的。

使用安卓图像 没有游戏服务,然后你就可以运行添加根和访问任何你想要的。

我知道这个问题很老套。但是我们可以通过遵循 https://github.com/shakalaca/MagiskOnEmulator在 Magisk 的帮助下在仿真器中获得根

基本上,它对 initrd.img (如果存在)和 ramdisk.img 进行了补丁,以便与 Magisk 一起工作。

  1. 应该使用虚拟设备 没有“游戏商店”。 注意: 如果在模拟设备中已经有一些数据库,您可以创建一个新的或编辑现有数据库的设置。

  2. 一旦 AVD 被创建 正在逃跑打开终端在任何地方 > 在 android 工作室或从开始菜单

  3. 运行 adb root

现在可以使用 adb shell打开设备外壳窗口。

如果您的物理设备与开发人员选项是连接的,您将收到类似“ adb.exe: 不止一个设备/模拟器”的消息 在这种情况下,您可以使用命令‘ adb-e shell’

其他对 adb shell 初学者有用的注意事项:

运行“ ls”查看所有文件。 改变目录。 一些字母的目录名 + TAB 自动完成的名称。 回去。

现在,我将告诉你最简单的方法来根你的模拟器在几个步骤使用1命令。

  1. 创建或配置模拟器。
  2. 通过运行应用程序检查模拟器是否正常工作。
  3. 打开 cmd 并给出 sdk 平台的路径-工具如下所示

C: 用户 XYZ > cd C: 用户 XYZ AppData 本地 Android Sdk 平台-工具

如果你不确定你的平台工具在哪里,那么去 android 工作室打开 SDK 管理器(点击 SDK 管理器的图标) ,你会得到你的 SDK 的路径,如下所示 = = > C: 用户 XYZ AppData 本地 Android Sdk,并在最后添加平台工具,如下所示

C: 用户 XYZ AppData 本地 Android Sdk 平台-工具

现在按照步骤3,即打开 cmd 并给出 sdk 平台的路径-工具如下所示

C: 用户 XYZ > cd C: 用户 XYZ AppData 本地 Android Sdk 平台-工具

步骤4: C: Users XYZ AppData Local Android Sdk Platform-tools > adb root

步骤5: C: Users XYZ AppData Local Android Sdk Platform-tools > adb shell

现在你会得到如下的成功信息:

C: Users XYZ AppData Local Android Sdk Platform-tools > adb root 用户 XYZ AppData 本地 Android Sdk 平台-工具 > adb root Adbd 已经作为 root 用户运行

第6步: XYZ 通用 # cd data/data//database/ Sqlite3 。表 。模式

希望能有帮助,对我很有效。