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