Android编译系统分析系列文章:
android编译系统分析(一)-source build/envsetup.sh与lunch
Android编译系统(二)-mm编译单个模块
android编译系统分析(三)-make
android编译系统(四)-实战:新增一个产品
Android编译系统分析(五)-system.img的生成过程
我们在完整编译android系统的时候,最终会生成几个重要的镜像文件,其中有system.img,userdata.img,ramdisk.img等。这篇文章的目的是分析system.img的生成过程。
回想下我们完整编译android系统时的动作,我们会在android源码顶级目录执行make命令,这样就会完整的编译android系统,我们没有传入任何参数(-jx等加快编译的除外),因为我们没有明确指定make的目标,所以android编译系统会执行默认的编译目标,也就是droid。因此,我们还是从droid着手,看看system.img怎么生成。
我们只关注system.img相关的部分,其他部分都忽略,因此会有如下依赖关系:
一.systemimage
# Rules that need to be present for the all targets, even
# if they don't do anything.
.PHONY: systemimage
systemimage:
sytemimage是一个伪目标,它并不会被生成。
systemimage: $(INSTALLED_SYSTEMIMAGE)
systemimage依赖于$(INSTALLED_SYSTEMIMAGE)
二.$(INSTALLED_SYSTEMIMAGE)
INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img
INSTALLED_SYSTEMIMAGE变量的值就是system.img了,也就是说它就是我们最终要生成的目标。那么看看它的定义:
$(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP)
@echo "Install system fs image: $@"
$(copy-file-to-target)
$(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
(INSTALLEDSYSTEMIMAGE)有依赖了 (BUILT_SYSTEMIMAGE) 和 (RECOVERYFROMBOOTPATCH)以及 (ACP),我们目前无法知道这三个变量是什么,当然,这里的 (ACP)是一种read−only依赖,也就是说 (ACP)发生改变时,编译器并不会重新生成system.img, (ACP)其实代表的是acp可执行文件,这个执行文件由acp.c文件生成,