在Android编译系统中,TARGET_OUT 和其他相关变量(如 TARGET_OUT_VENDOR、TARGET_OUT_ODM、TARGET_OUT_PRODUCT、TARGET_OUT_SYSTEM_EXT)通常用于指定编译输出的不同目录。这些变量在编译过程中由Android构建系统定义,并用于指导模块的输出位置。
以下是对这些变量的简要解释和归纳:
TARGET_OUT:代表Android系统编译后的主要输出目录。通常包含系统镜像的大部分内容,如system、vendor、app等目录。很多情况下,TARGET_OUT 的值可能类似于 out/target/product/xxx/system,其中 xxx 是目标产品的名称或标识符。
TARGET_OUT_VENDOR:专门用于存放与特定厂商相关的文件和目录。这些文件通常是预构建的二进制文件或库,由设备制造商提供,用于增强或定制Android系统。目录路径可能类似于 out/target/product/xxx/vendor。
TARGET_OUT_ODM:ODM(Original Design Manufacturer)原始设计制造商的输出目录。类似于 TARGET_OUT_VENDOR,但通常用于存储与ODM相关的定制内容。目录路径可能类似于 out/target/product/xxx/odm(注意:不是所有的Android构建都包含ODM目录)。
TARGET_OUT_PRODUCT:与特定产品相关的输出目录。这个目录可能包含特定于该产品的配置文件、脚本或其他资源。 目录路径可能类似于 out/target/product/xxx/product(注意:product 目录的具体内容和使用方式可能因构建系统而异)。
TARGET_OUT_SYSTEM_EXT:用于存放系统扩展分区的内容。在某些Android设备上,system_ext 分区用于存储系统镜像的扩展部分,这些部分可能包含额外的应用程序、库或系统服务。目录路径可能类似于 out/target/product/xxx/system_ext。
总结一下,可以大致这么理解:
TARGET_OUT:类似于 out/target/product/xxx/system,其中 xxx 是目标产品的名称或标识符。
TARGET_OUT_VENDOR:类似于 out/target/product/xxx/vendor。
TARGET_OUT_ODM:类似于 out/target/product/xxx/odm。
TARGET_OUT_PRODUCT:类似于 out/target/product/xxx/product。
TARGET_OUT_SYSTEM_EXT:类似于 out/target/product/xxx/system_ext。
每个库的build.prop文件都应该关注build.prop文件前的目录。相关属性值其实都是和build.prop文件保持一致的,因此,分析一下build.prop内容是如何生成的即可,build/core/Makefile文件中有有很多与定义build.prop文件有关的语句,这些语句都在build/make/core/sysprop.mk文件中可以找到:
$(INSTALLED_RECOVERY_BUILD_PROP_TARGET): \
$(INSTALLED_BUILD_PROP_TARGET) \
$(INSTALLED_VENDOR_BUILD_PROP_TARGET) \
$(INSTALLED_ODM_BUILD_PROP_TARGET) \
$(INSTALLED_PRODUCT_BUILD_PROP_TARGET) \
$(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET)
@echo "Target recovery buildinfo: $@"
$(hide) mkdir -p $(dir $@) $(hide) rm -f $@
$(hide) cat $(INSTALLED_BUILD_PROP_TARGET) >> $@
$(hide) cat $(INSTALLED_VENDOR_BUILD_PROP_TARGET) >> $@
$(hide) cat $(INSTALLED_ODM_BUILD_PROP_TARGET) >> $@
$(hide) cat $(INSTALLED_PRODUCT_BUILD_PROP_TARGET) >> $@
$(hide) cat $(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET) >> $@
$(call append-recovery-ui-properties,$(PRIVATE_RECOVERY_UI_PROPERTIES),$@)
在mk文件中: =是变量赋值符号,搜索上述代码中前5排代码中变量的定义,发现大多都是诸如:INSTALLED_ODM_BUILD_PROP_TARGET := $(TARGET_OUT_ODM)/etc/build.prop的定义,我们把这些参数的定义整理一下得到以下信息:
$(INSTALLED_BUILD_PROP_TARGET) \ $(TARGET_OUT)/build.prop文件由一堆文件组成
$(INSTALLED_VENDOR_BUILD_PROP_TARGET) \ $(TARGET_OUT_VENDOR)/build.prop
$(INSTALLED_ODM_BUILD_PROP_TARGET) \ $(TARGET_OUT_ODM)/etc/build.prop
$(INSTALLED_PRODUCT_BUILD_PROP_TARGET) \ $(TARGET_OUT_PRODUCT)/etc/build.prop
$(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET) $(TARGET_OUT_SYSTEM_EXT)/etc/build.prop
查看build.prop文件第一句注释就能发现,build.prop文件的第一部分内容是来自build/make/core/sysprop.mk文件中第32行开始往后的echo语句。
define generate-common-build-props
echo "####################################" >> $(2);\
echo "# from generate-common-build-props" >> $(2);\
echo "# These properties identify this partition image." >> $(2);\
echo "####################################" >> $(2);\
$(if $(filter system,$(1)),\
echo "ro.product.$(1).brand=$(PRODUCT_SYSTEM_BRAND)" >> $(2);\
echo "ro.product.$(1).device=$(PRODUCT_SYSTEM_DEVICE)" >> $(2);\
echo "ro.product.$(1).manufacturer=$(PRODUCT_SYSTEM_MANUFACTURER)" >> $(2);\
echo "ro.product.$(1).model=$(PRODUCT_SYSTEM_MODEL)" >> $(2);\
echo "ro.product.$(1).name=$(PRODUCT_SYSTEM_NAME)" >> $(2);\
,\
echo "ro.product.$(1).brand=$(PRODUCT_BRAND)" >> $(2);\
echo "ro.product.$(1).device=$(TARGET_DEVICE)" >> $(2);\
echo "ro.product.$(1).manufacturer=$(PRODUCT_MANUFACTURER)" >> $(2);\
echo "ro.product.$(1).model=$(PRODUCT_MODEL)" >> $(2);\
echo "ro.product.$(1).name=$(TARGET_PRODUCT)" >> $(2);\
)\
$(if $(filter system vendor odm,$(1)),\
echo "ro.$(1).product.cpu.abilist=$(TARGET_CPU_ABI_LIST) " >> $(2);\
echo "ro.$(1).product.cpu.abilist32=$(TARGET_CPU_ABI_LIST_32_BIT)" >> $(2);\
echo "ro.$(1).product.cpu.abilist64=$(TARGET_CPU_ABI_LIST_64_BIT)" >> $(2);\
)\
echo "ro.$(1).build.date=`$(DATE_FROM_FILE)`" >> $(2);\
echo "ro.$(1).build.date.utc=`$(DATE_FROM_FILE) +%s`" >> $(2);\
echo "ro.$(1).build.fingerprint=$(BUILD_FINGERPRINT_FROM_FILE)" >> $(2);\
echo "ro.$(1).build.id=$(BUILD_ID)" >> $(2);\
echo "ro.$(1).build.tags=$(BUILD_VERSION_TAGS)" >> $(2);\
echo "ro.$(1).build.type=$(TARGET_BUILD_VARIANT)" >> $(2);\
echo "ro.$(1).build.version.incremental=$(BUILD_NUMBER_FROM_FILE)" >> $(2);\
echo "ro.$(1).build.version.release=$(PLATFORM_VERSION_LAST_STABLE)" >> $(2);\
echo "ro.$(1).build.version.release_or_codename=$(PLATFORM_VERSION)" >> $(2);\
echo "ro.$(1).build.version.sdk=$(PLATFORM_SDK_VERSION)" >> $(2);\
endef
我们查看out目录下各个库中的build.prop文件,均可以在build/make/core/sysprop.mk文件中找到定义,以下是build.prop文件生成的内容的详解。
以system下的build.prop内容为例,该文件是由文件/变量内容的叠加的:
根据代码:
INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop
$(eval $(call build-properties,\
system,\
$(INSTALLED_BUILD_PROP_TARGET),\
$(_prop_files_),\
$(_prop_vars_),\
$(_blacklist_names_),\
$(empty),\
$(empty)))
可以知道build.prop的内容包含变量_prop_files_、_prop_vars_等等,根据代码运行顺序,找到这段代码之前这些参数对应的属性定义即可。
根据:
ifdef TARGET_SYSTEM_PROP
system_prop_file := $(TARGET_SYSTEM_PROP)
else
system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
endif
_prop_files_ := \
$(gen_from_buildinfo_sh) \
$(system_prop_file)
得出TARGET_SYSTEM_PROP变量来自于:
./build/make/target/product/go_defaults.mk
./build/make/target/product/go_defaults_512.mk
./build/make/target/product/go_defaults_common.mk
这一步没有技巧,直接搜索就行。以上三个文件里面又定义了些属性,在三个不同的文件里:./build/make/target/board/go_defaults.prop和build/make/target/board/go_defaults_512.prop和go_defaults_common.prop。
总之就是将包含到的变量值一步一步搜索,这些变量值都是追加的,设计的文件比较多,也比较杂,下面略过搜索过程,直接给出结果:
ADDITIONAL_SYSTEM_PROPERTIES变量的值,在./build/make/core/main.mk文件中有大量定义。
PRODUCT_SYSTEM_PROPERTIES变量的值,在./build/make/target/product/runtime_libart.mk,default_art_config.mk和base_system.mk中都变量的值,有定义。
ADDITIONAL_VENDOR_PROPERTIES变量的值,在./build/make/core/main.mk文件中有大量定义。
PRODUCT_VENDOR_PROPERTIES变量的值,在大约30个文件里分别定义。
以上就是build.prop文件的大致生成流程。