Version Name & Version Code
开发者们经常使用硬编码来设置版本名 跟 版本号.
举个栗子
defaultConfig {
...
versionCode 1
versionName "1.0.0"
}
这样做的话有几个问题:
你永远不知道哪一次提交代表着哪个版本
-
无论何时你增加版本号或者或者修改版本名称你都得修改项目的build.gradle 文件
如果你正在使用git作为你的代码管理系统,它同时也能帮助你生成Android 项目的版本名跟版本名跟版本号. 这是一种惯例——用git tag 来标记新版本的发布。
版本名
对于版本名我们可以直接使用git describe命令
a. 这个命令从可获得的一个提交里面找到最新的tag
b. 如果这个tag指向这个提交,就显示这个唯一的tag
c. 否则它后的缀标签名将会是在标记对象顶部的附加提交数加上最近提交的缩写对象名称
例(a-b):
- 用tag 1.0标记一次特定的提交
- 检查这次提交
- 执行git describe -tags
- 输出:1.0
如你所见,如果你在最近这个带有tag的这个提交上执行git describe,它就是输出这个tag
例(a-c)
- 用tag1.0标记一次提交
- 在添加两个提交
- 执行git describe -tags
- 输出:1.0-2-gdca226a
利用 git 提交的拼接 "1.0-2-gdca226a" 我们轻易就能知道做了哪次特定的提交
版本号
我们可以使用标记的总数来标记版本号。因为每一个git tag标记了一个版本,所以下一个版本的版本号总会比之前的大。
在上面的这个例子里面我们有3个标记。这个值将会用于我们的版本号。
然而我们不会为每一个中间版本设置一个标记,因此我们可以使用最近提交的时间戳作为开发构建的版本号
在上图的例子中,最近版本提交的时间戳为1484407970 。这个值就是我们的版本号。
Groovy使用git的方法
我推荐使用一个库grgit来使用git。使用以下代码创建一个script-git-version.gradle 文件:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.ajoberstar:grgit:1.5.0'
}
}
import org.ajoberstar.grgit.Grgit
ext {
git = Grgit.open(currentDir: projectDir)
gitVersionName = git.describe()
gitVersionCode = git.tag.list().size()
gitVersionCodeTime = git.head().time
}
task printVersion() {
println("Version Name: $gitVersionName")
println("Version Code: $gitVersionCode")
println("Version Code Time: $gitVersionCodeTime")
}
在你的build.gradle文件中添加:
apply plugin: 'com.android.application'
apply from: "$project.rootDir/tools/script-git-version.gradle"
运行gradle命令 ./gradlew pritVersion 来检查是否正确生成了版本名字跟版本号,输出:
Version Name: 1.0-2-gdca226a
Version Code: 2
Version Code Time: 1484407970
最终我们就能在 build.gradle 文件中使用gtiVersionName, gitVersionCode 跟gitVersionCodeTime 变量了。
productFlavors {
dev {
versionCode gitVersionCodeTime
versionName gitVersionName
}
prod {
versionCode gitVersionCode
versionName gitVersionName
}
}
运行项目,检查 app 版本号
这种方法的好处是:
- 不用再去修改 build.gradle 文件了 —— 因为版本号跟版本名都是自动生成的
- 你可以轻易找出是哪个提交生成
Note: 你可以尝试更多的版本名:包括分支名,时间戳等
原文链接 :https://hackernoon.com/configuring-android-project-version-name-code-b168952f3323#.m6t1xca9l