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