Android makefile编译流程(二)

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在build/core/main.mk中找到第一个目标,其makefile树关系如下:
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(为空)


在这里插入图片描述
《ARMv8/ARMv9架构学习系列课程》全系列,共计52节课,超16h的视频课程

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码改变世界ctw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值