快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈
在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_targets: droidcore dist_files
.PHONY: droidcore
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.img
INSTALLED_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 := $(PRODUCT_OUT)/installed-files.txt
$(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS) $(FILESLIST)
@echo Installed file list: $@
@mkdir -p $(dir $@)
@rm -f $@
$(hide) $(FILESLIST) $(TARGET_OUT) > $(@:.txt=.json)
$(hide) build/make/tools/fileslist_util.py -c $(@:.txt=.json) > $@
构建INSTALLED_FILES_FILE_VENDOR目标
输出:installed-files-vendor.txt
INSTALLED_FILES_FILE_VENDOR := $(PRODUCT_OUT)/installed-files-vendor.txt
$(INSTALLED_FILES_FILE_VENDOR) : $(INTERNAL_VENDORIMAGE_FILES) $(FILESLIST)
@echo Installed file list: $@
@mkdir -p $(dir $@)
@rm -f $@
$(hide) $(FILESLIST) $(TARGET_OUT_VENDOR) > $(@:.txt=.json)
$(hide) build/make/tools/fileslist_util.py -c $(@:.txt=.json) > $@
构建INSTALLED_FILES_FILE_PRODUCT目标
输出:installed-files-product.txt
INSTALLED_FILES_FILE_PRODUCT := $(PRODUCT_OUT)/installed-files-product.txt
$(INSTALLED_FILES_FILE_PRODUCT) : $(INTERNAL_PRODUCTIMAGE_FILES) $(FILESLIST)
@echo Installed file list: $@
@mkdir -p $(dir $@)
@rm -f $@
$(hide) $(FILESLIST) $(TARGET_OUT_PRODUCT) > $(@:.txt=.json)
$(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@
以下目标为可选,这里就不讲解了
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(为空)