前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >versionCode溢出的问题

versionCode溢出的问题

作者头像
meteoric
发布2018-11-19 16:29:48
1.2K0
发布2018-11-19 16:29:48
举报
文章被收录于专栏:游戏杂谈

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档