前言
在 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) ,它可以是 release 或 debug 。根据构建类型的不同, TARGET_OUT_ROOT 会指向不同的路径:
- 如果构建类型为 release , TARGET_OUT_ROOT 指向 $(OUT_DIR)/target 。
- 如果构建类型为 debug , TARGET_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
其中:
- out 是 OUT_DIR 的默认值。
- target 是 TARGET_OUT_ROOT 的默认值。
- product 是 TARGET_PRODUCT_OUT_ROOT 的默认值。
- xxx 是 TARGET_DEVICE 的值,表示当前编译的目标设备名称。
- system 是 TARGET_COPY_OUT_SYSTEM 的默认值。
8. 实际应用
在实际的 Android 源码编译过程中,TARGET_OUT 的路径会被用于以下场景:
- 系统镜像的生成 : system.img 文件会从 TARGET_OUT 目录下的文件生成。
- 文件拷贝 :在编译过程中,生成的文件会被拷贝到 TARGET_OUT 目录下。
- 系统打包 :在生成最终的 OTA 包或刷机包时, TARGET_OUT 目录下的文件会被打包进去。
通过理解 TARGET_OUT 的指向路径及其相关的变量链,开发者可以更好地理解 Android 编译系统的内部机制,并在需要时自定义输出路径或调整编译配置。