很多软件的版本号里都有 Build 次数、时间、主机这样的构建信息,这里我介绍一种 Android Studio 里通过 Gradle 脚本自动创建以及更新构建信息的方法,每次构建的时候自动更新版本的 Build 次数、时间、主机等信息,不需要手动设置。
class BuildInfo {
public int Number
public String Time
public String Host
}
我用上面这个 BuildInfo Class
来描述构建信息,Number
为构建次数,Time
为构建时间,Host
是构建时用的主机。当然,还可以添加其他信息。下面的这个函数执行时会根据机器当前的信息创建、设置并返回一个 BuildInfo
对象。
BuildInfo updateBuildInfo() {
File fileBuildInfo = new File("${project.projectDir}/build-info.json")
def jsonBuildInfo
if (fileBuildInfo.canRead()) {
jsonBuildInfo = new groovy.json.JsonSlurper().parseText(fileBuildInfo.text)
// Update data to the current information
jsonBuildInfo.Number++
jsonBuildInfo.Time = new Date().format("yyyy-MM-dd")
jsonBuildInfo.Host = "${System.getProperty("user.name")}@${InetAddress.localHost.hostName}"
} else {
jsonBuildInfo = [
Number: 0,
Time : new Date().format("yyyy-MM-dd"),
Host : "${System.getProperty("user.name")}@${InetAddress.localHost.hostName}"
]
}
// Save data to the json file
def jsonString = groovy.json.JsonOutput.toJson(jsonBuildInfo)
def jsonBeauty = groovy.json.JsonOutput.prettyPrint(jsonString)
fileBuildInfo.write(jsonBeauty)
return new BuildInfo(
Number: jsonBuildInfo.Number,
Time: jsonBuildInfo.Time,
Host: jsonBuildInfo.Host
)
}
由于 Build 次数 Number
是通过写入文件来记录的,每次 Build 都会在文件里增加计数,所以连同 Time
、Host
等信息也都写入到了文件里。这里用的是 JSON 的方式来存取,文件 build-info.json
位于 Module 的当前目录,文件的内容如下。
{
"Number": 317,
"Time": "2019-08-22",
"Host": "User-Name@Host-Name"
}
上面代码放到 Module 的 build.gradle
末尾,构建的时候执行 updateBuildInfo
即可返回构建信息 BuildInfo
,接下来是将 BuildInfo
设置到软件版本里,代码如下。App 软件 VersionCode
的一般分为四部分:“Major.Minor.Revision.Build”最后一部分常用来表示 Build 信息,这里即表示 Build 次数,VersionName
也做同样的设置。
android {
...
defaultConfig {
...
BuildInfo buildInfo = updateBuildInfo()
resValue "string", "gradle_build_time", buildInfo.Time
resValue "string", "gradle_build_host", buildInfo.Host
versionCode(1 << 24 | 0 << 18 | 1 << 12 | buildInfo.Number) // 8bit.6bit.6bit.12bit
versionName "1.0.1-" + buildInfo.Number
}
}
...
class BuildInfo {
...
}
BuildInfo updateBuildInfo() {
...
}
resValue "string", "gradle_build_time", buildInfo.Time
是通过 Gradle 创建 string 资源(不是在 XML 里创建的),这个资源的 id 是 gradle_build_time
value 是 buildInfo.Time
即 Build 的时间,这个资源在 XML 及代码中均可以访问,使用方法也和普通 string 资源一样。版本信息效果如下(没显示全部)。
