«

Android Root原理初探

时间:2024-3-2 18:43     作者:韩俊     分类: Android


Root

Linux:Root == Windows:Adminstrator

Android是Linux系统吗?

操作系统 = 系统内核 + 文件系统
Linux发行版:Linux内核 + 文件系统(ext3/4)
Android:Linux内核 + 文件系统(ext3/4)


Android 没有本地窗口系统

而Linux是可以脱离X窗口的。

Android 没有glibc library
Android并不包括一整套标准的Linux应用程序

而Linux也是可以脱离这两点的。

Android内置了专有的驱动程序

然并卵。Linux的内核也分主次,驱动程序也不是不能脱离的,只是去掉后无法识别对应的设备,并不影响Linux的内核的装载和运行。而且在Linux Kernel Configuration里可以自由配置需要卸载的项目。不能因为增加了驱动就认为不是Linux。并不是决定操作系统性质的关键。判断操作系统种类的并不是其上层建筑,而是深层的系统内核和文件结构。
Linux内核中与驱动相关且比较核心的是驱动接口(Linux驱动运行和安装规范),是一套二进制规范。
综上,Android实质上是Linux。

那么,Root对于Android意味着什么?

用su命令切换到root用户

Android为什么要Root?

删除非官方或定制系统预装的垃圾应用

拥有root权限后直接复制
根据Android Rom复制
通过Recovery升级包方式复制

控制开机加载项

拥有更多权限

调试Linux驱动

修改启动画面

提取Root权限的步骤

1.刷一个合适的Recovery

方法一:在bootloader模式下复制整个文件系统
方法二:在Recovery模式将文件复制到Android设备的指定目录

刷入Clockwork Recovery

通过adb reboot bootloader命令或者关机下按组合按键进入bootloader模式。

fastboot:

危险的命令:

fastboot flash bootloader bootloader.img
// 如果bootloader.img错误,则需要更换主板

自毁命令:

fastboot erase bootloader
// 擦除

刷Recovery:

fastboot flash recovery recovery.img

重启设备

fastboot reboot

2.改造su命令的源代码

Android自带的su命令只允许root和shell用户(adb shell)调用

3.制作Recovery刷机文件(*.zip)

主要由待复制的文件和Edify语言(用于对文件和目录进行操作)编写的脚本文件组成
编写Recovery升级包中的updater-script脚本文件,将su命令复制到/system/xbin目录中。

4.执行su命令提取Root权限

改造后的su命令,可以被终端和App调用。

5.让ROM本身拥有Root权限(非必需)

不然进入终端执行su命令后才拥有Root权限。

Edify

Android内嵌脚本语言,用于编写updater-script脚本文件。
updater-script是Recovery Rom和升级包的核心。完全由函数组成。

ui_print(msg_1,…,msg_N);

用于在Recovery界面输出字符串,至少需要一个参数。指定多个参数,会将参数值连起来输出。

run_program(prog, arg1,…,argN);

该函数用于执行程序,prog参数是必需的,表示要执行程序文件的完整路径。其他参数可选。如:

run_program(“/sbin/busybox”,”mount”,”/system”);

delete(file1,…,fileN);

删除一个或多个文件,参数为文件的路径。如:

delete(“/system/xbin/su”);

package_extract_dir(package_path, destination_path);

用于提取刷机包指定目录package_path的所有文件到目标目录destination_path。

set_perm(uid, gid, mode, file1,…fileN);

设置一个或多个文件的权限。
uid是用户id。gid是用户组id。
如果想让文件的用户和用户组都是Root,需要将uid和gid设为0。

mount(fs_type, partition_type, location, mount_point);

挂载分区。如:

mount(“ext4”, “EMMC”, “/dev/block/paltform/s3c-sdhci.0/by-name/system”, “/system”);

unmount(mount_point);

卸载分区。如:

unmount(“/system”);

标签: android

热门推荐