android 啟動過程和 build 過程

來源:互聯網
上載者:User

 

首先下載下android源碼並編譯,網上的資料特別多,可以參考一下這個網站http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957749.aspx

按照網站上的步驟,將android核心編譯成功,如果不出意外的話,在out/target/product/generic目錄下會產生三個檔案,分別是ramdisk.img、sytem.img、userdata.img。這三個檔案到底有什麼用呢?下面開始分析一下。

首先在linux終端下使用命令file ramdisk.img,列印出如下字元ramdisk.img: gzip compressed data, from Unix,可以看出,它是一個gzip壓縮的格式,下面對其進行解壓,使用fedora內建的工具進行解壓,或者使用gunzip進行解壓(可能需要將副檔名改為.gz),可以看到解壓出一個新的ramdisk.img,這個ramdisk.img是使用cpio壓縮的,可以使用cpio命令對其進行解壓,cpio –i –F ramdisk.img,解壓後可以看到產生了一些檔案夾和檔案。看到這些檔案就會明白,它和root目錄下的內容完全一樣。說明了ramdisk.img其實是對root目錄的打包和壓縮。

下面分析system.img的來源。在build/core/Makefile裡的629行,可以看到這麼一段文字

# The installed image, which may be optimized or unoptimized.

#

INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img

從這裡可以看出,系統應該會在$(PRODUCT_OUT)目錄下產生system.img

再繼續往下看,在662行有一個copy-file-to-target,這實現了將system.img從一個中間目錄複寫到/generic目錄。

BUILD_SYSTEM的定義在636行。

這裡的system.img不是/generic目錄下面我們看到的那個 system.img,而是另一個中間目錄下的,但是是同一個檔案。一開始看到的複製就是把out /target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates目錄下面的system.img複製到/generic目錄下。

現在,知道了system.img的來曆,然後要分析它是一個什麼東西,裡麵包含什嗎??

Makefile line624

$(BUILT_SYSTEMIMAGE_UNOPT): $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_MKUSERFS)

$(call build-systemimage-target,$@)

這裡調用了build-systemimg-target Makefile line605

ifeq ($(TARGET_USERIMAGES_USE_EXT2),true)

## generate an ext2 image

# $(1): output file

define build-systemimage-target

@echo "Target system fs image: $(1)"

$(call build-userimage-ext2-target,$(TARGET_OUT),$(1),system,)

endef

else # TARGET_USERIMAGES_USE_EXT2 != true

## generate a yaffs2 image

# $(1): output file

define build-systemimage-target

@echo "Target system fs image: $(1)"

@mkdir -p $(dir $(1))

*$(hide) $(MKYAFFS2) -f $(TARGET_OUT) $(1)*

endef

endif # TARGET_USERIMAGES_USE_EXT2

找不到TARGET_USERIMAGES_USE_EXT2的定義!!!不過從上面的分析可以推斷出應該是yaffs2檔案系統。

其中MKYAFFS2:(core/config.mk line161)

MKYAFFS2 := $(HOST_OUT_EXECUTABLES)/mkyaffs2image$(HOST_EXECUTABLE_SUFFIX)

定義MKYAFFS2是目錄/media/disk/mydroid /out/host/linux-x86/bin下的一個可執行檔mkyaffs2image,運行這個程式可得到如下資訊:

lzj@lzj-laptop:/media/disk/mydroid/out/host/linux-x86/bin$ ./mkyaffs2image

mkyaffs2image: image building tool for YAFFS2 built Nov 13 2009

usage: mkyaffs2image [-f] dir image_file [convert]

-f fix file stat (mods, user, group) for device

dir the directory tree to be converted

image_file the output file to hold the image

'convert' produce a big-endian image from a little-endian machine

得知這個程式可以產生yaffs2的檔案系統映像。並且也清楚了上面*$(hide) $(MKYAFFS2) -f $(TARGET_OUT) $(1)*的功能,把TARGET_OUT目錄轉變成yaffs2格式並輸出成/media/disk/mydroid/out/target /product/generic/obj/PACKAGING/systemimage_unopt_intermediates /system.img(也就是我們最終在/generic目錄下看到的那個system.img)。

到現在已經差不多知道system.img的產生過程,要弄清楚 system.img裡面的內容,就要分析TARGET_OUT目錄的內容了。 (想用mount把system.img掛載到linux下面看看裡面什麼東西,卻不支援yaffs和yaffs2檔案系統!!!)

下一步:分析TARGET_OUT 在build/core/envsetup.sh檔案(line205)中找到了TARGET_OUT的定義:

TARGET_OUT := $(PRODUCT_OUT)/system

也就是/media/disk/mydroid/out/target /product/generic目錄下的system目錄。

lzj@lzj-laptop:/media/disk/mydroid/out/target/product/generic/system$ tree -L 1

.

|-- app

|-- bin

|-- build.prop

|-- etc

|-- fonts

|-- framework

|-- lib

|-- usr

`-- xbin

現在一切都明白了,我們最終看到的system.img檔案是該目錄下的 system目錄的一個映像,類似於linux的根檔案系統的映像,放著android的應用程式,設定檔,字型等。

Userdata.img來來自於data目錄,預設裡面是沒有檔案的。

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目錄下的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.