Android makefile编译流程(二)
★★★ 友情鏈接 : 個人博客導讀首頁—點擊此處 ★★★
在build/core/main.mk中找到第一個目標,其makefile樹關系如下:
然后我們逐一分析這些目標。
===================================================================
一、構建files目標
其依賴關系樹如下:
從圖中可以看出,files依賴modules_to_install和INSTALLED_ANDROID_INFO_TXT_TARGET
后面在做更近一步的詳細發分析。
===================================================================
二、構建systemimg偽目標
偽目標systemimg,輸出system.img
其對應的makefile依賴關系樹如下:
圖中黃色部分為makefile程序入口,也就是敲擊make命令時或者敲擊make systemimage時,會構建systemimage偽目標。
systemimage偽目標輸出的文件就是(PRODUCT_OUT)/system.img
從圖中我們可以看出,systemimage偽目標依賴下面的4個變量:
(FULL_SYSTEMIMAGE_DEPS)
(INSTALLED_FILES_FILE)
(BUILD_IMAGE_SRCS)
(RECOVERY_FROM_BOOT_PATCH)
1、(FULL_SYSTEMIMAGE_DEPS) 目標
2、(INSTALLED_FILES_FILE)目標
3、(BUILD_IMAGE_SRCS)目標
4、(RECOVERY_FROM_BOOT_PATCH)目標
該目標輸出我們很熟悉的recovery_from_boot.p文件,該文件是用于ota升級時候更新recovery分區。后面會進一步再介紹bsdiff、imgdiff的用法。
這里可以看出,system.img也會依賴(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET),也就意味著:
(1)當敲擊make system命令時,在構建system.img之前,會先構建(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET)
(2)當linux kernel代碼有修改時候,在手機版本更新boot.img的同時,理應也更新system.img。否則system.img中的recovery_from_boot.p還是老的 ,會導致OTA升級失敗
===================================================================
三、構建bootimage/INSTALLED_BOOTIMAGE_TARGET目標
偽目標bootimage對應的輸出為boot.img. 其依賴關系圖如下
INSTALLED_BOOTIMAGE_TARGET
那么真正的Linux kernel又是怎樣編譯的呢,其對應的依賴關系圖如下:
我們再來回想下樹根的依賴關系
droid是第一個目標,敲擊make時候會構建,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有沒有發現,這里面沒有bootloader或uboot的target,其實在上面剖析boot.img的編譯時,已經看出來了,(INSTALLED_BOOTIMAGE_TARGET)依賴linuxkernel和bootloader. 所以當你敲擊make bootimage時,事實上也會編譯bootloader(uboot). 而在上一節我們知道,在你敲擊make systemimage時候,也會構建(INSTALLED_BOOTIMAGE_TARGET),即:
make bootloader —產生uboot.img
make bootimage —產生boot.img、uboot.img
make systemimage ----產生system.img、boot.img、uboot.img
===================================================================
四、構建bootloader(uboot.img)
如上一節介紹,敲擊make時、或敲擊make systemimage、或敲擊make bootimage、或敲擊make bootloader,都會依賴bootloader變量.
bootloader目標不在main.mk中,在uboot根目錄下的AndroidUboot.mk中(各個芯片廠家可能會不一樣),當敲擊了make命令后,makefile系統會先將所有的include文件load進來,然后再找到相關目標進行構建。也就意味著,AndroidUboot.mk需要被include到main.mk當中,才能識別到make bootloader命令。那么AndroidUboot.mk是如何被include到main.mk中的呢,其實還是蠻復雜蠻繞的,如下圖所示:
===================================================================
五、構建recoveryimage/INSTALLED_RECOVERYIMAGE_TARGET
偽目標recoveryimage輸出recovery.img,其依賴關系樹如下:
$(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, $@)這里就不再展開介紹了,值得注意的時,依賴目標中共有(INSTALLED_BOOTIMAGE_TARGET) ,也就意味著,敲擊make recoveryimage時,也會編譯boot.img了。
===================================================================
六、其它鏡像的構建
構建userdateimage
偽userdateimage輸出userdata.img,其依賴關系如下:
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)構建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)構建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)構建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)構建INSTALLED_FILES_FILE目標
輸出:installed-files.txt
構建INSTALLED_FILES_FILE_VENDOR目標
輸出:installed-files-vendor.txt
構建INSTALLED_FILES_FILE_PRODUCT目標
輸出:installed-files-product.txt
以下目標為可選,這里就不講解了
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(為空)
總結
以上是生活随笔為你收集整理的Android makefile编译流程(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python:将一个文件转换为二进制文件
- 下一篇: openssl aes加解密的使用