versionCode溢出的问题
android應(yīng)用的版本主要由versionCode和versionName來決定,android系統(tǒng)是根據(jù)versionCode來驗證新的apk是否能安裝。如果已安裝高版本的應(yīng)用,就無法使用覆蓋安裝的方式來裝舊的包
之前測試那邊向我反饋的一個問題是:Android 5.0的機器,新增了多用戶功能,如果安裝新版本的應(yīng)用然后刪除掉,再裝老版本的,理論上應(yīng)該是可以裝的(因為已經(jīng)卸載過了),但實際仍可能遇到安裝失敗的情況,告知無法安裝。到設(shè)置里查找應(yīng)用后,選擇為所有用戶刪除,才能將應(yīng)用卸載干凈。
還有一個問題就是小米的系統(tǒng),設(shè)備中已安裝舊的應(yīng)用,當(dāng)使用新的應(yīng)用進(jìn)行覆蓋安裝時,應(yīng)用的icon可能會顯示不正常,重啟設(shè)備就正常了。
回到正題,需要重點來說一下versionCode和versionName的區(qū)別:
versionCode 是一個有符號的整型(signed int),其值的范圍為-2^31 ~ 2^31 – 1,但零、負(fù)值沒什么實際意義,所以一般取1 ~ 2147483647之間的值
最大值為Math.pow(2, 31) – 1 = 2147483647
versionName 是一個字符串,通常我們會使用xx.xx或者xx.xx.xx這樣進(jìn)行區(qū)分,對外也是拿versionName進(jìn)行宣傳,比如我們發(fā)布了2.0版本,新增xx功能,優(yōu)化xx
版本的控制問題,通常的做法是出一個新版本時,versionName與versionCode一起提升,這樣能避免很多問題
前面提到versionCode是一個數(shù)字,在XML中還是以字符串的形式進(jìn)行配置的,既然打包嘛,如果使用年/月/日/這樣的形式來標(biāo)注versionCode感覺是比較理想的,不過這時候要注意它是一個int(可能會溢出的問題)
今天,我們這邊的一個同事打包,versionCode寫為:20150205001 (2015/02/05/001)其中001表示02/05那天第一次打包,但這里就遇到一個溢出的出問。的確,配置中寫20150205001編譯、導(dǎo)出包并不會有任何的錯誤,但是如果你拿這個包進(jìn)行覆蓋安裝時,問題來了。直接提示你:已安裝高版本,Why?
明明不是新版本嗎,怎么變低版本了呢
我們反編譯導(dǎo)出的包,發(fā)現(xiàn)AndroidManifest.xml中versionCode的值為-1324631479。什么原因呢?
原因就在于 20,150,205,001 轉(zhuǎn)成int時它溢出了,int最大值前面講過是 2,147,483,647 很明顯嘛,既然溢出了它就變成一個負(fù)數(shù)了,是多少呢? 20150205001>>32 (右移32位) –1324631479
怎么處理呢?簡單一點的辦法就是”001” 改為 “01”這樣就不會溢出了,那有人會說二位不夠用啊,我覺得一天下來你應(yīng)該不會打超過99個同版本(versionName)的包吧
參考資料:
Maximum Length of Android versionName / versionCode (Manifest)
Java中整數(shù)溢出的問題:int i=1000000;i*i為何等于-727379968,Java是如何處理溢出的?
總結(jié)
以上是生活随笔為你收集整理的versionCode溢出的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页不能显示PNG验证码的解决办法
- 下一篇: Swift编码总结7