Android系統的分區及img文件、移植燒寫過程

一、引言
本章介紹Android的幾個分區,已經編譯後生成的.img鏡像文件,對於大家移植整個Android有一定的幫助。本人也首次接觸Android,有不正確的地方,歡迎指正!

二、Android的主要分區介紹
1、主要分區列表
Modem分區
bootloader分區
boot分區
recoverty分區
system分區
data分區
cache分區
misc分區
2、分區介紹
modem分區
實現手機必需的通信功能,大家通常所的刷RADIO就是刷寫modem分區,在所有適配的ROM中這部分是不動,否則會造成通話不穩定;

bootloader分區
a) bootloader的primary bootloader部分,主要執行硬件檢測,確保硬件能正常工作,然後將second bootloader拷貝到內存(RAM)開始執行。

b) Second bootloader會進行一些硬件初始化工作,獲取內存大小信息等,然後根據用戶的按鍵進入到某種啓動模式。比如說大家所熟知的通過電源鍵和其它一些按鍵的組合,可以進入到recovery,fastboot或者選擇啓動模式的啓動界面等。

fastboot模式:fastboot是android定義的一種簡單的刷機協議,用戶可以通過fastboot命令行工具來進行刷機。比如說fastboot flash boot boot.img這個命令就是把boot.img的內容刷寫到boot分區中。一般的手機廠商不直接提供fastboot模式刷機,總是會提供自己專有的刷機工具和刷機方法。比如說三星的Odin,摩托的RSD,華爲的粉屏等等。但是其本質實際上是相同的,都是將軟件直接flash到各個分區中。這種通常稱爲線刷,是比較原始的方法。當手機處於開不了機的情況下,可以使用此廠家提供的工具進行刷入;

boot分區
當我們只是按下電源鍵開機時,會進入正常啓動模式。Secondarystagebootloader會從boot分區開始啓動。Boot分區的格式是固定的,首先是一個頭部,然後是Linux內核,最後是用作根文件系統的ramdisk。當Linux內核啓動完畢後,就開始執行根文件系統中的init程序,init程序會讀取啓動腳本文件(init.rc和init.xxxx.rc),執行腳本中指定的動作和命令,腳本中的一部分是運行system分區的程序

recoverty分區
recovery模式:recovery是android定義的一個標準刷機協議。當進入recovery模式時,second bootloader從recovery分區開始啓動,recovery分區實際上是一個簡單的Linux系統,當內核啓動完畢後,開始執行第一個程序init(init程序是Linux系統所有程序的老祖宗)。init會啓動一個叫做recovery的程序(recovery模式的名稱也由此而來)。通過recovery程序,用戶可以執行清除數據,安裝刷機包等操作。一般的手機廠商都提供一個簡單的recovery刷機,多隻能進行upate的操作。不能進行卡刷;如果想要自已卡刷,則需要事先刷入第三方的Recovery,然後選擇刷機包。

system分區
除linux Kernel部分位於boot分區外,在其上的Library、runtime、framework、core application都是處於system分區
0、/system/priv-app

特權App,比system_app權限還要高,其不僅System_app標識是true,同時還置了Priv-app標識。
1、/system/app
核心應用程序檔(*.apk: Android應用程序包),都是放在這。像是Phone、Alarm Clock, Browser, Contacts 等等。

2、/system/framework
這裏放 Android 系統的核心程序庫,就是上圖中application framework部分的庫。像是core.jar, framework-res.apk, framework.jar等等。

3、system/lib
存放Library部分的庫,存放的是所有動態鏈接庫(.so文件),這些.SO是JNI層,Dalvik虛擬機,本地庫,HAL層所需要的,因爲系統應用/system/app下的apk是不會解壓的SO到程序的目錄下,所以其相應用的SO,都應放在/system/lib 下面。當一個系統apk的SO加載時,會從此目錄下尋找對應用的SO文件;

4、/system/media/audio/(notification, alarms, ringtones, ui)
這裏放系統的聲音檔,像是鬧鈴聲,來電鈴聲等等。這些聲音檔,多是 ogg 格式。

5、/system/bin
存放的是一些可執行文件,基本上是由C/C++編寫的。其中有一個重要的命令叫app_process。一般大家稱之爲Zygote。(Zygote是卵的意思,所有的Android進程都是由它生出來的)。Zygote首先會加載dalvik虛擬機,然後產生一個叫做system_server的進程。system_server顧名思義被稱作Android的系統服務程序,它主要管理整個android系統。system_server啓動完成後開始尋找一個叫做啓動器的程序,找到之後由zygote開始啓動執行啓動器,這就是我們常見到的桌面程序。

6、system/xbin
存放的是一些擴展的可執行文件,既該目錄可以爲空。大家常用的busybox就放在該目錄下。Busybox所建立的各種符號鏈接命令都是放在該目錄。

