versionCode溢出的问题
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是如何处理溢出的?
versionCode溢出的问题的更多相关文章
- java head space/ java.lang.OutOfMemoryError: Java heap space内存溢出
上一篇JMX/JConsole调试本地还可以在centos6.5 服务器上进行监控有个问题端口只开放22那么设置的9998端口 你怎么都连不上怎么监控?(如果大神知道还望指点,个人见解) 线上项目出现 ...
- css实现单行,多行文本溢出显示省略号……
1.单行文本溢出显示省略号我们可以直接用text-overflow: ellipsis 实现方法: <style> .div_text{width: 300px; padding:10px ...
- css实现文本溢出显示...
在网页中显示文字内容时,经常会碰到文字内容特别长的情况,那么这个时候为了使网页看起来比较美观和简洁,会对内容进行处理.下面我们就来看一看,如何使用css来对文字溢出部分增加.... 首先来看第一种情况 ...
- 多行文本溢出显示省略号(…) text-overflow: ellipsis
详解text-overflow 语法: text-overflow:clip | ellipsis 默认值:clip 适用于:块级容器元素 继承性:无 动画性:否 计算值:指定值 取值: clip:当 ...
- 关于css清除浮动,解决内容溢出的问题
以前在布局的时候总会遇到这样的问题,比如我想让整体的内容居中,所以会这样写, .main-content{ width:960px:height:300px;margin:0px auto; } 然后 ...
- Java 内存区域与内存溢出
内存区域 Java 虚拟机在执行 Java 程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java 虚拟机规范将 JVM 所管理的内存分为以下几个运行时数据区:程序计数器.Java 虚拟机 ...
- jvm内存溢出分析
概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...
- css单行文本与多行溢出文本的省略号问题
在文字布局和代码编写过程中遇到文本溢出是常有的事,下面总结一下对于单行文本溢出和多行文本溢出省略号的处理. 一.单行文本省略号 <p class="text1"> 这是 ...
- arcgis engine 中出现的内存堆栈溢出问题。
两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...
随机推荐
- 如何在CI中写工具类,在哪个目录写
在Libraries目录写工具类,可以参考项目中七牛的集成写法 而Helps目录写的是辅助函数(公共函数)这一类的
- ASP.NET OAuth、jwt、OpenID Connect
ASP.NET OAuth.jwt.OpenID Connect 上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与J ...
- springBoot事物
1.事物 只是需要一个注解即可 2.事物程序 package com.caojun.springboot; import org.springframework.beans.factory.annot ...
- P2398 GCD SUM
P2398 GCD SUM一开始是憨打表,后来发现打多了,超过代码长度了.缩小之后是30分,和暴力一样.正解是,用f[k]表示gcd为k的一共有多少对.ans=sigma k(1->n) k*f ...
- 单页面vue引入百度统计的使用方法!
最近组长安排着做一个项目,h5的应用下载项目,想着做起来还是比较容易,可是看到提出的需求,我就有点懵逼了!需要对应用的下载进行统计!!!我当时就想着我前端怎么对页面点击按钮就行数据统计啊!我以前的项目 ...
- 服务器IO瓶颈对MySQL性能的影响
[背景] 之前我们碰到一些MySQL的性能问题,比如服务器日志备份时可能会导致慢查询增多,一句简单的select或insert语句可能执行几秒,IO负载较高的服务器更容易出现并发线程数升高,CPU上升 ...
- 利用在线HTTP接口测试工具ApiPost,模拟移动端请求API接口
我们做开发一般都是在PC端,然而我们很多时候需要模拟移动端进行接口请求. 比如,当一个API需要根据用户不同的终端来返回不同的数据时,就需要一个工具来模拟不同的终端了. 利用接口测试工具ApiPost ...
- 分类器评估方法:ROC曲线
注:本文是人工智能研究网的学习笔记 ROC是什么 二元分类器(binary classifier)的分类结果 ROC空间 最好的预测模型在左上角,代表100%的灵敏度和0%的虚警率,被称为完美分类器. ...
- FHQ Treap及其可持久化与朝鲜树式重构
FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...
- Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵
E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...