Android 12中build.prop文件生成流程

在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文件的大致生成流程。

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值