您的位置:首页 > 移动开发 > Android开发

Android系统Root原理初探——学习笔记

2016-05-06 02:01 519 查看
从慕课网上学习《Android系统Root原理初探》时记录的笔记。只进行了学习,还未实践过。

[b]1. 了解Root[/b]

普通用户登录,命令行以$开始。从普通用户提升到root用户,使用su命令。/etc/profile是系统的环境变量配置文件,需要root用户才有权限操作。

操作系统使用的是Linux内核+文件系统(ext3/4),就是Linux系统,如Android系统。

Linux驱动:按照Linux驱动接口(Linux安装和运行规范,属于二进制规范),实现与硬件的通信。通过配置菜单可以安装驱动,和卸载几乎所有的驱动。

[b]2. 为什么需要Root权限[/b]

/data/app:存放的是用户自己安装的软件,用户可编辑

/system/app:存放的是系统的软件,或预装软件,需要root才能操作本目录

修改/system/app内容的方法:

1、获取root权限(简单,推荐)

2、通过Android ROM方式

3、通过Recovery升级包

用户Root权限的好处:

·调试Linux驱动。可直接在手机上调试驱动,若调试失败无法启动系统,重刷ROM即可

·修改Android设备的启动画面

·…

[b]3. 提取Root权限的步骤[/b]

Root步骤:

1、刷Recovery

·在bootloader模式下复制整个的文件系统

·在recovery模式下,将文件复制到Android设备指定的目录

如果复制整个文件系统,选第1种,如果复制一部分,选第2种。

2、改造su命令

Android系统自带的su命令只允许root和shell用户调用。shell是使用数据线连接后,通过adb shell命令进入设备终端所拥有的权限。每个adb是一个普通的用户,无法执行su命令,必须通过源代码改造su,才能执行su命令

3、制作Recovery刷机文件(刷机包)

zip格式的压缩包:待复制的文件 + 脚本文件(Edify语言编写,用于对文件进行各种操作)

4、执行su命令提取root权限

改造后的su命令,可被终端和APP调用,由$变成#

5、制作拥有root权限的ROM

让设备进入即拥有root权限,无需再使用su命令

[b]4. 刷一个很酷的Recovery[/b]

刷机

Clockwork Recovery

使用最广的刷机包,且支持触摸操作

http://www.clockworkmod.com/rommanager

进入目录:cd [目录]

查看目录文件列表:ls

查看设备连接数量:adb devices

进入bootloader模式(或快捷键:电源键+音量下):adb reboot bootloader

fastboot命令(只能在bootloader下使用)

刷机:fastboot flash recovery recovery-clockwork-touch-6.0.4.3-grouper.img

重启设备到正常模式下:fastboot reboot

危险命令:

fastboot flash bootloader bootloader.img

如果bootloader.img正常且匹配设备,此命令安全,否则成砖

fastboot erase bootloader

擦除bootloader,立马成砖

[b]5. Edify语言简介[/b]

1、ui_print

原型:ui_print(msg1,…,msgN);

功能:在Recovery界面输出字符串,其中msg1,。。。,msgN表示

N个字符串参数该函数至少需要指定一个参数,如果指定多个参数,会将这些参数值连起来输出

用法:ui_print(“hello world”);

2、run_program

原型:run_program(prog,msg1,…,msgN);

功能:该函数用于执行程序,其中prog参数表示要执行的程序文件(要写完整路径),arg1,。。,argN

表示要执行程序的参数,prog参数是必须的。

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

3、delete

原型:delet(file1,file2,….,fileN);

功能:该函数用于删除一个或者多个文件,其中file1,file2.。。表示要删除的文件路径,至少要指定一个文件

用法:delete(“/system/xbin/su”);

4、package_extract_dir

原型:package_extract_dir(package_path.destination_path);

功能:用于提取刷机包中package_path指定目录的所有文件到destination_path指定目录,其中package_path

参数表示刷机包中的目录,destination_path参数表示目标目录

用法:package_extract_dir(“system”,”/system”);

5、set_perm

原型:set_perm(uid,gid,mode,file1,file2,…,fileN);

功能:用于设置一个或者多个文件的权限,其中uid参数表示用户ID,gid表示用户组ID,如果想让文件的用户和

用户组都是root,uid和gid都需要设置为0. mode参数表示设置的权限,与chmod命令类似

用法:set_perm(0,0,0777,”/system/xbin.su”);

6、mount

原型:mount(fs_type,partition_type,location,mount_point);

功能:挂载分区

用法:mount(“etc4”,”EMMC”,”/dev/block/platform/s3c-sdhci.0/by-name/system”,”/system”);

