Android 开发环境配置3:Root

What is root

root的原理

破解Android root权限的本质是:

在系统中加入一个任何用户都可能用于登陆的su命令。或者说替换掉系统中的su程序,因为系统中的默认su程序需要验证实际用户权限,只有root和shell用户才有权运行系统默认的su程序,其他用户运行都会返回错误。而破解后的su将不检查实际用户权限,这样普通的用户也将可以运行su程序,也可以通过su程序将自己的权限提升。

判断手机是否root

通过adb shell连接至手机以后,执行su命令,如果无法执行,则说明该手机无root权限。

1
2
3
4
$ adb shell
shell@hammerhead:/ $
shell@hammerhead:/ $ su
su command not found

How to root

本文中用到的操作系统为Linux(Debian);Android设备型号为Nexus 5(HAMMERHEAD),Android版本为4.4.4(Build Num KTU84P)

准备工作(Prerequisites)

  • 配置Android调试环境:安装adb和fastboot工具,开启USB调试模式(USB debugging),建立手机与电脑之间的USB调试连接。
  • Android设备的Bootloader已完成解锁(unlocked)。
  • 下载已经完成root的boot.img,例如,CF-Auto-Root-hammerhead-hammerhead-nexus5.img
  • 下载第三方TWRP Recovery镜像包,例如,openrecovery-twrp-2.8.7.1-hammerhead.img

方法1:flash rooted boot.img

进行root操作,最便捷方式的便是刷入已经root过的boot.img对原有boot区域进行擦写覆盖。
对于Nexus设备,可以在CF-Auto-Root Repository网站上下载对应设备型号的镜像文件,该镜像中包含了SuperSU程序。

flash操作前,先将设备切换至fastboot模式。

1
$ adb reboot bootloader

fastboot模式下,在电脑的命令终端中执行如下命令。

1
2
3
4
5
6
7
8
9
10
11
$ fastboot flash boot CF-Auto-Root-hammerhead-hammerhead-nexus5.img
sending 'boot' (9222 KB)...
OKAY [ 0.525s]
writing 'boot'...
OKAY [ 0.787s]
finished. total time: 1.313s

$ fastboot reboot
rebooting...

finished. total time: 0.511s

采用fastboot flash boot XXX_boot.img进行操作时,手机会将XXX_boot.img下载至设备并对boot区域进行擦写覆盖,从而使手机获得root权限。即使手机再次重启,root权限仍然存在。

再次通过adb shell连接至手机,可以看见,现在已经获取到了root权限。

1
2
$ adb shell
root@hammerhead:/ #

方法2、在Recovery环境下安装SuperSU

该种方法的实现思路在于,给手机安装Custom Recovery,然后在recovery模式下手工安装SuperSU

具体的操作方式在《详解Recovery》一文中进行了介绍。

方法3、采用TWRP Recovery的OpenRecoveryScript引擎执行命令

对于2.1及以上版本的TWRP Recovery中,可以使用OpenRecoveryScript引擎,在TWRP Recovery启动时执行命令。

1、传输root文件至Android设备

在Android设备未获得root权限之前,具有Write权限的文件夹并不多,通常可将要写入的文件传输至/data/local/tmp/路径下。

1
2
$ adb push UPDATE-SuperSU-v2.46.zip /data/local/tmp/UPDATE-SuperSU-v2.46.zip
$ adb push busybox-signed.zip /data/local/tmp/busybox-signed.zip

2、获取临时root权限

由于后续操作中要向/cache/recovery/目录写入文件,需要用到root权限。针对这种情况,可以采用已经root过的boot.img进行启动,临时获得root权限。

首先,将设备切换至fastboot模式

1
$ adb reboot bootloader

然后,采用已经root过的boot.img进行启动。

1
2
3
4
5
6
$ fastboot boot modified_boot_hammerhead_4.4.4_KTU84P.img
downloading 'boot.img'...
OKAY [ 0.463s]
booting...
OKAY [ 0.110s]
finished. total time: 0.573s

此处与方法1的区别在于,这里只是临时地采用已经root过的boot.img进行启动,但并没有对boot分区进行写入。当手机重启后,仍然是采用原有的kernel进行启动。

3、创建openrecoveryscript文件

1
$ touch openrecoveryscript

openrecoveryscript文件中,写入如下内容。其中,zip软件包的路径要求是存在于Android设备中的完整路径。

1
2
3
4
5
# openrecoveryscript
set tw_signed_zip_verify 0
install /data/local/tmp/perm-recovery-signed.zip
install /data/local/tmp/UPDATE-SuperSU-v2.46.zip
install /data/local/tmp/busybox-signed.zip

4、写入openrecoveryscript文件

此处就是需要临时用到root权限的地方。

1
2
$ adb push openrecoveryscript /cache/recovery/openrecoveryscript
2 KB/s (169 bytes in 0.057s)

如果没有root权限,写入文件时会提示Permission denied

1
2
$ adb push openrecoveryscript /cache/recovery/openrecoveryscript
failed to copy 'openrecoveryscript' to '/cache/recovery/openrecoveryscript': Permission denied

5、启动TWRP Recovery环境

启动TWRP Recovery时,会执行/cache/recovery/openrecoveryscript文件中的命令,即安装SuperSU等root软件。

如果手机之前并未安装TWRP Recovery,也可以直接采用TWRP Recovery的镜像包进行启动,同样可以完成/cache/recovery/openrecoveryscript文件中命令的执行。

1
fastboot boot openrecovery-twrp-2.8.7.1-hammerhead.img