★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★

在build/core/main.mk中找到第一个目标,其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.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)

构建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(为空)

Android makefile编译流程(二)相关推荐

  1. Android Makefile编译流程

    ★★★ 友情链接 : 个人博客导读首页-点击此处 ★★★ 1.整编译 当中android根目录下敲击make时候,根目录下的Makefile就一句话include build/core/main.mk ...

  2. linux源文件编译工具Makefile编译流程

    一.Makefile介绍 个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至 ...

  3. android关机分区卸载,Android关机重启流程(二)

    一.回顾 先回顾下上部分得分析,从最开始的PM.reboot(),经过层层调用,最终调用 SystemProperties.set("sys.powerctl", "re ...

  4. android apk 自动编译器,Android APK编译流程

    apk 是Android Package的简写, 在平时的开发过程中,通过点击Run app 按钮 或者 在命令行中输入 ./gradlew ***(taskName) 这样Android Studi ...

  5. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  6. Mac 从Makefile 编译 Rocksdb 源码的一些注意事项

    文章目录 前言 Makefile 编译流程 1. 平台变量/环境变量的初始化. 2. 编译需要的源码文件变量初始化. 3. include 目录的设置. 4. 编译的执行逻辑. 问题记录1:可能的打包 ...

  7. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

    文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...

  8. 全志 android 编译,全志Android SDK编译详解(二)

    注意要确定安装了jdk) 第一步: cd  lichee; ./build.sh  -p sun5i_elite -k 3.0  (apt-get install uboot-mkimage需要安装m ...

  9. Android编译流程

    目录 一.编译流程 1.初始化编译环境 2.选择编译平台 3.开始编译 二.Soong工具 1.Soong工作原理 2.转换关系 三.make流程 1.编译开端main.mk 2.编译配置config ...

最新文章

  1. VC++设置Release模式下允许调试代码
  2. stl_vector.h
  3. css( div和span)——读书笔记
  4. java多线程构造函数_Java多线程编程经验谈
  5. excel根据rgb自动填充颜色_Excel一键定位空值与自动填充
  6. oracle学习笔记一
  7. python基础之内置异常对象
  8. 利用Linux命令和perl脚本批量将文件重命名
  9. linux查看jdk详细版本号,Linux中查看jdk版本
  10. 解决ray报错AttributeError: module ‘aioredis‘ has no attribute ‘create_redis_pool‘
  11. cefsharp作为采集工具(学习笔记)
  12. access 的几种更新语句:update where 与 update join where
  13. A feature-supervised generative adversarial network for environmental monitoring during hazy days
  14. java编写家庭收支记账程序
  15. VC,DirectX8开发实例(画面的清除和描画)
  16. Android平台移植FFmpeg和x264
  17. 我敢说,没人能超过这份产品经理推荐书单(40本)!
  18. 跟着禅一练功夫-少林八段锦对身体有什么样的益处
  19. 阿里-测试开发工程师-18年暑期实习-一面
  20. php cet成绩查询,cet.php · xuthus/redline教务查询系统 - Gitee.com

热门文章

  1. ups的空开、电缆及电池的配置计算
  2. 数据机房局部过热与节能降耗解决方案
  3. Google 首次引入数据中心液体冷却
  4. AI之HCI:人机交互Human-Computer Interaction的简介、发展历史、案例应用之详细攻略
  5. Blockchain:《Blockchain applications in insurance》Deloitte—德勤区块链技术研究报告正文版—听课记录
  6. YOLO:将yolo的.weights文件转换为keras、tensorflow等模型所需的.h5文件的图文教程
  7. Python机器学习类库常见问题及解决
  8. 如何快速掌握Pandas
  9. Packet for query is too large (1166 1024). You can change this value
  10. Java 中浮点数---------BigDecimal和double(初探)