很多软件的版本号里都有 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 都会在文件里增加计数,所以连同 TimeHost 等信息也都写入到了文件里。这里用的是 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 资源一样。版本信息效果如下(没显示全部)。

It's about the network
版本信息