Version Name&Code
我們經(jīng)常會(huì)在android中以硬編碼的方式來配置versionName&versionCode。
defaultConfig{
...
versionCode 1
versionName "1.0.0"
}
上面的方法有一些弊端:
- 你永遠(yuǎn)不知道哪一次的提交代表一個(gè)特定的版本
- 每當(dāng)你需要增加versionCode和修改versionName的時(shí)候,你都必須要修改
build.gradle文件。
如果你使用git作為你的源碼控制系統(tǒng)的話,他也可以幫助你生成android versionName和versionCode,這是一個(gè)常見的做法,使用git標(biāo)簽來作為新版本的發(fā)布。

Version Name
對于version name,我們可以使用git describe命令
- 使用這個(gè)命令可以查看最近提交的標(biāo)記
- 如果tag指向提交,那么只顯示tag
Example(a-b)
- 標(biāo)記一次特定的commit為tag1.0
2.檢出這次提交
3.輸入命令git describe
4.輸出:1.0
正如你看到的,如果你在提交的使用用tag的話,那么在你輸入git describe命令的時(shí)候,就會(huì)輸出這個(gè)tag。
Example(a-c)
- 標(biāo)記一次commit為tag 1.0
- 添加更多的commits
- 輸入命令git describe
- 將會(huì)輸出 1.0-2-gdca226a
Version Code
對于versionCode,我們可以使用tag的總數(shù),因?yàn)槊恳淮蔚膅it tag指向一個(gè)版本,versionCode總是會(huì)比之前的那個(gè)版本大。
在上面的示例中,我們有3個(gè)tags,這個(gè)值將會(huì)被用作versioncode.
但是,我們不會(huì)為每一個(gè)中間版本創(chuàng)建一個(gè)tag,因此對于dev build,我們可以使用head提交的時(shí)間戳。
Groovy的方式使用git
要使用git,我建議使用一個(gè)grgit庫,創(chuàng)建具有以下內(nèi)容的腳本:
buildscript{
repositories{
jcenter()
}
dependencies{
classpath 'org.ajoberstar:grgit:1.5.0'
}
}
import org.ajoberstar: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")
}
把這些應(yīng)用到你自己的build.gradle文件中:
apply plugin: 'com.android.application'
apply from: "$project.rootDir/tools/script-git-version-gradle"
檢查一下version name和code是否生成正確,使用./gradlew printVersion命令,輸出如下:
Version Name: 1.0-2-gdca226a
Version Code: 2
Version Code Time: 1484407970
最后在你的build.gradle中使用gitVersionName,gitVersionCode和gitVersionCodeTime變量:
productFlavors{
dev{
versionCode gitVersionCodeTime
versionName gitVersionName
}
prod{
versionCode gitVersionCodeTime
versionName gitVersionName
}
}
運(yùn)行程序驗(yàn)證app version
這種方法的優(yōu)點(diǎn):
- 不需要修改build.gradle文件中的versionCode和versionName,可以自動(dòng)生成。
- 可以輕松知道這次構(gòu)建是從哪次提交生成的。