生成boot.img流程 (makefile文件)

**Mkbootimg.c:**========================================================
if argc>2
strcmp(arg,second/cmdline/kernel/ramdisk...)==> 设置值/偏移量(eg:bootimg = val /kernel_offset=strtoul(...))
设置地址 eg :hdr.page_size = ....
赋值hdr.magic
判断cmdline长度是否过长


==》给boot_img_hdr hdr结构体变量赋值==》
然后用load_file函数判断该地址对应的文件是否存在==》
hdr添加哈希值==》
打开bootimg文件,写入hdr==》
在bootimg文件中写入padding,长度为pagesize-(itemsize&pagemask)

**生成boot.img的Makefile=**===============================================
#INTERNAL_BOOTIMAGES_ARGS是环境变量,用于指定Android系统启动时的内核引导参数(影响系统初始化、内存分配、设备驱动等)
INTERNAL_BOOTIMAGE_ARGS := \
	# 用于将前缀字符串 --second 添加到每个 $(INSTANLLED_2NBOOTLOADER_TARGET) 字符串之前,返回值是一个新的字符串列表
	$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
	--kernel $(INSTALLED_KERNEL_TARGET) \
	--ramdisk $(INSTALLED_RAMDISK_TARGET)

#从环境变量INTERNAL_BOOTIMAGE_ARGS中过滤以--开头的字符传参数,并将剩余的参数作为INTERNAL_BOOTIMAGE_FILES变量的值
#$(filter-out pattern ,text)用于匹配符合指定模式pattern的字符串,并返回未匹配的字符串列表text
INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS))
INTERNAL_BOOTIMAGE_FILES += $(INSTALLED_BOARDDTB_TARGET)

#$(strip去除开头和结尾空格
BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE))
ifdef BOARD_KERNEL_CMDLINE  判断BOARD_KERNEL_CMDLINE是否被定义
  INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" 将--cmdline "$(BOARD_KERNEL_CMDLINE)(加括号可能是为了保存空格)"加到INTERNAL_BOOTIMAGE_ARGS内核环境变量末尾
endif


BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
ifdef BOARD_KERNEL_BASE
  INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
endif

BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
ifdef BOARD_KERNEL_PAGESIZE
  INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
endif

BOARD_KERNEL_OFFSET := $(strip $(BOARD_KERNEL_OFFSET))
ifdef BOARD_KERNEL_OFFSET
  INTERNAL_BOOTIMAGE_ARGS += --kernel_offset $(BOARD_KERNEL_OFFSET)
endif

同上

#PRODUCT_BUILD_SECURE_BOOT_IMAGE是GNU Make(开源的构建自动化工具,根据makefile来管理和维护软件项目的构建过程)中定义的变量,用于判断INSTALLED_BOOTIMAGE_TARGET中变量的值
ifneq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true)
	INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
else
	INSTALLED_BOOTIMAGE_TARGET_NOT_SIGNED := $(PRODUCT_OUT)/boot.img
	#将字符串encrypt拼接在$(INSTALLED_BOOTIMAGE_TARGET_NOT_SIGNED)变量后,可用于生成指定后缀名的文件名或路径
	INSTALLED_BOOTIMAGE_TARGET := $(INSTALLED_BOOTIMAGE_TARGET_NOT_SIGNED).encrypt
endif#ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true)

ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)
#call intermediates-dir-for函数用于生成由PRODUCT_OUT目录开始的/生成目标文件的中间文件目录(中间文件指软件构件过程中生成的非最终目标文件)
#call intermediates-dir-for 参数1:EXECUTABLES是给定的模块类型
#call intermediates-dir-for 参数2:boot_img是给定模块名
#call intermediates-dir-for 参数3:空字符串是可选的子文件目录组成的目录路径,该路径通常用于存储临时文件,如编译过程中生成的对象文件、依赖关系文件等...
#总之,这句话的含义是构建中产生boot_img模块的中间文件目录
tmp_dir_for_image := $(call intermediates-dir-for,EXECUTABLES,boot_img)/bootimg
INTERNAL_BOOTIMAGE_ARGS += --tmpdir $(tmp_dir_for_image)
INTERNAL_BOOTIMAGE_ARGS += --genext2fs $(MKEXT2IMG)

ifeq ($(TARGET_BOOTIMAGE_USE_EXTLINUX),true)
INTERNAL_BOOTIMAGE_ARGS += --extlinuxconf $(TARGET_BOOTIMAGE_EXTLINUX_CONFIG)
endif

