Android 开发环境配置3:Root
What is root
root的原理
破解Android root权限的本质是:
在系统中加入一个任何用户都可能用于登陆的su命令。或者说替换掉系统中的su程序,因为系统中的默认su程序需要验证实际用户权限,只有root和shell用户才有权运行系统默认的su程序,其他用户运行都会返回错误。而破解后的su将不检查实际用户权限,这样普通的用户也将可以运行su程序,也可以通过su程序将自己的权限提升。
判断手机是否root
通过adb shell连接至手机以后,执行su命令,如果无法执行,则说明该手机无root权限。
| |
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模式。
| |
在fastboot模式下,在电脑的命令终端中执行如下命令。
| |
采用fastboot flash boot XXX_boot.img进行操作时,手机会将XXX_boot.img下载至设备并对boot区域进行擦写覆盖,从而使手机获得root权限。即使手机再次重启,root权限仍然存在。
再次通过adb shell连接至手机,可以看见,现在已经获取到了root权限。
| |
方法2、在Recovery环境下安装SuperSU
该种方法的实现思路在于,给手机安装Custom Recovery,然后在recovery模式下手工安装SuperSU。
具体的操作方式在《[详解Recovery]({% post_url 2015-07-04-Android开发环境配置2:详解Recovery %})》一文中进行了介绍。
方法3、采用TWRP Recovery的OpenRecoveryScript引擎执行命令
对于2.1及以上版本的TWRP Recovery中,可以使用OpenRecoveryScript引擎,在TWRP Recovery启动时执行命令。
1、传输root文件至Android设备
在Android设备未获得root权限之前,具有Write权限的文件夹并不多,通常可将要写入的文件传输至/data/local/tmp/路径下。
| |
2、获取临时root权限
由于后续操作中要向/cache/recovery/目录写入文件,需要用到root权限。针对这种情况,可以采用已经root过的boot.img进行启动,临时获得root权限。
首先,将设备切换至fastboot模式
| |
然后,采用已经root过的boot.img进行启动。
| |
此处与方法1的区别在于,这里只是临时地采用已经root过的boot.img进行启动,但并没有对boot分区进行写入。当手机重启后,仍然是采用原有的kernel进行启动。
3、创建openrecoveryscript文件
| |
在openrecoveryscript文件中,写入如下内容。其中,zip软件包的路径要求是存在于Android设备中的完整路径。
| |
4、写入openrecoveryscript文件
此处就是需要临时用到root权限的地方。
| |
如果没有root权限,写入文件时会提示Permission denied。
| |
5、启动TWRP Recovery环境
启动TWRP Recovery时,会执行/cache/recovery/openrecoveryscript文件中的命令,即安装SuperSU等root软件。
如果手机之前并未安装TWRP Recovery,也可以直接采用TWRP Recovery的镜像包进行启动,同样可以完成/cache/recovery/openrecoveryscript文件中命令的执行。
| |