versionCode溢位的問題

2022-03-19 15:34:18 字數 1309 閱讀 7401

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)的包吧 

versionCode溢位的問題

android應用的版本主要由versioncode和versionname來決定,android系統是根據versioncode來驗證新的apk是否能安裝。如果已安裝高版本的應用,就無法使用覆蓋安裝的方式來裝舊的包 之前測試那邊向我反饋的乙個問題是 android 5.0的機器,新增了多使用者功能...

versionCode溢位的問題

android應用的版本主要由versioncode和versionname來決定,android系統是根據versioncode來驗證新的apk是否能安裝。如果已安裝高版本的應用,就無法使用覆蓋安裝的方式來裝舊的包 之前測試那邊向我反饋的乙個問題是 android 5.0的機器,新增了多使用者功能...

解決 Actionbar 溢位選單不顯示的問題

一般的來說在actionbar中在條目過多時會顯示三個豎著的小點的選單,但在實機測試的時候發現並不顯示,上網查詢了之後發現問題所在 如果該機器擁有實體的menu鍵則不在右側顯示溢位選單,而改為按menu來生成。這樣就不利於統一的介面風格。我們可以改變系統探測實體menu鍵的存在與否來改變這個的顯示。...