Android makefile编译流程(二)
★★★ 友情鏈接 : 個人博客導(dǎo)讀首頁—點(diǎn)擊此處 ★★★
在build/core/main.mk中找到第一個目標(biāo),其makefile樹關(guān)系如下:
然后我們逐一分析這些目標(biāo)。
===================================================================
一、構(gòu)建files目標(biāo)
其依賴關(guān)系樹如下:
從圖中可以看出,files依賴modules_to_install和INSTALLED_ANDROID_INFO_TXT_TARGET
后面在做更近一步的詳細(xì)發(fā)分析。
===================================================================
二、構(gòu)建systemimg偽目標(biāo)
偽目標(biāo)systemimg,輸出system.img
其對應(yīng)的makefile依賴關(guān)系樹如下:
圖中黃色部分為makefile程序入口,也就是敲擊make命令時或者敲擊make systemimage時,會構(gòu)建systemimage偽目標(biāo)。
systemimage偽目標(biāo)輸出的文件就是(PRODUCT_OUT)/system.img
從圖中我們可以看出,systemimage偽目標(biāo)依賴下面的4個變量:
(FULL_SYSTEMIMAGE_DEPS)
(INSTALLED_FILES_FILE)
(BUILD_IMAGE_SRCS)
(RECOVERY_FROM_BOOT_PATCH)
1、(FULL_SYSTEMIMAGE_DEPS) 目標(biāo)
2、(INSTALLED_FILES_FILE)目標(biāo)
3、(BUILD_IMAGE_SRCS)目標(biāo)
4、(RECOVERY_FROM_BOOT_PATCH)目標(biāo)
該目標(biāo)輸出我們很熟悉的recovery_from_boot.p文件,該文件是用于ota升級時候更新recovery分區(qū)。后面會進(jìn)一步再介紹bsdiff、imgdiff的用法。
這里可以看出,system.img也會依賴(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET),也就意味著:
(1)當(dāng)敲擊make system命令時,在構(gòu)建system.img之前,會先構(gòu)建(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET)
(2)當(dāng)linux kernel代碼有修改時候,在手機(jī)版本更新boot.img的同時,理應(yīng)也更新system.img。否則system.img中的recovery_from_boot.p還是老的 ,會導(dǎo)致OTA升級失敗
===================================================================
三、構(gòu)建bootimage/INSTALLED_BOOTIMAGE_TARGET目標(biāo)
偽目標(biāo)bootimage對應(yīng)的輸出為boot.img. 其依賴關(guān)系圖如下
INSTALLED_BOOTIMAGE_TARGET
那么真正的Linux kernel又是怎樣編譯的呢,其對應(yīng)的依賴關(guān)系圖如下:
我們再來回想下樹根的依賴關(guān)系
droid是第一個目標(biāo),敲擊make時候會構(gòu)建,droid依賴droidcore和dist_file,dist_file為空,droidcore又依賴一堆的target:
droidcore: files \systemimage \$(INSTALLED_BOOTIMAGE_TARGET) \$(INSTALLED_RECOVERYIMAGE_TARGET) \$(INSTALLED_VBMETAIMAGE_TARGET) \$(INSTALLED_USERDATAIMAGE_TARGET) \$(INSTALLED_CACHEIMAGE_TARGET) \$(INSTALLED_BPTIMAGE_TARGET) \$(INSTALLED_VENDORIMAGE_TARGET) \$(INSTALLED_PRODUCTIMAGE_TARGET) \$(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \$(INSTALLED_FILES_FILE) \$(INSTALLED_FILES_FILE_VENDOR) \$(INSTALLED_FILES_FILE_PRODUCT) \$(INSTALLED_FILES_FILE_SYSTEMOTHER) \soong_docs有沒有發(fā)現(xiàn),這里面沒有bootloader或uboot的target,其實(shí)在上面剖析boot.img的編譯時,已經(jīng)看出來了,(INSTALLED_BOOTIMAGE_TARGET)依賴linuxkernel和bootloader. 所以當(dāng)你敲擊make bootimage時,事實(shí)上也會編譯bootloader(uboot). 而在上一節(jié)我們知道,在你敲擊make systemimage時候,也會構(gòu)建(INSTALLED_BOOTIMAGE_TARGET),即:
make bootloader —產(chǎn)生uboot.img
make bootimage —產(chǎn)生boot.img、uboot.img
make systemimage ----產(chǎn)生system.img、boot.img、uboot.img
===================================================================
四、構(gòu)建bootloader(uboot.img)
如上一節(jié)介紹,敲擊make時、或敲擊make systemimage、或敲擊make bootimage、或敲擊make bootloader,都會依賴bootloader變量.
bootloader目標(biāo)不在main.mk中,在uboot根目錄下的AndroidUboot.mk中(各個芯片廠家可能會不一樣),當(dāng)敲擊了make命令后,makefile系統(tǒng)會先將所有的include文件load進(jìn)來,然后再找到相關(guān)目標(biāo)進(jìn)行構(gòu)建。也就意味著,AndroidUboot.mk需要被include到main.mk當(dāng)中,才能識別到make bootloader命令。那么AndroidUboot.mk是如何被include到main.mk中的呢,其實(shí)還是蠻復(fù)雜蠻繞的,如下圖所示:
===================================================================
五、構(gòu)建recoveryimage/INSTALLED_RECOVERYIMAGE_TARGET
偽目標(biāo)recoveryimage輸出recovery.img,其依賴關(guān)系樹如下:
$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) $(ADBD) \$(INSTALLED_RAMDISK_TARGET) \$(INSTALLED_BOOTIMAGE_TARGET) \$(INTERNAL_RECOVERYIMAGE_FILES) \$(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \$(INSTALLED_2NDBOOTLOADER_TARGET) \$(recovery_build_props) $(recovery_resource_deps) \$(recovery_fstab) \$(RECOVERY_INSTALL_OTA_KEYS) \$(INSTALLED_VENDOR_DEFAULT_PROP_TARGET) \$(BOARD_RECOVERY_KERNEL_MODULES) \$(DEPMOD)$(call build-recoveryimage-target, $@)這里就不再展開介紹了,值得注意的時,依賴目標(biāo)中共有(INSTALLED_BOOTIMAGE_TARGET) ,也就意味著,敲擊make recoveryimage時,也會編譯boot.img了。
===================================================================
六、其它鏡像的構(gòu)建
構(gòu)建userdateimage
偽userdateimage輸出userdata.img,其依賴關(guān)系如下:
BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.imgINSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET)INSTALLED_USERDATAIMAGE_TARGET_DEPS := \$(INTERNAL_USERIMAGES_DEPS) \$(INTERNAL_USERDATAIMAGE_FILES) \$(BUILD_IMAGE_SRCS) $(INSTALLED_USERDATAIMAGE_TARGET): $(INSTALLED_USERDATAIMAGE_TARGET_DEPS)$(build-userdataimage-target)構(gòu)建cacheimage
BUILT_CACHEIMAGE_TARGET := $(PRODUCT_OUT)/cache.img # We just build this directly to the install location. INSTALLED_CACHEIMAGE_TARGET := $(BUILT_CACHEIMAGE_TARGET) $(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES) $(BUILD_IMAGE_SRCS)$(build-cacheimage-target)構(gòu)建vendorimage
BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img # We just build this directly to the install location. INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET) $(INSTALLED_VENDORIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) $(INSTALLED_FILES_FILE_VENDOR) $(BUILD_IMAGE_SRCS) $(DEPMOD) $(BOARD_VENDOR_KERNEL_MODULES)$(build-vendorimage-target)構(gòu)建productimage
BUILT_PRODUCTIMAGE_TARGET := $(PRODUCT_OUT)/product.img # We just build this directly to the install location. INSTALLED_PRODUCTIMAGE_TARGET := $(BUILT_PRODUCTIMAGE_TARGET) $(INSTALLED_PRODUCTIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_PRODUCTIMAGE_FILES) $(INSTALLED_FILES_FILE_PRODUCT) $(BUILD_IMAGE_SRCS)$(build-productimage-target)構(gòu)建INSTALLED_FILES_FILE目標(biāo)
輸出:installed-files.txt
構(gòu)建INSTALLED_FILES_FILE_VENDOR目標(biāo)
輸出:installed-files-vendor.txt
構(gòu)建INSTALLED_FILES_FILE_PRODUCT目標(biāo)
輸出:installed-files-product.txt
以下目標(biāo)為可選,這里就不講解了
INSTALLED_SYSTEMOTHERIMAGE_TARGET(system_other.img)
INSTALLED_BPTIMAGE_TARGET(partition-table.img)
INSTALLED_VBMETAIMAGE_TARGET(vbmeta.img)
INSTALLED_FILES_FILE_SYSTEMOTHER(installed-files-system-other.txt)
soong_docs(為空)
總結(jié)
以上是生活随笔為你收集整理的Android makefile编译流程(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python:将一个文件转换为二进制文件
- 下一篇: [专栏目录]-Android专栏目录