#结果:定义了一个规则用于生成目标文件$(INSTALLED_BOOTIMAGE_TARGET),规则的依赖项是$(MKEXT2IMG)$(INTERNAL_BOOTIMAGE_FILES)
#$(call pretty,"Target boot image: $@")调用打印美化函数pretty打印
#$(MKEXT2BOOTIMG)是一个工具或脚本的路径,用于生成boot image文件。$(INTERNAL_BOOTIMAGE_ARGS)是一组参数,用于配置生成过程的详细选项
#--output $@表示将生成的文件保存为目标文件$(INSTALLED_BOOTIMAGE_TARGET)
$(INSTALLED_BOOTIMAGE_TARGET): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES)
	$(call pretty,"Target boot image: $@")
	$(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@

#.PHONY是一个伪目标,不管是否存在与该目标同名的文件或文件夹,它都应该被看作需要执行的目标;
#bootimage-nodeps是一个伪目标,并不依赖于其他目标。==》即使没有bootimage-nodeps文件,make工具也会执行与该目标相关的命令或规则
.PHONY: bootimage-nodeps
bootimage-nodeps: $(MKEXT2IMG) 命令:依赖项
	@echo "make $@: ignoring dependencies"打印消息,正在执行无视依赖项的操作
	#$(hide是一个函数  用于隐藏命令的输出  使其在执行过程中不被显示出来
	#--output $(INSTALLED_BOOTIMAGE_TARGET)将生成的文件保存至$(INSTALLED_BOOTIMAGE_TARGET
	$(hide) $(MKEXT2BOOTIMG)(工具/脚本路径==》用于生成boot.img) $(INTERNAL_BOOTIMAGE_ARGS)(参数,配置生成过程的详细选项) --output $(INSTALLED_BOOTIMAGE_TARGET)

else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) # TARGET_BOOTIMAGE_USE_EXT2 != true
ifneq ($(strip $(filter --%,$(BOARD_MKBOOTIMG_ARGS))),)
  INTERNAL_BOOTIMAGE_ARGS += $(strip $(BOARD_MKBOOTIMG_ARGS))
endif

# Check mkbootimg tool args: can't have two --second <filename>
#检查INTERNAL_BOOTIMAGE_ARGS中是否有>=2个--seconcd参数,有的话输出错误信息,终止编译,避免生成错误的boot image文件
#$(words计算--second参数的个数
#(filter选取为--second的参数
ifeq ($(words $(filter --second,$(INTERNAL_BOOTIMAGE_ARGS))),2)
#error会输出错误信息到命令行中,终止整个makefile的执行,显示变量(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS))
  $(error ERROR: find two --second args! $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS))
endif

#目标文件:生成目标文件的三个依赖项$(MKBOOTIMG)$(INTERNAL_BOOTIMAGE_FILES)$(BOOT_SIGNER),这三个文件其中一个发生变化时,makefile会重新生成目标文件
$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER)
	$(call pretty,"Target boot image: $@")
	#隐藏执行生成boot.img文件的命令 结果输出在$(INSTALLED_BOOTIMAGE_TARGET)$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@
	#对生成的boot image文件进行签名,从而确保该文件没有被篡改过,其中/boot是Android系统中保存签名证书和公钥所需的目录
	#$(BOOT_SIGNER)是签名工具的路径
	#$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8   和    $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pe是用于签名的私钥和公钥
	#$@表示要签名文件的名称  即之前生成的boot.img文件
	$(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@
#这段主要是生成安全启动镜像
ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true)  该变量为真的话,生成安全启动镜像
	$(hide) mv $@ $(INSTALLED_BOOTIMAGE_TARGET_NOT_SIGNED)将目标文件$@移动到$(INSTALLED_BOOTIMAGE_TARGET_NOT_SIGNED)
	$(hide) $(PRODUCT_AML_SECUREBOOT_SIGNIMAGE) \使用工具$(PRODUCT_AML_SECUREBOOY_SIGNIMAGE)进行签名
		--input $(INSTALLED_BOOTIMAGE_TARGET_NOT_SIGNED) \输入文件为$(INSTALLED_BOOTIMAGE_TARGET_NOT_SIGNED
		--output $@ 文件输出路径
	$(hide) @echo "$@: installed amlosgic encrypted kernel for verified boot"提示信息
endif # ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true)
	#检查生成的安全启动镜像的大小是否超过指定的最大限制,即$(BOARD_BOOTIMAGE_PARTITION_SIZE))
	$(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE))


.PHONY: bootimage-nodeps
bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER)
	@echo "make $@: ignoring dependencies"
	$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET)
	$(BOOT_SIGNER) /boot $(INSTALLED_BOOTIMAGE_TARGET) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(INSTALLED_BOOTIMAGE_TARGET)
	$(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE))

else # PRODUCT_SUPPORTS_VERITY != true
#筛选出前缀为--%的参数,去除掉其前后空格;如果$(BOARD_MKBOOTIMG_ARGS))有这样的参数的话,将这些参数追加到INTERNAL_BOOTIMAGE_ARGS中
#可以将一些额外命令行的参数传递给mkbootimg工具,并将其添加到生成安全启动镜像的命令行中


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值