Android Root原理初探,androidroot初探
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”);