7、umount

原型:umount(mount_point);

功能:解除文件系统的挂载,其中umount_point参数,表示文件系统

用法:umount(“/system”);

[b]6. 编写updater-script脚本文件[/b]



[b]7. 制作Recovery升级包[/b]

包含两个目录:

META-INF/com/google/android:存放updater-script脚本文件

system/xbin:存放su文件

但,这些相关文件从哪里获取???(从现成的Recovery升级包中拷贝过来)

把两个文件压缩成zip文件

[b]8. 复制su命令到/system/xbin目录[/b]

把Recovery刷机包(upadate.zip)复制到Android设备上

1、进入Recovery模式。两种进入方法

·adb reboot recovery

·在bootloader模式下直接进入。可通过音量上下键切换进入正常系统,还是Recovery模式

2、进入Recovery模式后,两种复制方法

·install zip from sdcard

把Recovery升级包先复制到sdcard目录下,选择此方法

·install zip from sideload

不先复制到sdcard中,直接从电脑上拷贝过去。进入后使用命令:adb sideload update.zip

?

使用第2种方法,电脑上的update.zip应放在什么位置?

[b]9. 利用su命令获取Root权限[/b]

提取Root权限,两种方法

1、在Android设备终端中执行su命令

进入终端:adb shell

进入Root权限:su

进入/system/app目录(本目录存放所有系统应用程序的apk文件,默认为只读):cd /system/app

查看列表:ls

创建目录:mkdir test

查看物理路径:mount | grep system

/dev/block/platform/sdhci-tegra.3/by-name/APP —— 物理路径

/system —— 挂载点

ext4 —— 文件系统

ro —— read only,只读权限

修改为可读写权限:mount -o rw,remount /dev/block/platform/sdhci-tegra.3/by-name/APP /system

修改为只读权限:mount -o ro,remount /dev/block/platform/sdhci-tegra.3/by-name/APP /system

为了安全,在操作完后,最好关闭权限,修改成只读

2、在App中调用su命令

try {

Process process = Runtime.getRuntime().exec(“su”);

OutputStream os = process.getOutputStream();

os.write(“ls /system/app”.getBytes());



os.flush();

os.close();

} catch (IOException e) {

e.printStackTrace();

}

[b]10. 修改Android设置的启动动画[/b]

方法:

替换/system/media目录下的bootanimation.zip文件即可(需要Root权限)

bootanimation.zip目录结构:

desc.txt

part0

part1



desc.txt文件结构:

[width] [height] [frame-rate]

p [loop] [pause] [folder]

p [loop] [pause] [folder]



p [loop] [pause] [folder]



[b]11. su命令原理分析[/b]

位置:【Android源代码根目录】/system/extras/su/su.c

主要分析main函数:

// 代表当前调用su命令的必须是root,或shell(在安卓设备中执行su命令的终端程序用户)
// 但是我们执行su命令,就是为了获取root,所以肯定不是root用户。而shell用户只有在安卓设备终端执行su命令才可以
// 对于app来说,每一个app都对应着一个用户,这些用户既不是root,也不是shell。
// 所以要使app通过su命令获取root权限,需去掉此条件
49: if (myuid != AID_ROOT && myuid != AID_SHELL){
return 1;
}

// uid-用户,gid-用户组
// 这里的0代表root用户和root用户组
// 说明如果su命令不带参数,就会切换到root用户
55: if(argc < 2){
56: uid = gid = 0;

// 获取指定用户(argv[1])的数据,passwd结构体
58: pw = getpwnam(argv[1]);
...
// 如果未成功获取指定用户数据,则认为第一个参数是用户id,不是用户名
if(pw == 0)
uid = gid = atoi(argv[1]); // atoi()转换成整数

/*
如:获取root的数据
#include <pwd.h>
#include <sys/types.h>
main(){
struct passwd *user;
user = getpwnam("root");
// 输出用户名
printf("name:%s\n", user->pw_name);
// 输出用户id
printf("uid:%id\n", user->pw_uid);
// 输出用户的登录目录,也就是进入终端后默认的目录
printf("home:%s\n", user->pw_dir);
}

su命令的使用:
su
su root
su 100
su user1
*/

// 将当前进程替换为一个新进程,即进入一个新的shell。
/* 如在终端中执行如下命令:
abd shell ——进shell
su ——进root,进入一个新的shell
exit ——退出root的shell,回到普通用户的shell
*/
execlp("/system/bin/sh", "sh", NULL);


编译su.c文件

1、执行脚本文件:build/envsetup.sh

2、进入su目录,执行mm命令编译su.c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: