android系統(tǒng)的分區(qū)結(jié)構(gòu)
轉(zhuǎn)載
ANTIBili_MC 關(guān)注
(一)Android的主要分區(qū)
Modem分區(qū)bootloader分區(qū)boot分區(qū)recoverty分區(qū)system分區(qū)data分區(qū)1. modem分區(qū)
? ? a) 實現(xiàn)手機必需的通信功能,大家通常所的刷RADIO就是刷寫modem分區(qū),在所有適配的ROM中這部分是不動,否則會造成通話不穩(wěn)定;
2. bootloader分區(qū)
? ? a) bootloader的primarybootloader部分,主要執(zhí)行硬件檢測,確保硬件能正常工作,然后將secondarystagebootloader拷貝到內(nèi)存(RAM)開始執(zhí)行。
? ? b) Secondarystagebootloader會進行一些硬件初始化工作,獲取內(nèi)存大小信息等,然后根據(jù)用戶的按鍵進入到某種啟動模式。比如說大家所熟知的通過電源鍵和其它一些按鍵的組合,可以進入到recovery,fastboot或者選擇啟動模式的啟動界面等。
? fastboot模式:fastboot是android定義的一種簡單的刷機協(xié)議,用戶可以通過fastboot命令行工具來進行刷機。比如說fastboot flash boot boot.img這個命令就是把boot.img的內(nèi)容刷寫到boot分區(qū)中。一般的手機廠商不直接提供fastboot模式刷機,總是會提供自己專有的刷機工具和刷機方法。比如說三星的Odin,摩托的RSD,華為的粉屏等等。但是其本質(zhì)實際上是相同的,都是將軟件直接flash到各個分區(qū)中。這種通常稱為線刷,是比較原始的方法。當手機處于開不了機的情況下,可以使用此廠家提供的工具進行刷入;
3. boot分區(qū)
當我們只是按下電源鍵開機時,會進入正常啟動模式。Secondarystagebootloader會從boot分區(qū)開始啟動。Boot分區(qū)的格式是固定的,首先是一個頭部,然后是Linux內(nèi)核,最后是用作根文件系統(tǒng)的ramdisk。當Linux內(nèi)核啟動完畢后,就開始執(zhí)行根文件系統(tǒng)中的init程序,init程序會讀取啟動腳本文件(init.rc和init.xxxx.rc)。
android內(nèi)核掛載/nfsroot/androidfs之后,根據(jù)init.rc,init.goldfish.rc來初始化并裝載系統(tǒng)庫、程序等直到開機完成。init.rc腳本包括了文件系統(tǒng)初始化、裝載的許多過程。init.rc的工作主要是:
1)設(shè)置一些環(huán)境變量
2)創(chuàng)建system、sdcard、data、cache等目錄
3)把一些文件系統(tǒng)mount到一些目錄去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)設(shè)置一些文件的用戶群組、權(quán)限
5)設(shè)置一些線程參數(shù)
6)設(shè)置TCP緩存大小
根文件系統(tǒng)中有一個重要的配置文件,叫default.prop,該文件的內(nèi)容一般為:
#
#ADDITIONAL_DEFAULT_PROPERTIES
#
ro.secure=1
ro.allow.mock.location=1
ro.debuggable=0
persist.service.adb.enable=1。
文件中的每一行對某個屬性賦值,大家需要注意的兩個屬性:ro.secure和ro.debuggable。如果ro.secure=0允許我們運行adbroot命令。在下一篇我們會詳細介紹adb,這是我們做ROM移植的利器。通常大家說得內(nèi)核ROOT指的就是ro.secure=0。ROOT權(quán)限只是的手機上有一個名為授權(quán)管理的程序(Superuser.apk)可以授予程序root用戶的權(quán)限。ro.deguggable=1允許調(diào)試系統(tǒng)APP。
init程序讀取啟動腳本,執(zhí)行腳本中指定的動作和命令,腳本中的一部分是運行system分區(qū)的程序
4. recovery分區(qū)
? ? recovery模式:recovery是android定義的一個標準刷機協(xié)議。當進入recovery模式時,secondarystagebootloader從recovery分區(qū)開始啟動,recovery分區(qū)實際上是一個簡單的Linux系統(tǒng),當內(nèi)核啟動完畢后,開始執(zhí)行第一個程序init(init程序是Linux系統(tǒng)所有程序的老祖宗)。init會啟動一個叫做recovery的程序(recovery模式的名稱也由此而來)。通過recovery程序,用戶可以執(zhí)行清除數(shù)據(jù),安裝刷機包等操作。一般的手機廠商都提供一個簡單的recovery刷機,多只能進行upate的操作。不能進行卡刷;如果想要自已卡刷,則需要事先刷入第三方的Recovery,然后選擇刷機包。
5.system分區(qū)
我們把這張android的圖貼在這里,除下面的linux Kernel部分位于boot分區(qū)外,在其上的Library、runtime、framework、core application都是處于system分區(qū)
0、/system/priv-app
特權(quán)App,比system_app權(quán)限還要高,其不僅System_app標識是true,同時還置了Priv-app標識。
1、/system/app
核心應(yīng)用程序檔(*.apk),都是放在這。像是Phone、Alarm Clock, Browser, Contacts 等等。
2、/system/framework
這里放 Android 系統(tǒng)的核心程式庫,就是上圖中application framework部分的庫。像是core.jar, framework-res.apk, framework.jar等等。
3、system/lib
上圖中Library部分,存放的是所有動態(tài)鏈接庫(.so文件),這些SO是JNI層,Dalvik虛擬機,本地庫,HAL層所需要的,因為系統(tǒng)應(yīng)用/system/app下的apk是不會解壓的SO到程序的目錄下,所以其相應(yīng)用的SO,都應(yīng)放在/system/lib 下面。當一個系統(tǒng)apk的SO加載時,會從此目錄下尋找對應(yīng)用的SO文件;
4、/system/media/audio/(notification, alarms, ringtones, ui)
這里放系統(tǒng)的聲音檔,像是鬧鈴聲,來電鈴聲等等。這些聲音檔,多是 ogg 格式。
5、/system/bin
存放的是一些可執(zhí)行文件,基本上是由C/C++編寫的。其中有一個重要的命令叫app_process。一般大家稱之為Zygote。(Zygote是卵的意思,所有的Android進程都是由它生出來的)。Zygote首先會加載dalvik虛擬機,然后產(chǎn)生一個叫做system_server的進程。system_server顧名思義被稱作Android的系統(tǒng)服務(wù)程序,它主要管理整個android系統(tǒng)。system_server啟動完成后開始尋找一個叫做啟動器的程序,找到之后由zygote開始啟動執(zhí)行啟動器,這就是我們常見到的桌面程序。
6、system/xbin
存放的是一些擴展的可執(zhí)行文件,既該目錄可以為空。大家常用的busybox就放在該目錄下。Busybox所建立的各種符號鏈接命令都是放在該目錄。
7、system/build.prop
build.prop和上節(jié)說得根文件系統(tǒng)中的default.prop文件格式一樣,都稱為屬性配置文件。它們都定義了一些屬性值,代碼可以讀取或者修改這些屬性值。屬性值有一些命名規(guī)范:
ro開頭的表示只讀屬性,即這些屬性的值代碼是無法修改的。
persist開頭的表示這些屬性值會保存在文件中,這樣重新啟動之后這些值還保留。
其它的屬性一般以所屬的類別開頭,這些屬性是可讀可寫的,但是對它們的修改重啟之后不會保留。
8、system/etc
目錄存放一些配置文件,和屬性配置文件不一樣,這下面的配置文件可能稍微沒那么的有規(guī)律。一般來說,一些腳本程序,還有大家所熟悉GPS配置文件(gps.conf)和APN配置文件(apns-conf.xml)放在這個目錄。像HTC將相機特效所使用的一些文件也放在這個目錄下。
6. Data分區(qū)
? ? ? 當我們開機進入桌面程序后,一般來說我們都會下載安裝一些APP,這些APP都安裝在data/app目錄下。所有的Android程序生成的數(shù)據(jù)基本上都保存在data/data目錄下。wipedata實質(zhì)上就是格式化data分區(qū),這樣我們安裝的所有APP和程序數(shù)據(jù)就都丟失了。
1、/data/app
放的是使用者自己安裝的應(yīng)用程式執(zhí)行檔(*.apk)。
2、/data/data/<app-package-name>
當你在程式中用Context.openFileOutput() 所建立的檔案,都放在這個目錄下的files 子目錄內(nèi)。而用Context.getSharedPreferences() 所建立的preferences 檔(*.xml) ,則是放在shared_pref 這個子目錄中。
3、/data/anr/traces.txt
當你的應(yīng)用程式發(fā)生ANR (Application is Not Responding) 錯誤時,Android 會自動將問題點的code stack list 寫在這個檔案內(nèi),你直接用cat 命令就可以看他的內(nèi)容。
4、/data/system/dropbox/***.txt
? 主要是系統(tǒng)內(nèi)apk發(fā)生crash時寫的日志文件,主要有system_app_crash、data_app_crash等日志。
5、/data/location/gps
是給GPS location provider 用的。其中的 properties 檔案的內(nèi)容如下:
6、/data/system/location/location.gps
一般文字檔。主要是記錄最后的經(jīng)緯度座標。 LocationManager.getLastKnownLocation() 就在來這抓值的。
7、/data/property/persist.sys.timezone
這個檔案也是個一般文字檔。主要是記錄目前系統(tǒng)所使用的時區(qū)。在我的模擬器上,他記錄著Asia/Taipei 這個字串。
7、映像文件打包方式
system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip壓縮的,可以通過file命令驗證:
file ramdisk.img
輸出:ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar 18 17:16:10 2009
Android源碼編譯后除了生成system.img,userdata.img之外還生成system和 userdata文件夾,因此不需要解壓它們。Android源碼編譯后還生成root文件夾,其實root下的文件與 ramdisk.img 里的文件是一樣的,不過這里還是介紹怎樣把 ramdisk.img解壓出來:
將ramdisk.img復(fù)制一份到任何其他目錄下,將其名稱改為ramdisk.img.gz,并使用命令
gunzip ramdisk.img.gz
然后新建一個文件夾,叫ramdisk吧,進入,輸入命令
cpio -i -F ../ramdisk.img
這下,你就能看見并操作ramdisk里面的內(nèi)容了。
然后把Android源碼編譯后生成的system和 userdata里的文件復(fù)制到 ramdisk/system和 ramdisk/userdata下。這樣就得到一個文件系統(tǒng)了。
1. oem分區(qū)是為全球定制功能而增設(shè)的一個分區(qū),里面增加了對應(yīng)不同國家的各種配置參數(shù),如某些功能開關(guān),有些區(qū)域要求打開,其它的則要求關(guān)閉,此時就需要用到oem.img,否則就需要出兩個版本;
2. systeminfo是專門為了添加system分區(qū)檢查而設(shè)立的分區(qū),system分區(qū)檢查是指檢查system分區(qū)的資源是否被更改,比如apk被刪減或者某些權(quán)限被更改,目的是為了防止system被更改導(dǎo)致手機被監(jiān)控。而systeminfo分區(qū)存放一個check.bin文件,此文件里面存儲所有system文件和其對應(yīng)的sha1值。
3. persist分區(qū)是用于保存FRP(factory reset protcect)功能用到帳號、密碼等受保護的信息,避免在恢復(fù)出廠設(shè)置后被清空。 什么是Persist分區(qū):
Persist分區(qū)是系統(tǒng)的一個ext4分區(qū),由于我們的線刷包都不包含這個分區(qū),所以你需要自己動手修復(fù),這個分區(qū)內(nèi)包含DRM相關(guān)文件、傳感器注冊表、你的wifi、藍牙、mac地址都在這里了。
一般解鎖手機都要強制禁止訪問PERSIST分區(qū)中的賬號信息,因此需要配合修改版的系統(tǒng),讓系統(tǒng)不讀取賬號信息也能工作(原生安卓表示你們都是渣渣)