前言
在 Android 源碼的編譯系統(tǒng)中,TARGET_OUT
是一個核心變量,用于指向編譯生成的系統(tǒng)鏡像的最終輸出路徑。本文將通過分析 build/core/envsetup.mk
文件中的變量定義,詳細解析 TARGET_OUT
的指向路徑及其相關(guān)的變量鏈。
1. TARGET_OUT
的定義
TARGET_OUT
的定義如下:
TARGET_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM)
這里,TARGET_OUT 是由兩個變量組合而成的:
- PRODUCT_OUT:指向產(chǎn)品輸出的根目錄。
- TARGET_COPY_OUT_SYSTEM:表示系統(tǒng)目錄的名稱,通常為 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:指向產(chǎn)品輸出的根目錄。
- TARGET_DEVICE:表示當前編譯的目標設備的名稱。
因此,PRODUCT_OUT 的路徑是 (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 的值取決于當前的構(gòu)建類型 (TARGET_BUILD_TYPE) ,它可以是 release 或 debug 。根據(jù)構(gòu)建類型的不同, TARGET_OUT_ROOT 會指向不同的路徑:
- 如果構(gòu)建類型為 release , TARGET_OUT_ROOT 指向 $(OUT_DIR)/target 。
- 如果構(gòu)建類型為 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 沒有被顯式設置,那么它會根據(jù)以下規(guī)則進行設置:
- 如果 OUT_DIR_COMMON_BASE 未被設置, OUT_DIR 默認為 $(TOPDIR)out 。
- 如果 OUT_DIR_COMMON_BASE 被設置, OUT_DIR 指向
(notdir $(PWD)) 。
6. DEBUG_OUT_DIR 的定義
DEBUG_OU T_DIR 是調(diào)試構(gòu)建的輸出目錄,其定義如下:
DEBUG_OUT_DIR := $(OUT_DIR)/debug
- DEBUG_OUT_DIR 指向 $(OUT_DIR)/debug ,即 OUT_DIR 目錄下的 debug 子目錄。
7. 總結(jié)
通過以上變量的定義和組合, 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 的路徑會被用于以下場景:
- 系統(tǒng)鏡像的生成 : system.img 文件會從 TARGET_OUT 目錄下的文件生成。
- 文件拷貝 :在編譯過程中,生成的文件會被拷貝到 TARGET_OUT 目錄下。
- 系統(tǒng)打包 :在生成最終的 OTA 包或刷機包時, TARGET_OUT 目錄下的文件會被打包進去。
通過理解 TARGET_OUT 的指向路徑及其相關(guān)的變量鏈,開發(fā)者可以更好地理解 Android 編譯系統(tǒng)的內(nèi)部機制,并在需要時自定義輸出路徑或調(diào)整編譯配置。