Bootstrap

Android mk文件中‘TARGET_OUT‘的路径分析

前言

在 Android 源码的编译系统中,TARGET_OUT 是一个核心变量,用于指向编译生成的系统镜像的最终输出路径。本文将通过分析 build/core/envsetup.mk 文件中的变量定义,详细解析 TARGET_OUT 的指向路径及其相关的变量链。


1. TARGET_OUT 的定义

TARGET_OUT 的定义如下:

TARGET_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM)

这里,TARGET_OUT 是由两个变量组合而成的:

  • PRODUCT_OUT:指向产品输出的根目录。
  • TARGET_COPY_OUT_SYSTEM:表示系统目录的名称,通常为 system

因此,TARGET_OUT 的最终路径是 $(PRODUCT_OUT)/system


2. PRODUCT_OUT 的定义

PRODUCT_OUT 的定义如下:

PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)

这里, PRODUCT_OUT 由两个部分组成:

  • TARGET_PRODUCT_OUT_ROOT:指向产品输出的根目录。
  • TARGET_DEVICE:表示当前编译的目标设备的名称。

因此,PRODUCT_OUT 的路径是 ( T A R G E T P R O D U C T O U T R O O T ) / (TARGET_PRODUCT_OUT_ROOT)/ (TARGETPRODUCTOUTROOT)/(TARGET_DEVICE)


3. TARGET_PRODUCT_OUT_ROOT 的定义

TARGET_PRODUCT_OUT_ROOT 的定义如下:

TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product

这里, TARGET_PRODUCT_OUT_ROOT 指向了 $(TARGET_OUT_ROOT)/product ,即目标输出的根目录下的 product 目录。

  • TARGET_OUT_ROOT :指向目标输出的根目录。

因此, TARGET_PRODUCT_OUT_ROOT 的路径是 $(TARGET_OUT_ROOT)/product


4. TARGET_OUT_ROOT 的定义

TARGET_OUT_ROOT 的定义如下:

TARGET_OUT_ROOT_release := $(OUT_DIR)/target
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))

这里, TARGET_OUT_ROOT 的值取决于当前的构建类型 (TARGET_BUILD_TYPE) ,它可以是 releasedebug 。根据构建类型的不同, TARGET_OUT_ROOT 会指向不同的路径:

  • 如果构建类型为 releaseTARGET_OUT_ROOT 指向 $(OUT_DIR)/target
  • 如果构建类型为 debugTARGET_OUT_ROOT 指向 $(DEBUG_OUT_DIR)/target

5. OUT_DIR 的定义

OUT_DIR 是编译输出的根目录,其定义如下:

ifeq (,$(strip $(OUT_DIR)))
ifeq (,$(strip $(OUT_DIR_COMMON_BASE)))
    OUT_DIR := $(TOPDIR)out
else
    OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD))
endif
endif

如果 OUT_DIR 没有被显式设置,那么它会根据以下规则进行设置:

  • 如果 OUT_DIR_COMMON_BASE 未被设置, OUT_DIR 默认为 $(TOPDIR)out
  • 如果 OUT_DIR_COMMON_BASE 被设置, OUT_DIR 指向 ( O U T D I R C O M M O N B A S E ) / (OUT_DIR_COMMON_BASE)/ (OUTDIRCOMMONBASE)/(notdir $(PWD))

6. DEBUG_OUT_DIR 的定义

DEBUG_OU T_DIR 是调试构建的输出目录,其定义如下:

DEBUG_OUT_DIR := $(OUT_DIR)/debug
  • DEBUG_OUT_DIR 指向 $(OUT_DIR)/debug ,即 OUT_DIR 目录下的 debug 子目录。

7. 总结

通过以上变量的定义和组合, TARGET_OUT 的最终路径可以表示为:

TARGET_OUT = out/target/product/xxx/system

其中:

  • outOUT_DIR 的默认值。
  • targetTARGET_OUT_ROOT 的默认值。
  • productTARGET_PRODUCT_OUT_ROOT 的默认值。
  • xxxTARGET_DEVICE 的值,表示当前编译的目标设备名称。
  • systemTARGET_COPY_OUT_SYSTEM 的默认值。

8. 实际应用

在实际的 Android 源码编译过程中,TARGET_OUT 的路径会被用于以下场景:

  • 系统镜像的生成system.img 文件会从 TARGET_OUT 目录下的文件生成。
  • 文件拷贝 :在编译过程中,生成的文件会被拷贝到 TARGET_OUT 目录下。
  • 系统打包 :在生成最终的 OTA 包或刷机包时, TARGET_OUT 目录下的文件会被打包进去。

通过理解 TARGET_OUT 的指向路径及其相关的变量链,开发者可以更好地理解 Android 编译系统的内部机制,并在需要时自定义输出路径或调整编译配置。

;