Android啟動過程以及各個映象的關係

2021-06-23 10:03:00 字數 2957 閱讀 3496

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

gzip -d ramdisk.cpio.gz

mkdir ramdisk

cd ramdisk

cpio -i -f ../ramdisk.cpio

解開後,做一些你的修改和刪除無用的檔案後,通過如下命令重新建立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...