android系統(tǒng)的分區(qū)結(jié)構(gòu)

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)不讀取賬號信息也能工作(原生安卓表示你們都是渣渣)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1:InputChannel提供函數(shù)創(chuàng)建底層的Pipe對象 2: 1)客戶端需要新建窗口 2)new ViewRo...
    自由人是工程師閱讀 5,701評論 0 18
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,129評論 0 3
  • Android 通常有以下分區(qū): System分區(qū): 就是我們刷ROM的分區(qū) Data分區(qū): 分區(qū)就是我們裝A...
    Ed_Lannister閱讀 2,319評論 0 0
  • 冥冥之中,似乎總有一股力量,驅(qū)使我們?nèi)ふ遥?仿佛,必須找到,生命才可以開始安寧,才開始感覺,完整。 或許,上天一...
    keeleybj閱讀 442評論 0 0
  • 【導(dǎo)讀】紅心獼猴桃是一種食用與藥用為一體的高級營養(yǎng)保健水果哦,想要健康,想要美膚的親們可以多吃點。根據(jù)數(shù)據(jù)顯示,每...
    民間味覺閱讀 941評論 0 0

友情鏈接更多精彩內(nèi)容