ramdisk.img system.img userdata.img 分析
Android 原始碼編譯後,在out/target/product/generic下生成的三個映象文 件:ramdisk.img,system.img,userdata.img以及它們對應的目錄樹root,system,data。 ramdisk.img是根檔案系統,system.img包括了主要的包、庫等檔案,userdata.img包括了一些使用者資料,android載入 這3個映像檔案後,會把 system和 userdata分別載入到 ramdisk檔案系統中的system和 data目錄下。
Ramdisk映象是採用cpio打包,gzip壓縮的。用file驗證:
# file ramdisk.img
輸出:
# ramdisk.img: gzip compressed data, from Unix
為了便於說明問題,我們將ramdisk.img拷貝到其它一個目錄,然後按以下步驟將ramdisk.img還原為目錄樹:
# mv ramdisk.img ramdisk.img.gz
# gunzip ramdisk.img.gz
# mkdir ramdisk
#cd ramdisk
# cpio i F ../ramdisk.img
這樣,就得到一個完整的ramdisk目錄,與out/target/product/generic/root對比後,我們發現它們是一樣的內容。 通過執行以下的操作,我們可由目錄樹再生成ramdisk映象
# cd ramdisk # find . | cpio -o -H newc | gzip > ../ramdisk-new.img
ramdisk.img其實是對root目錄的打包和壓縮,ramdisk根檔案系統中包含一些對於啟動android的很重要的檔案,比如核心啟動完後加載的第一個程序init、一些重要的配置檔案等,總之它控制著整個android的啟動。根據 init.rc,init.goldfish.rc來初始化並裝載系統庫、程式等直到開機完成。init.rc指令碼包括了檔案系統初始化、裝載的許多過程。init.rc的工作主要是:
1)設定一些環境變數
2)建立system、sdcard、data、cache等目錄
3)把一些檔案系統mount到一些目錄去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)設定一些檔案的使用者群組、許可權
5)設定一些執行緒引數
6)設定TCP快取大
system.img userdata.img這兩個映象都屬於yaffs2檔案格式,生成方式是一樣的。我們就以system.img為例來說明。
System.img 生成 system目錄樹 所需工具unyaffs
# mkdir system
# cd system
# unyaffs ../system.img
system目錄樹生成system.img 所需工具 mkyaffs2image,Android原始碼編譯後會生成該工具,在 out/host/linux-x86/bin 目錄下。 命令格式:
# mkyaffs2image system/ system_new.img
system.img檔案是system目錄的一個映像,類似於linux的根檔案系統的映像,放著android的應用程式,配置檔案,字型等
android啟動時首先載入ramdisk.img映象,並掛載到/目錄下,並進行了一系列的初始化動作,包括建立各種需要的目錄,初始化console,開啟服務等。System.img是在init.rc中指定一些指令碼命令,通過init.c進行解析並掛載到根目錄下的/system目錄下的。
對於android系統資料夾,比如out/target/prod t/smdk6410/system目錄,說明如下:
system/app 這個裡面主要存放的是常規下載的應用程式,可以看到都是以APK格式結尾的檔案。在這個資料夾下的程式為系統預設的元件,自己安裝的軟體將不會出現在這裡,而是/data/資料夾中。
system/bin 這個目錄下的檔案都是系統的本地程式,從bin資料夾名稱可以看出是binary二進位制的程式,裡面主要是Linux系統自帶的元件。 system/etc 從資料夾名稱來看儲存的都是系統的配置檔案,比如APN接入點設定等核心配置。
system/fonts 字型資料夾,除了標準字型和粗體、斜體外可以看到檔案體積最大的可能是中文字型檔,或一些unicode字型檔。
system/framework 主要是一些核心的檔案,從字尾名為jar可以看出是是系統平臺框架。
system/lib lib目錄中存放的主要是系統底層庫,如平臺執行時庫。
system/media 鈴聲音樂資料夾,除了常規的鈴聲外還有一些系統提示事件音
system/usr 使用者資料夾,包含共享、鍵盤佈局、時間區域檔案等。