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 ...
随机推荐
- OpenStack中的Multipath faulty device的成因及解决(part 1)
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 简介: Multip ...
- Redux 和 ngrx 创建更佳的 Angular 2
Redux 和 ngrx 创建更佳的 Angular 2 翻译:使用 Redux 和 ngrx 创建更佳的 Angular 2 原文地址:http://onehungrymind.com/build- ...
- CSS选择器优先级(转)
原文:http://www.cnblogs.com/wangfupeng1988/p/4285251.html 另外,w3c有文章介绍了CSS选择器的特定性,见https://www.w3.org/T ...
- Docker容器与镜像管理
目录 容器管理 运行容器 容器的启停操作 容器导入导出 容器生命周期管理 容器资源限制 内存限制 CPU限制 io 限制 镜像管理 镜像命名规范 镜像基本操作 容器管理 运行容器 1.运行一个容器示例 ...
- CSS3实现原腾讯视频透明边框,多重边框等(关于边框那些不为人知的事情)
1.hsla或rgba实现半透明边框. rgba在rgb的基础上增加了透明通道,就不详细说了,下面重点说下hsla: 说明: HSLA(H,S,L,A) 取值: H:Hue(色调).0(或360)表示 ...
- 多线程学习笔记三之ReentrantLock与AQS实现分析
目录 简介 AQS同步状态 AQS同步队列 ReentrantLock数据结构 公平锁的获取 tryAcquire(arg) addWaiter(Node mode) acquireQueued(fi ...
- AP、路由、中继、桥接、客户端模式之间的区别
AP.路由.中继.桥接.客户端模式之间的区别 在TP-Link迷你无线路由器上一般有AP(接入点)模式.Router(无线路由)模式.Repeater(中继)模式.Bridge(桥接)模式. Clie ...
- android 启动 service 的两种方式,及什么时候用哪个 android 什么时候用bindService
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha android 什么时候用bindService ============ 启动方式有 ...
- android studio 使用总结
网站1:http://stormzhang.com/posts.html 网站2:http://blog.csdn.net/hyr83960944/article/details/38388429
- 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作
马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...