当前我正在开发一个用于 专用设备(corporate-owned single-use,COSU) 的app,需要使用到root权限。为了方便调试,需要将 Android Studio 自带的虚拟机进行 「root」

我一开始以为,只要能执行通过 adb 程序执行, adb root 的设备,就是一台已经 root 的设备。 adb_root

但这并不意味着我们编写的app程序就能取得root权限,所以我们需要执行一些额外的操作让我们的app也可能取得部分的root权限。

# 0.目录

我们需要做的大概就是:

  1. 创建一个合适的安卓虚拟机
  2. 以合适的方式启动安卓虚拟机
  3. 安装一个root权限管理app
  4. 替换 su 程序
  5. 关闭 SELinux 机制
  6. enjoy it

# 1. 创建虚拟机

首先,并不是所有的安卓虚拟机都适合用来取得 root 权限。

在 Android Studio 中创建虚拟机时,需要选择一个镜像来进行虚拟机创建。下图为选择虚拟机镜像的界面。 选择虚拟机 我们要留意一下,所选的镜像在target一栏一定得是没有带诸如 (Google APIs)或(Google Play) 后缀的。这些携带了特殊后缀的镜像创建出来的虚拟机是无法进行root的,参见官方文档

所以你可以创建一个虚拟机或者选择一个合适的虚拟机来执行后续的操作。

同时,我们还要记住你所选的镜像的 ABI (架构)这一列的取值。

比如我最终选的是: 虚拟机最终选择

  • ABI 这一列是 x86
  • 系统是 Android 7.0

# 2. 通过命令行的方式启动安卓虚拟机

当我们通过 Android Studio 的UI方式启动虚拟机时,/system分区是没办法执行写入操作的。所以只能够通过命令行的方式来启动虚拟机,在启动虚拟机时携带 -writable-system 参数。

emulator -avd <虚拟机名称> -writable-system

这里的 <虚拟机名称> 就是我们在创建虚拟机时所填写的虚拟机名称,可以自行到Android Studio的虚拟机管理器查看。 虚拟机管理器 例如我这里是 Pixel_3a_API_24 那么就是执行:

emulator -avd Pixel_3a_API_24 -writable-system

如果你是 mac 操作系统,那么应该使用这样的指令:

~/Library/Android/sdk/emulator/emulator -avd Pixel_3a_API_24 -writable-system

# 3.安装一个root权限管理app

我这里选择的是最经典的 supersu

写这篇文章时,supersu 的版本在 V2.82

安装app的话,嗯,就要么就直接在虚拟机里面下载然后安装,要么就通过 adb 的方式安装咯?

adb -e install supersu.apk

# 4. 替换 su 程序

还是在第三步时下载supersu的网址 里下载底下的 SuperSu Zip

解压这个 Zip 文件我们会看到里面的内容如下图所示: SuperSu Zip

好像这里面有很多以架构为名称的文件夹。对,没错,在我的例子中,因为我的虚拟机是 x86 架构的,那么,也就只有这个文件夹对我来说是有用的。

# 4.1. 接下来使用 adb 命令连接到我们的虚拟机上:

adb root

如果您的电脑没有adb指令,那么你可能需要安装一个。

# 4.2. 挂载 /system 分区为可读写:

adb remount

# 4.3. 找到su程序原本处于哪:

adb shell which su

例如我这里会返回: /system/xbin/su,这个路径十分重要,我们就是要替换掉这个程序。

# 4.4. 替换su程序

adb -e push x86/su.pie /system/xbin/su

这段指令里面涉及了两个地址:

  • 前者是我们刚刚下载的那个 Zip 对应的文件夹里的 su.pie 文件的路径
  • 后者是刚刚说的十分重要的路径

# 4.5. 对su增加运行权限

逐一运行以下代码:

adb -e shell
su root
cd /system/xbin/su
chmod 0755 su

注意这些代码当中,还是一样有一个路径,别忘了这个路径应该和你的现实情况对应哦。

# 4.6. 创建一个守护程序

逐一执行以下代码:

su --install
su --daemon&

# 5. 关闭 SELinux 机制

依旧在 adb shell 的环境中,执行以下代码:

setenforce 0

# 6. enjoy it

现在打开在模拟器中的 supersu 程序,如果弹出以下界面,一定要点 cancel ,不然!可能会导致开不了机。

supersu

# 参考文献