日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android makefile编译流程(二)

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

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

在build/core/main.mk中找到第一個目標(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
其對應(yīng)的makefile依賴關(guān)系樹如下:

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

從圖中我們可以看出,systemimage偽目標(biāo)依賴下面的4個變量:
(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升級時候更新recovery分區(qū)。后面會進(jìn)一步再介紹bsdiff、imgdiff的用法。

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

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

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

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

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

我們再來回想下樹根的依賴關(guān)系

droid_targets: droidcore dist_files.PHONY: droidcore

droid是第一個目標(biāo),敲擊make時候會構(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的編譯時,已經(jīng)看出來了,(INSTALLED_BOOTIMAGE_TARGET)依賴linuxkernel和bootloader. 所以當(dāng)你敲擊make bootimage時,事實(shí)上也會編譯bootloader(uboot). 而在上一節(jié)我們知道,在你敲擊make systemimage時候,也會構(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時、或敲擊make systemimage、或敲擊make bootimage、或敲擊make bootloader,都會依賴bootloader變量.
bootloader目標(biāo)不在main.mk中,在uboot根目錄下的AndroidUboot.mk中(各個芯片廠家可能會不一樣),當(dāng)敲擊了make命令后,makefile系統(tǒng)會先將所有的include文件load進(jìn)來,然后再找到相關(guān)目標(biāo)進(jìn)行構(gòu)建。也就意味著,AndroidUboot.mk需要被include到main.mk當(dāng)中,才能識別到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, $@)

這里就不再展開介紹了,值得注意的時,依賴目標(biāo)中共有(INSTALLED_BOOTIMAGE_TARGET) ,也就意味著,敲擊make recoveryimage時,也會編譯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编译流程(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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