1. 程式人生 > >android解析 ramdisk.img boot.img system.img

android解析 ramdisk.img boot.img system.img

img解析:

ramdisk.img:android根檔案系統,在android編譯系統生成的out/target/product/root目錄中

結構:

./init.trout.rc
./default.prop 儲存一些除錯引數,對於開發者相當重要
./proc
./dev
./init.rc         一些啟動引數
./init
./sys
./init.goldfish.rc
./sbin           
./sbin/adbd
./system  system.img掛載點
./data      userdata.img掛載點

userdata.img 儲存使用者、應用資訊。

結構:

/data/app  所有安裝後的app會移至此處,apk被拆成dex和apk,dex為目標檔案,apk為資源包

/data/data 應用程式內部儲存資訊,sharepreference、database,etc

system.img 包含整個android系統

結構:

system/app                   android出廠內建應用在此,同時,在這裡的app可以獲得一些特別的許可權。

system/framework         android框架在此,不宜亂動,開發者可以使用adb push + 拔電池開關機可以快速驗證問題。(前提是eng版本)

Special App:

SystemUI.apk 狀態列藏在裡面。

framework-res.apk包含整個系統res資料夾 including 系統UI、一些配置引數、theme、style、animation

recovery.img 按power鍵+音量上鍵(android預設)可以進去,可以執行T卡升級,format,backup userdata,restore userdata

結構:不知道

boot.img 包含一個linux kernel (maybe named as zImage)和一個ramdisk。img檔案結構在原始碼system/core/mkbootimg/bootimg.h中宣告

uboot.img android啟動時第一個載入的映象,初始化硬體和基本輸入出系統。

所以一般flash到android裝置中的img一般是這幾個:uboot.img,boot.img,recovery.img,userdata.img,system.img

system提取以及打包方法:

提取:adb pull system $dst_dir

即可將system.img解包提取到本地,

貌似GB的版本system.img用的檔案系統為yaffs,可以使用mkyaffs(android自帶) 生成system.img 解包可以使用網友自制的unyaffs解包。

ICS版本system.img使用的是ext4檔案系統,可以使用android自帶的mk_ext4fs工具打包system.img,目前網上對於ICS版本的討論較少,並沒有找到解包工具

ramdisk提取以及打包方法:

提取:由於ramdisk各個裝置商打包方法略有不同,所以不推薦直接從裝置中提取,最好還是找一個官方ramdisk,分析下結構。再做提取修改打包動作。

打包(android預設):mkbootimgfs $root_dir | gzip > ramdisk.img

因此ramdisk.img是一個gzip的壓縮包,裡面有個ramdisk的映象

由於不同廠商打包方式有所不同,比如MTK會把gzip的壓縮包外面再加一個檔案頭(雖然不知道是什麼,不過好像很厲害的樣子),很多廠商也會加個頭。不過可以根據gzip的檔案格式從加殼的ramdisk中將gzip提取出來,修改後,再把gzip放回去。

因此ramdisk的修改會比較麻煩。改得不好,則無法開機。

boot.img打包解包方法:

解包:可以根據bootimg.h檔案頭格式,可以自己編個程式解包,也可以使用已有的工具進行解析:

split-bootimg.pl是一個國外網友自制的boot.img解包工具。解包後生成$bootimg_name-kernel.img 和 $bootimg_name-ramdisk.gz

打包:mkbootimg --kernel $kernelimg --ramdisk $ramdiskimg --kernel_base $kernel_base --page_size $page_size --cmd_line $cmd -o $out_image

--kernel --ramdisk 指定kernel ramdisk映象

--kernel_base --page_size 【可選】指定kernel基址和頁大小,如果有原始碼可以檢視BoardConfig.mk

--cmd_line 指定一條命令,可以在開機的時候執行。

-o 輸出映象名字

boot.img一般不要輕易換,很容易造成不開機,一定要注意備份。。

不開機的幾種原因:

kernel_base錯了,uboot找不到kernel的載入程式。

ramdisk解包錯誤,無法建立檔案系統

android開機過程:

上電,載入uboot,初始化硬體

載入boot.img,載入linux核心,建立檔案系統。

根據啟動模式,決定是正常啟動、recovery_mode factory_mode。

載入recovery.img或者system.img