Android中的App版号
在Android中,一般应用都是在build时通过写入versionCode
和versionName
来显示标注。
在设备端,我们也可以通过adb shell dumpsys package 包名
的方式来查看对应的信息。
其中,我们可以看到versionCode = 1102120023
,而versionName=v2.12.23.191220.AABBCC.DDDDDD
。
很明显,一般来说versionCode
是给机器看的,是一个递增的数字,而versionName
是给人看的,是一串有实际意义的字符串。
Gradle下的Android Compile
目前大部分的Android都是通过Gradle进行编译打包的,因此针对这一块内容的修改,就相应的转变为Gradle的操作了。一般来说,versionCode
和versionName
的部分会集成在defaultConfig
块中,我们可以在对应module
的build.gradle
文件中看到如下的代码块:
通过这种方式定义的
versionCode
和versionName
最终反映到module
中就是BuildConfig.java
|
|
客制化VersionName & VersionCode
有了以上的认知,针对versionCode
和versionName
我们可以做一些适当的调整,以便输出结合具体项目和编译的版本等关键信息,方便研发确认版本,追溯问题。
针对git
工具,我们提到一个版本时,我们谈论的到底是什么?
- 编译时的最新提交
- 编译的日期
- 编译的分支
除此之外,针对Android应用,可能还会有打包渠道,分发渠道等等信息。
仅仅针对上述的三点,编译时环境,举例说明如何通过gradle
获取到对应的信息。
获取简短commit hash值
|
|
git rev-parse –short HEAD
=> c819b1f
diff with
git log -1
=> commit c819b1fe08e3ed261e834cdab8cf86505aec32d7
获取本地的分支branch名
|
|
获取当下的提交数
可以根据传入的日期获取从那天开始到现在的提交数
这边会根据windows和linux平台做一下区分,因为会用到find以及wc命令做统计
获取当前时间
|
|
客制化
通过以上的4个函数,我们基本拿到了当前环境下所有的编译相关信息了。
- 编译时的当天日期
- 编译时最新的commit hash
- 编译时所在的branch
- 编译启动时与相对日期间的提交计数
我们可以通过简单的组合,来构成我们的versionCode
和versionName
了。
举一个简单的例子,比如说某款App自2017年8月21日启动研发。
- 每年发布一款大版本,N
- 每个月发布一个小版本,M
- 每天可能会发布若干个内测版本,P
对于研发来说,结合app日志需要能还原出当时的编译环境
- 编译时的分支,B
- 编译时的日期,D
- 编译时的最新commit,C
这样,我们可以确定出versionCode
和versionName
的大概样子了
versionCode = NMP
,其中如果每个数字都占三位,那么算法上就是versionCode = N*1000*1000+M*1000+P
相应的,versionName
可能是长这样
versionName = v.NMP.B.D.C
sample code:
|
|