深入解析Android OTA升级中的版本号管理与build.prop文件生成机制

前言

OTA(Over-The-Air)升级过程中,版本号扮演着至关重要的角色。从低版本向高版本的升级操作,必须依赖于当前设备的属性信息,其中版本号就是核心要素之一

为了深入探究build.prop文件的生成机制,我们在build/目录下进行了广泛的搜索,特别是针对ro.build.display.id这一关键属性。在build/make/路径下的多个脚本和Python文件中,我们发现了与ro.build.display.id相关的引用。其中,buildinfo.sh脚本负责将BUILD_DISPLAY_ID的值写入到属性文件中,这是生成build.prop文件的关键步骤之一。

longzhiye@Ubuntu:~/work/androidT/build/make$ grep "ro.build.display.id" . -r -n
./tools/releasetools/target_files_diff.py:66:             'ro.build.display.id=',
./tools/releasetools/test_sign_target_files_apks.py:143:        ('ro.build.display.id=',
./tools/releasetools/test_sign_target_files_apks.py:144:         'ro.build.display.id='),
./tools/releasetools/sign_target_files_apks.py:890:      elif key == "ro.build.display.id":
./tools/buildinfo.sh:12:echo "ro.build.display.id=$BUILD_DISPLAY_ID"
longzhiye@Ubuntu:~/work/androidT/build/make$ grep "BUILD_DISPLAY_ID" . -r -n
./tools/buildinfo.sh:echo "ro.build.display.id=$BUILD_DISPLAY_ID"
./core/sysprop.mk:# BUILD_DISPLAY_ID is shown under Settings -> About Phone
./core/sysprop.mk:          BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \

进一步检索发现,BUILD_DISPLAY_ID的值是在build/make/core/sysprop.mk文件中定义的。这个Makefile脚本通过调用buildinfo.sh脚本,并传递一系列构建参数(如TARGET_BUILD_TYPE、BUILD_ID、BUILD_DISPLAY_ID等),最终生成了包含这些属性值的buildinfo.prop文件。这个中间产物文件位于out/target/product/XXX/obj/PACKAGING/system_build_prop_intermediates/目录下(在Android T及更高版本中,路径可能略有不同,如out/target/product/XXX/obj/ETC/system_build_prop_intermediates/)。

build/make/core/sysprop.mk

gen_from_buildinfo_sh := $(call intermediates-dir-for,PACKAGING,system_build_prop)/buildinfo.prop
$(gen_from_buildinfo_sh): $(INTERNAL_BUILD_ID_MAKEFILE) $(API_FINGERPRINT) | $(BUILD_DATETIME_FILE) $(BUILD_NUMBER_FILE)
    $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \
            TARGET_BUILD_FLAVOR="$(TARGET_BUILD_FLAVOR)" \
            TARGET_DEVICE="$(TARGET_DEVICE)" \
            PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \
            PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" \
            PRIVATE_BUILD_DESC="$(BUILD_DESC)" \
            BUILD_ID="$(BUILD_ID)" \
            BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \
            DATE="$(DATE_FROM_FILE)" \
            BUILD_USERNAME="$(BUILD_USERNAME)" \
            BUILD_HOSTNAME="$(BUILD_HOSTNAME)" \
            BUILD_NUMBER="$(BUILD_NUMBER_FROM_FILE)" \

sysprop.mk文件中定义了gen_from_buildinfo_sh变量,该变量指向了buildinfo.prop文件的生成路径。

$(call intermediates-dir-for,PACKAGING,system_build_prop)/buildinfo.prop 文件中的值

在编译产物路径下找到了buildinfo.prop文件的实际位置,并进行了实验。

out\target\product\XXX\obj\PACKAGING\system_build_prop_intermediates\buildinfo.prop

为了验证这一发现,我们进行了实验:首先删除buildinfo.prop文件,然后执行make命令。结果证明,当buildinfo.prop文件不存在时,构建系统会重新生成该文件,并将其内容复制到最终的system/build.prop文件中。这一实验结果进一步证实了我们的分析,即build.prop文件的生成是由build/make/core/sysprop.mk脚本控制的。

out/target/product/XXX/obj/ETC/system_build_prop_intermediates/build.prop

综上所述,OTA升级过程中版本号的正确使用依赖于build.prop文件的准确生成。通过深入分析和实验验证,揭示了build.prop文件的生成机制,为OTA升级过程中的版本管理提供了有力的技术支撑。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容