android应用的版本主要由versionCode和versionName来决定,android系统是根据versionCode来验证新的apk是否能安装。如果已安装高版本的应用,就无法使用覆盖安装的方式来装旧的包

 

之前测试那边向我反馈的一个问题是:Android 5.0的机器,新增了多用户功能,如果安装新版本的应用然后删除掉,再装老版本的,理论上应该是可以装的(因为已经卸载过了),但实际仍可能遇到安装失败的情况,告知无法安装。到设置里查找应用后,选择为所有用户删除,才能将应用卸载干净。

还有一个问题就是小米的系统,设备中已安装旧的应用,当使用新的应用进行覆盖安装时,应用的icon可能会显示不正常,重启设备就正常了。

 

回到正题,需要重点来说一下versionCode和versionName的区别:

versionCode 是一个有符号的整型(signed int),其值的范围为-2^31  ~ 2^31 – 1,但零、负值没什么实际意义,所以一般取1 ~ 2147483647之间的值

最大值为Math.pow(2, 31) – 1 = 2147483647

versionName 是一个字符串,通常我们会使用xx.xx或者xx.xx.xx这样进行区分,对外也是拿versionName进行宣传,比如我们发布了2.0版本,新增xx功能,优化xx

 

版本的控制问题,通常的做法是出一个新版本时,versionName与versionCode一起提升,这样能避免很多问题

 

前面提到versionCode是一个数字,在XML中还是以字符串的形式进行配置的,既然打包嘛,如果使用年/月/日/这样的形式来标注versionCode感觉是比较理想的,不过这时候要注意它是一个int(可能会溢出的问题)

今天,我们这边的一个同事打包,versionCode写为:20150205001    (2015/02/05/001)其中001表示02/05那天第一次打包,但这里就遇到一个溢出的出问。的确,配置中写20150205001编译、导出包并不会有任何的错误,但是如果你拿这个包进行覆盖安装时,问题来了。直接提示你:已安装高版本,Why?

明明不是新版本吗,怎么变低版本了呢

 

我们反编译导出的包,发现AndroidManifest.xml中versionCode的值为-1324631479。什么原因呢?

原因就在于 20,150,205,001 转成int时它溢出了,int最大值前面讲过是 2,147,483,647 很明显嘛,既然溢出了它就变成一个负数了,是多少呢? 20150205001>>32 (右移32位) –1324631479

怎么处理呢?简单一点的办法就是”001” 改为 “01”这样就不会溢出了,那有人会说二位不够用啊,我觉得一天下来你应该不会打超过99个同版本(versionName)的包吧 

 

参考资料:

Maximum Length of Android versionName / versionCode (Manifest)

Java中整数溢出的问题:int i=1000000;i*i为何等于-727379968,Java是如何处理溢出的?

最新文章

  1. SQLMAP 中$与#的区别
  2. IIS7.5中神秘的ApplicationPoolIdentity
  3. url中出现井号("#")的问题
  4. 关于kindeditor中点击图片后,滚动条往上顶的bug
  5. DOM(八)使用DOM控制表单
  6. ali2015校园招聘笔试大题
  7. 私有析构函数 Android 代码分析
  8. python终端中退格键,方向键不能使用
  9. Qt msvc Modules
  10. Linux环境下安装配置Node.js
  11. 测试驱动开发实践3————testSave之新增用户
  12. Spring @Conditional注解的使用
  13. PHP的简单跳转提示的实现
  14. Ubuntu出现卡logo、卡住、黑屏无法正常启动、屏幕和键盘背光无法调节等一系列问题?可能是NVIDIA显卡驱动没装好
  15. Python学习(三十四)—— Django之ORM之单表、联表操作
  16. python pyqt4问题记录
  17. Python开发【第三篇】:函数&读写文件
  18. java 关键字transient
  19. 关于Springboot打包错误的问题 | Failed to execute goal org.springframework.boot:spring-boot-maven-plugin
  20. BZOJ.4319.[cerc2008]Suffix reconstruction(后缀数组 构造 贪心)

热门文章

  1. 【LOJ】#2534. 「CQOI2018」异或序列
  2. Codeforces Round #284 (Div. 1) C. Array and Operations 二分图匹配
  3. 使用php mcrypt加密解密
  4. JAVA 图形开发之计算器设计(事件监听机制)
  5. Codeforces.1040E.Network Safety(思路 并查集)
  6. Slickflow.NET 开源工作流引擎高级开发(四) -- 硬核编码:代码式快速构建流程图
  7. 阿里云VPC默认网关问题
  8. CentOS的epel源rpm最新下载地址获取技巧
  9. 关于.net core程序的部署
  10. JS删除String里某个字符的方法