日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Android makefile编译流程(二)

發(fā)布時(shí)間:2025/3/21 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android makefile编译流程(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

★★★ 友情鏈接 : 個(gè)人博客導(dǎo)讀首頁(yè)—點(diǎn)擊此處 ★★★

在build/core/main.mk中找到第一個(gè)目標(biāo),其makefile樹關(guān)系如下:

然后我們逐一分析這些目標(biāo)。

===================================================================

一、構(gòu)建files目標(biāo)

其依賴關(guān)系樹如下:

從圖中可以看出,files依賴modules_to_install和INSTALLED_ANDROID_INFO_TXT_TARGET
后面在做更近一步的詳細(xì)發(fā)分析。

===================================================================

二、構(gòu)建systemimg偽目標(biāo)

偽目標(biāo)systemimg,輸出system.img
其對(duì)應(yīng)的makefile依賴關(guān)系樹如下:

圖中黃色部分為makefile程序入口,也就是敲擊make命令時(shí)或者敲擊make systemimage時(shí),會(huì)構(gòu)建systemimage偽目標(biāo)。
systemimage偽目標(biāo)輸出的文件就是(PRODUCT_OUT)/system.img

從圖中我們可以看出,systemimage偽目標(biāo)依賴下面的4個(gè)變量:
(FULL_SYSTEMIMAGE_DEPS)
(INSTALLED_FILES_FILE)
(BUILD_IMAGE_SRCS)
(RECOVERY_FROM_BOOT_PATCH)

1、(FULL_SYSTEMIMAGE_DEPS) 目標(biāo)


2、(INSTALLED_FILES_FILE)目標(biāo)

3、(BUILD_IMAGE_SRCS)目標(biāo)

4、(RECOVERY_FROM_BOOT_PATCH)目標(biāo)
該目標(biāo)輸出我們很熟悉的recovery_from_boot.p文件,該文件是用于ota升級(jí)時(shí)候更新recovery分區(qū)。后面會(huì)進(jìn)一步再介紹bsdiff、imgdiff的用法。

這里可以看出,system.img也會(huì)依賴(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET),也就意味著:
(1)當(dāng)敲擊make system命令時(shí),在構(gòu)建system.img之前,會(huì)先構(gòu)建(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET)
(2)當(dāng)linux kernel代碼有修改時(shí)候,在手機(jī)版本更新boot.img的同時(shí),理應(yīng)也更新system.img。否則system.img中的recovery_from_boot.p還是老的 ,會(huì)導(dǎo)致OTA升級(jí)失敗

===================================================================

三、構(gòu)建bootimage/INSTALLED_BOOTIMAGE_TARGET目標(biāo)

偽目標(biāo)bootimage對(duì)應(yīng)的輸出為boot.img. 其依賴關(guān)系圖如下

INSTALLED_BOOTIMAGE_TARGET
那么真正的Linux kernel又是怎樣編譯的呢,其對(duì)應(yīng)的依賴關(guān)系圖如下:

我們?cè)賮?lái)回想下樹根的依賴關(guān)系

droid_targets: droidcore dist_files.PHONY: droidcore

droid是第一個(gè)目標(biāo),敲擊make時(shí)候會(huì)構(gòu)建,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

有沒有發(fā)現(xiàn),這里面沒有bootloader或uboot的target,其實(shí)在上面剖析boot.img的編譯時(shí),已經(jīng)看出來(lái)了,(INSTALLED_BOOTIMAGE_TARGET)依賴linuxkernel和bootloader. 所以當(dāng)你敲擊make bootimage時(shí),事實(shí)上也會(huì)編譯bootloader(uboot). 而在上一節(jié)我們知道,在你敲擊make systemimage時(shí)候,也會(huì)構(gòu)建(INSTALLED_BOOTIMAGE_TARGET),即:
make bootloader —產(chǎn)生uboot.img
make bootimage —產(chǎn)生boot.img、uboot.img
make systemimage ----產(chǎn)生system.img、boot.img、uboot.img

===================================================================

四、構(gòu)建bootloader(uboot.img)

如上一節(jié)介紹,敲擊make時(shí)、或敲擊make systemimage、或敲擊make bootimage、或敲擊make bootloader,都會(huì)依賴bootloader變量.
bootloader目標(biāo)不在main.mk中,在uboot根目錄下的AndroidUboot.mk中(各個(gè)芯片廠家可能會(huì)不一樣),當(dāng)敲擊了make命令后,makefile系統(tǒng)會(huì)先將所有的include文件load進(jìn)來(lái),然后再找到相關(guān)目標(biāo)進(jìn)行構(gòu)建。也就意味著,AndroidUboot.mk需要被include到main.mk當(dāng)中,才能識(shí)別到make bootloader命令。那么AndroidUboot.mk是如何被include到main.mk中的呢,其實(shí)還是蠻復(fù)雜蠻繞的,如下圖所示:

===================================================================

五、構(gòu)建recoveryimage/INSTALLED_RECOVERYIMAGE_TARGET

偽目標(biāo)recoveryimage輸出recovery.img,其依賴關(guān)系樹如下:

$(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, $@)

這里就不再展開介紹了,值得注意的時(shí),依賴目標(biāo)中共有(INSTALLED_BOOTIMAGE_TARGET) ,也就意味著,敲擊make recoveryimage時(shí),也會(huì)編譯boot.img了。

===================================================================

六、其它鏡像的構(gòu)建

構(gòu)建userdateimage

偽userdateimage輸出userdata.img,其依賴關(guān)系如下:

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)

構(gòu)建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)

構(gòu)建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)

構(gòu)建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)

構(gòu)建INSTALLED_FILES_FILE目標(biāo)
輸出: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) > $@

構(gòu)建INSTALLED_FILES_FILE_VENDOR目標(biāo)
輸出: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) > $@

構(gòu)建INSTALLED_FILES_FILE_PRODUCT目標(biāo)
輸出: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) > $@

以下目標(biāo)為可選,這里就不講解了
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(為空)

總結(jié)

以上是生活随笔為你收集整理的Android makefile编译流程(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。