Android Makefile中如何识别TARGET_PRODUCT

本文介绍Android编译系统如何通过环境变量TARGET_PRODUCT定制产品。详细解释了AndroidMakefile如何解析此变量,包括遍历vendor子目录寻找AndroidProducts.mk,确定TARGET_DEVICE,及最终影响BoardConfig.mk配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有时间小看一下Android 的Makefile, 终于稍有明白Android 编译系统是如何通过环境变量 TARGET_PRODUCT 来决定编译定制product.

首先, 编译Android 代码 通常情况下使用:

# make showcommands

这实际上等价于下面的完整命令 (具体参见 build/core/envsetup.mk )

# TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands

可见,默认情况下编译系统认为TARGET_PRODUCT 是generic 的

那如何编译特定产品的Android呢?

这就需要查看Android Makefile是如何解析环境变量TARGET_PRODUCT的。

Android Makefile 的引用关系是这样的

Makefile  -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/product_config.mk

在build/core/product_config.mk 中编译系统首先调用 build/core/product.mk中定义的函数get-all-product-makefiles ,来

遍历整个vendor 的子目录, 找到vendor下所有的 AndroidProducts.mk, 不同子目录下的AndroidProducts.mk 中定义了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我们也可以通过 打开build/core/product_config.mk  中的#$(dump-products) 语句使控制台编译的时候输出所有product 的信息)  , 接着build/core/product_config.mk 会调用resolve-short-product-name 将TARGET_PRODUCT匹配的AndroidProducts.mk 中定义的 PRODUCT_DEVICE 赋值给TARGET_DEVICE。

有了这个TARGET_DEVICE, 再回到 build/core/config.mk,

会include $(TARGET_DEVCIE)/BoardConfig.mk

board_config_mk := /
 $(strip $(wildcard /
  $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
  vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /
 ))

 include $(board_config_mk)

而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是 GENERIC_AUDIO 等等

另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR, 因为TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路径。

TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))

当然Android 的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk

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_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product

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

再回到 build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有Android.mk文件,并将这些Android.mk文件include 进来

#
# Typical build; include any Android.mk files we can find.
#

subdir_makefiles := /
 $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)

include $(subdir_makefiles)

我们再来看其中的

./build/target/board/Android.mk

,对了它引用了

include $(TARGET_DEVICE_DIR)/AndroidBoard.mk

由上面TARGET_DEVICE_DIR的定义,这下又进入了

vendor 下TARGET_DEVICE指向的目录了,这个mk文件中定义了特定Product需要编译和安装app 和 script


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/stevenliyong/archive/2010/02/04/5285334.aspx

<think>我们正在讨论如何获取Android构建变量TARGET_PRODUCT。根据之前的对话,用户已经了解了一些查看构建配置的方法,现在特别关注TARGET_PRODUCT这个变量。 根据引用[1]和[2],我们知道TARGET_PRODUCTAndroid构建系统中的一个重要变量,它指定了目标设备型号(如aosp_arm, aosp_x86_64等)。我们需要提供几种获取该变量的方法。 方法总结: 1. 使用环境变量:在已经执行过envsetup.sh和lunch命令的终端中,直接echo $TARGET_PRODUCT。 2. 使用构建系统工具:使用get_build_var命令(在envsetup.sh之后可用)来获取。 3. 检查lunch命令的输出:执行lunch命令时,选择目标后会打印出包括TARGET_PRODUCT在内的配置信息。 4. 从构建配置文件中读取:例如buildspec.mk文件(如果存在)中可能定义了TARGET_PRODUCT。 5. 从构建输出目录中读取:构建完成后,在out/target/product/<device>目录下,<device>就是TARGET_PRODUCT的值(但注意,这个目录名可能和变量值略有不同,通常是设备代号)。 注意:所有方法都必须在已经初始化构建环境(source build/envsetup.sh)之后才能使用。 由于用户当前的问题是如何获取TARGET_PRODUCT,我们重点给出前两种最直接的方法。</think>要获取 Android 构建变量 `TARGET_PRODUCT`,可通过以下方法操作: ### 1. **环境变量直接查看** 在初始化构建环境后直接读取环境变量: ```bash echo $TARGET_PRODUCT ``` **前提条件**: - 必须先执行 `source build/envsetup.sh` 初始化环境 - 执行过 `lunch <target>` 选择目标设备[^2] ### 2. **使用构建系统工具** 通过 AOSP 提供的查询工具获取: ```bash get_build_var TARGET_PRODUCT ``` **优势**:无需依赖当前 shell 环境变量,直接从构建系统获取最新值[^1] ### 3. **解析构建日志** 查看 lunch 命令的输出记录: ```bash lunch | grep "TARGET_PRODUCT" ``` **输出示例**: ``` TARGET_PRODUCT=aosp_sailfish ``` ### 4. **检查构建配置文件** 查看设备定义文件(位于 `device/` 目录): ```bash # 以 Pixel 设备为例 grep TARGET_PRODUCT device/google/coral/aosp_coral.mk ``` **输出示例**: ```makefile TARGET_PRODUCT := aosp_coral ``` ### 5. **构建产物分析** 从最终生成的构建配置中提取: ```bash cat out/target/product/*/build.prop | grep ro.product.name ``` **等价关系**:`ro.product.name` 的值与 `TARGET_PRODUCT` 一致[^1] > **操作流程示例**: > ```bash > source build/envsetup.sh # 初始化环境 > lunch aosp_coral-eng # 选择目标 > echo "当前目标设备: $TARGET_PRODUCT" # 输出 aosp_coral > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值