众所周知,android的manifest文件前几行就会有两个属性VersionCode和VersionName。
VersionCode只能输入整形,而VersionName就随意了。
比如下面这样
android:versionCode="6"
android:versionName= "1.6.0"
上面是比较正常的,再看下面这个不正常的。。。。
android:versionCode="6"
android:versionName= "两只老虎,两只老虎"
是的,你没有看错!!!versionName就是这么随意。。。。想怎么写就怎么写。
ok,下面来看一下code和name的区别。这个结论是从别的地方搬过来的
Google为APK定义了两个关于版本属性:VersionCode和VersionName,他们有不同的用途。
- VersionCode:对消费者不可见,仅用于应用市场、程序内部识别版本,判断新旧等用途。
- VersionName:展示给消费者,消费者会通过它认知自己安装的版本
好了,结论很清晰了,我来总结下我自己的体会。
1.不同版本的VersionCode一定要不一样,否则应用市场不会让你通过审核。目测,各种应用市场都是通过VersionCode来判断是否提醒用户更新的。
2.VersionName真的是随意么?其实不然,这是一个方便理解的标识。1.2.0明显比1.1.1的版本要新。而我们普通人也习惯了这种记录版本的方式。
当然 你说 版本120比版本111要新 也ok。但是每次更新版本versionCode都要加1.那么到最后 VersionCode将是一个非常庞大,难以记忆,并且没有什么实际意义的数字。。。。
想象一下,QQ发布最新 版本V1314159261237912636。。。。。好吧。。太可怕了。。。。。
3.在实际的工作中,可能实际的开发人员,打包发布人员,后台管理人员 都是不同的人 甚至可能在不同的地方工作。
ok,问题来了。。。我们作为开发很清楚的知道当前的versionCode是什么,但是对于做运营的哥们,做后台管理的哥们来说,这可就不一定了。
而一般来说 APK上线之前都争分夺秒,大多是昏昏沉沉的加班到凌晨(至于你是不是,我反正是。。。)这就难免上传的哥们手滑了一下,后台运营的哥们在改数据库中的当前版本号时不小心输错了。。。
聚个栗子,最新版本code是 81,目前市场上code是80.我特么手滑了一下 我code写成了71。那么用户就不会收到来自市场的更新提示了。。。
ok如果单纯的去比较versionCode的大小就不太安全了,并且apk一旦传到市场,你再想去改code那就只能再来一版新的。这就会出现相同版本的apk拥有不同的code
好吧,其实我想说的,考虑到运营人员和后台管理人员可能对版本不熟悉,可能会出现误操作。我用的versionName做比较。
当name符合我们的版本号的标准格式时,转为int,挨个比较大小。
当name不符合我们的版本号标准格式时,认为是无效版本号,忽略之。就是这样。。。。。
(好像除了比VerisonCode意义更明显也没什么改变。。。哎。。)
最后友情附上从manifest读取versionName的代码。。
PackageManager pm = context.getPackageManager();
PackageInfo pi;
String versionName = "";
try {
pi = pm.getPackageInfo(context.getPackageName(), 0);
versionName = pi.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}