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.c文件
1、执行脚本文件:build/envsetup.sh
2、进入su目录,执行mm命令编译su.c
[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
相关文章推荐
- Android 关闭多个视图Intent.FLAG_ACTIVITY_CLEAR_TOP用法
- Android的文件存储
- Android OpenGL10 多纹理效果 <5>
- Android自定义TextView控件
- Android中通过浏览器直接打开应用
- Android源码解析——Toast
- IPC(跨进程)基础知识
- Android源码解析——Toast
- Android源码解析——Toast
- 在Android上使用官方Lambda支持 - Android N & Jack工具(兼容旧平台)
- Android登陆页面,获取验证码按钮的实现
- Jni编写清晰流程
- Android缓存的引用
- Android Studio开发遇到的问题(持续更新ing)
- Android 杂技
- android音乐播放器之在线播放功能的实现
- 本博客纯粹记录自己的java,Android学习过程
- Android LayoutInflater详解
- Android中的单元测试
- 使用klogctl接口离线保存android kernel log