Chromium源代码学习之版本号

版本号是如何定义、输出的?

版本号规则、迭代周期

Chrome版本号规则分为四部分:
major-version.minor-version.build-version.patch-version,可以通过地址栏输入
chrome://version/ 获得。

版本号的源头

Chrome基本是一个月更新一个大版本,每次更新版本号是通过LUCI (Chrome源代码的一个版本机器人)提交commit变更,变更文件为 chrome/VERSION ,详细的变更记录可以参见:
src/+log/main/chrome/VERSION。这个文件只是一个文本文件,是获取版本号最最原始的配置。

数据调用过程

通过从UI层的版本号写入,我们追一下这里面的调用关系、数据源、配置构建是如何发挥作用的。
举例说明,chrome://version/ 中的版本号UI层是预置的HTML文件 components/version_ui/resources/about_version.html ,通过模版替换对应的HTML字符串占位符

$i18n{version}
($i18n{official})
$i18n{version_modifier}
$i18n{version_processor_variation}

对应的占位符Key映射在components/version_ui/version_ui_constants.cc

对应的替换调用在chrome/browser/ui/webui/version/version_ui.cc,这里我们会发现调用是version_info::GetVersionNumber(),声明位置在components/version_info/version_info.h,此处直接引用了components/version_info/version_info_values.h.version的PRODUCT_VERSION。

#define PRODUCT_VERSION "@MAJOR@.@MINOR@.@BUILD@.@PATCH@"

GN配置生成

版本号的数据源追踪到这里就要用到gn编译配置了,上面这个预配置文件,经过gn生成编译配置时会生成对应的header文件out/Default/gen/components/version_info/version_info_values.h,其中这里的@major@变量会被gn填充上真实的字符串,也就是chrome/VERSION所配置的版本号。

具体的编译配置生成脚本在components/version_info/BUILD.gn,这里同时使用了gn的函数模版process_version来处理版本号相关的配置填充,

process_version("generate_version_info") {
template_file = "version_info_values.h.version"
sources = [
"//chrome/VERSION",
branding_file_path,
lastchange_file,
]
output = "$target_gen_dir/version_info_values.h"
}

这个函数模版定义在build/util/process_version.gni,主要操作就是通过build/util/version.py来解析输入的三个文件,调用SubstTemplatetemplate_file中的@major@执行替换工作。

更多

通过搜索version.py或者process_version引用就能发现很多通过GN配置生成方式写入版本号的地方:
chrome/version.gni
remoting/remoting_version.gni
build/fuchsia/cipd/BUILD.gn

至此通过chrome/VERSION git-commit写入版本号,gn编译配置调用version.py写入对应的编译header文件,在访问chrome://version/ 时就完成了版本号的加载显示,虽然这个点很小,但对阅读庞大的Chromium源代码算是入门,当然这里的前提是先熟悉一下Chromium的目录结构。