日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

versionCode溢出的问题

發(fā)布時間:2023/10/11 80 老码农
生活随笔 收集整理的這篇文章主要介紹了 versionCode溢出的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。