7、system/build.prop
build.prop和上節說得根文件系統中的default.prop文件格式一樣,都稱爲屬性配置文件。它們都定義了一些屬性值,代碼可以讀取或者修改這些屬性值。屬性值有一些命名規範:
  ro開頭的表示只讀屬性,即這些屬性的值代碼是無法修改的。
  persist開頭的表示這些屬性值會保存在文件中,這樣重新啓動之後這些值還保留。
  其它的屬性一般以所屬的類別開頭,這些屬性是可讀可寫的,但是對它們的修改重啓之後不會保留。

8、system/etc
目錄存放一些配置文件,和屬性配置文件不一樣,這下面的配置文件可能稍微沒那麼的有規律。一般來說,一些腳本程序,還有大家所熟悉GPS配置文件(gps.conf)和APN配置文件(apns-conf.xml)放在這個目錄。像HTC將相機特效所使用的一些文件也放在這個目錄下。

data分區
當我們開機進入桌面程序後,一般來說我們都會下載安裝一些APP,這些APP都安裝在data/app目錄下。所有的Android程序生成的數據基本上都保存在data/data目錄下。wipedata實質上就是格式化data分區,這樣我們安裝的所有APP和程序數據就都丟失了。
1、/data/app
放的是使用者自己安裝的應用程式執行檔(*.apk)。

2、/data/data/
當你在程式中用Context.openFileOutput() 所建立的檔案,都放在這個目錄下的files 子目錄內。而用Context.getSharedPreferences() 所建立的preferences 檔(*.xml) ,則是放在shared_pref 這個子目錄中。

3、/data/anr/traces.txt
當你的應用程式發生ANR (Application is Not Responding) 錯誤時,Android 會自動將問題點的code stack list 寫在這個檔案內,你直接用cat 命令就可以看他的內容。

4、/data/system/dropbox/***.txt
主要是系統內apk發生crash時寫的日誌文件,主要有system_app_crash、data_app_crash等日誌。

5、/data/location/gps
是給GPS location provider 用的。其中的 properties 檔案的內容如下:

6、/data/system/location/location.gps
一般文字檔。主要是記錄最後的經緯度座標。 LocationManager.getLastKnownLocation() 就在來這抓值的。

7、/data/property/persist.sys.timezone
這個檔案也是個一般文字檔。主要是記錄目前系統所使用的時區。在我的模擬器上,他記錄着Asia/Taipei 這個字串。

cache分區
此分區是安卓系統緩存區,他保存系統最常訪問的數據和應用程序。擦除這個分區,不會影響個人數據,只是刪除了這個分區中已經保存的緩存內容,緩存內容會在後續手機使用過程中重新自動生成。

misc分區
misc分區中有Bootloader Control Block(BCB),主要是用於存放Recovery引導信息。

三、編譯後生成的img文件介紹
在編譯android 之後,會生成幾個image 文件, 這些文件是:

1.、ramdisk.img : 一個分區鏡像文件,它會在kernel 啓動的時候,以只讀的方式被 mount , 這個文件中只是包含了 /init 以及一些配置文件,這個ramdisk 被用來調用init,以及把真正的root file system mount 起來。

2、system.img:是包含了整個系統,android 的framework,application 等等,會被掛接到 “/” 上,包含了系統中所有的二進制文件

3、userdata.img: 將會被掛接到 /data 下,包含了所有應用相關的配置文件,以及用戶相關的數據 。

4、boot.img:
包括 boot header,kernel, ramdisk
boot鏡像不是普通意義上的文件系統,而是一種特殊的Android定製格式,由文件頭信息boot header,壓縮的內核,文件系統數據ramdisk以及second stage loader(可選)組成,它們之間非頁面對齊部分用0填充

5、update.img:
將所有的img文件,通過指定打包工具,製作update.img,批量生產中常用到此鏡像文件

四、燒寫過程
1、 Android系統的移植過程與移植linux很像
先移植bootloader,再移植linux內核,最後燒寫文件系統,只是最後燒寫文件系統的時候用system.img就行了。
流程:
bootloader.img -> boot.img -> system.img

Android 在啓動的時候,會由 UBOOT 傳入一個 init 參數,這個init 參數指定了開機的時候第一個運行的程序,默認就是 init 程序,這個程序在 ramdisk.img中。可以分析一下它的代碼,看看在其中到底做了一些什麼樣的初始化任務,它的源文件在system/core/init/init.c 中。它會調用到 init.rc初始化文件,這個文件在 out/target/product/generic/root 下,我們在啓動以後,會發現根目錄是隻讀屬性的,而且 sdcard 的 owner 是system,就是在這個文件中做了些手腳,可以將它改過來,實現根目錄的可讀寫。
通過分析這幾個文件,還可以發現,android 啓動時首先加載 ramdisk.img 鏡像,並掛載到/目錄下,並進行了一系列的初始化動作,包括創建各種需要的目錄,初始化 console,開啓服務等。 System.img是在 init.rc中指定一些腳本命令,通過 init.c 進行解析並掛載到根目錄下的/system 目錄下的。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章