android啟動過程
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目錄下的。
ramdisk.img、system.img、userdata.img映象產生過程:
ramdisk.img、system.img、userdata.img映象拆解過程:
1、ramdisk.img:
ramdisk(initrd)是乙個小的分割槽映象,在引導時核心以唯讀方式掛載它。它只保護/init和一些配置檔案。它用於初始化和掛載其它的檔案系統映象。ramdisk是乙個標準的linux特性。
ramdisk.img被包含google android sdk中($sdk_root/tools/lib/images/ramdisk.img),也可以編譯生成($sdk_root/out/target/product/$produt_name/ramdisk.img)。這是乙個gzip壓縮的cpio檔案。
修改android的ramdisk映象
要修改它,首先複製它到你的linux機器上,並用如下命令解開:
user@computer:$ mv ramdisk.img ramdisk.cpio.gz解開後,做一些你的修改和刪除無用的檔案後,通過如下命令重新建立ramdisk.cpio:gzip -d ramdisk.cpio.gz
mkdir ramdisk
cd ramdisk
cpio -i -f ../ramdisk.cpio
user@computer:$ cpio -i -t -f ../ramdisk.cpio | cpio -o -h newc -o ../ramdisk_new.cpio然後可以重新改名並壓縮:
user@computer:$ cd ..
gzip ramdisk_new.cpio
mv ramdisk_new.cpio.gz ramdisk.img
2、system和data映象
system.img是掛載到 / 下的映象,它包含了全部的系統可執行檔案。
userdata.img掛載到 /data 下的映象,它包含了應用及使用者相關的資料。
在實際的物理裝置中,他們通過ramdisk中的init.rc指令碼掛載為檔案系統。它們可以有各種不同的格式,如 yaffs2、ext4或 ubi-fs。
它們通過android構建系統生成並刷入到物理裝置中。模擬器對它們的使用有所不同(見下文):
3、android模擬器映象
system.img 被複製到乙個臨時檔案中,用於模擬器工作。所以你對模擬器中的根目錄做的任何改變都會在模擬器退出後丟失。
userdata.img 只用於使用了 -wipe-data引數時。通常將~/.android/userdata-qemu.img(linux下)作為 /data 分割槽映象掛載,而使用 -wipe-data 時會複製userdata.img中的內容到userdata-qemu.img。
sdcard.img 用於使用了-sdcard引數時,掛載到/sdcard
cache.img 用於使用了-cache引數來指定/cache內容。如果未指定該引數,模擬器啟動時會建立乙個空的臨時檔案掛載到/cache上。這個臨時檔案會在退出時自動清除。
模擬器不會修改system.img和userdata.img。
4、拆解android』s yaffs2 映象
乙個yaffs2檔案在linux被識別為「vms alpha executable」檔案。
user@computer:$ file $}/out/target/product/imx51_ccwmx51js/system.img
./out/target/product/imx51_ccwmx51js/system.img: vms alpha executable
unyaffs。
源**並重新編譯它。
user@computer:$ gcc -o unyaffs unyaffs.c
sudo chmod +x /complete/directory/path/to/unyaffs
然後使用這個命令來拆解 yaff2 映象檔案:
user@computer:$ mkdir image
cd image
unyaffs ../system.img
5、拆解ext4映象
如果映象是ext4,那麼很簡單,直接掛載就可以讀取其中的內容了:
user@computer:$ mount -o loop -t ext4 system.img /media
6、拆解jffs2映象
作為補充,這裡說一下如何拆解jffs2映象:
user@computer: modprobe mtdblock
modprobe jffs2
modprobe mtdram total_size=65536 erase_size=256
mknod /tmp/mtdblock0 b 31 0
dd if=/pathtoimage/rootfs.jffs2 of=/tmp/mtdblock0
mount -t jffs2 /tmp/mtdblock0 /mnt
Android啟動過程
android啟動過程之image分析過程 android在啟動的時候,會由uboot傳入乙個init引數,這個init引數指定了開機的時候第乙個執行的程式,預設就是init程式,這個程式在ramdisk.img中。可以分析一下它的 看看在其中到底做了一些什麼樣的初始化任務,它的原始檔在system...
Android系統啟動過程
android系統啟動過程由以下幾個大步驟組成 bootrom,bootloader,linux kernel,android啟動 bootrom沒有源 bootloader 主要在 bootable下,包括對normal startup,及recovery mode,fastboot mode的處...
Android啟動過程分析 1
從系統的角度看,android的啟動過程可以分為bootloader引導 裝載和啟動linux核心,啟動andorid系統的3個大的階段。其中android系統的啟動還可以細分為啟動init程序,啟動zygote,啟動sytemserver,啟動各項服務等多個階段。1 bootloader的引導 b...