versionCode溢出的问题

简介: android应用的版本主要由versionCode和versionName来决定,android系统是根据versionCode来验证新的apk是否能安装。如果已安装高版本的应用,就无法使用覆盖安装的方式来装旧的包   之前测试那边向我反馈的一个问题是:Android 5.0的机器,新增了多用户功能,如果安装新版本的应用然后删除掉,再装老版本的,理论上应该是可以装的(因为已经卸载过了),但实际仍可能遇到安装失败的情况,告知无法安装。

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是如何处理溢出的?

目录
相关文章
|
4月前
|
人工智能 Java 5G
常见的Java内存溢出情况和实例
常见的Java内存溢出情况和实例
|
3月前
|
前端开发 JavaScript UED
|
4月前
|
JavaScript Unix Java
到了2038年时间戳溢出了怎么办?
我经常自嘲,自己写的程序运行不超过3年,因为大部分项目方就早早跑路了。大多数项目上线后,你跟这个项目就再无瓜葛,关于时间你只需要保证时区正确就不会有太大问题,哈哈。 但是今天我想认真对待时间这个问题,作为一个库作者或基础软件作者,就需要考虑下游项目万一因为你处理时间不当而造成困扰,影响范围就比较广了。
到了2038年时间戳溢出了怎么办?
|
4月前
今天来谈谈内容溢出和文字溢出的问题
今天来谈谈内容溢出和文字溢出的问题
|
6月前
|
存储 Java 程序员
【内存泄漏与溢出】
【内存泄漏与溢出】
|
7月前
|
存储 编译器 C++
栈又溢出了
栈又溢出了
|
9月前
|
编译器
整数溢出机制 C
整数溢出机制 C
221 0
|
Java 调度
【设计一个刚好在一秒堆溢出的程序】
【设计一个刚好在一秒堆溢出的程序】
【设计一个刚好在一秒堆溢出的程序】
|
存储
用补码计算x+y,并判断结果是否溢出问题
浮点数的加减法与是否溢出的判断,是计算机组成原理中的数据存储的一个入门。至于溢出情况,如果01就是正溢出,00,11未溢出,10负溢出。
384 0
用补码计算x+y,并判断结果是否溢出问题
C++二分有关溢出的问题
C++二分有关溢出的问题
58 0
C++二分有关溢出的问题