img解析:linux
ramdisk.img:Android根文件系統,在android編譯系統生成的out/target/product/root目錄中android
結構:app
./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 保存用戶、應用信息。工具
結構:.net
/data/app 全部安裝後的app會移至此處,apk被拆成dex和apk,dex爲目標文件,apk爲資源包調試
/data/data 應用程序內部存儲信息,sharepreference、database,etcrest
system.img 包含整個android系統orm
結構:ip
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
刷機方法:
源碼編譯完成後,在out/target/product目錄下會生成選擇平臺的鏡像
將編好的img文件刷到手機中:
將boot.img和system.img拷到fastboot目錄下,
adb reboot bootloader令手機重啓計入fastboot模式
執行:
fastboot -w -p flashall
fastboot flash boot boot.img
fastboot flash recovery recovery.img
fastboot flash system system.img
fastboot flash userdata userdata.img
//fastboot flash cache cache.img
//fastboot flash ramdisk ramdisk.img