在程序升級(jí)/維護(hù)過(guò)程中,版本控制是一個(gè)很重要的內(nèi)容。
· 用戶需要了解安裝到設(shè)備上的應(yīng)用程序的版本信息,以及了解哪些版本可以進(jìn)行升級(jí)。
· 其它應(yīng)用程序——包括你發(fā)布的其它程序——需要向系統(tǒng)查詢你的應(yīng)用程序的版本,來(lái)確定相互之間的兼容性。
· 你的應(yīng)用程序發(fā)布的服務(wù)可能也需要查詢版本來(lái)顯示給用戶。
Android系統(tǒng)自身不檢查應(yīng)用程序的版本信息,也不會(huì)強(qiáng)制限制升級(jí)或兼容等。相反的,只是用戶或應(yīng)用程序自身對(duì)應(yīng)用程序的版本有限制。
Android系統(tǒng)會(huì)對(duì)程序manifest中描述的系統(tǒng)版本(minSdkVersion特性指定)進(jìn)行檢查。這樣,應(yīng)用程序可以指定兼容的最低系統(tǒng)API等級(jí)。了解更多信息,請(qǐng)參考“指定程序的系統(tǒng)API等級(jí)”。
應(yīng)用程序版本設(shè)定
為了定義應(yīng)用程序的版本信息,你需要在程序的manifest文件中進(jìn)行設(shè)定。這里有兩個(gè)特性,而且往往你需要同時(shí)設(shè)定這兩個(gè)值:
· android:versionCode——整數(shù)值,代表應(yīng)用程序代碼的相對(duì)版本。
整數(shù)值有利于其它程序比較,檢查是升級(jí)還是降級(jí)。你可以把這個(gè)值設(shè)定為任何想設(shè)的值,但是,你必須保證后續(xù)更新版的值要比這個(gè)大。系統(tǒng)不會(huì)強(qiáng)制要求這一行為,但是隨著版本更新值也增加是正常的行為。
一般來(lái)說(shuō),你發(fā)布的第一版程序的versionCode設(shè)定為1,然后每次發(fā)布都會(huì)相應(yīng)增加,不管發(fā)布的內(nèi)容是較大還是較小的。這意味著android:versionCode不像應(yīng)用程序的發(fā)布版本(看下面的android:versionName)那樣顯示給用戶。應(yīng)用程序和發(fā)布的服務(wù)不應(yīng)該顯示這個(gè)版本值給用戶。
· android:versionName——字符串值,代表應(yīng)用程序的版本信息,需要顯示給用戶。
與android:versionCode一樣,系統(tǒng)不會(huì)為了任何內(nèi)部的目的使用這個(gè)值,除了顯示給用戶外。發(fā)布的服務(wù)也需要提取這個(gè)值來(lái)顯示給用戶。
你需要在manifest文件中定義這兩個(gè)版本特性。
下面是一個(gè)manifest的例子,展示了android:versionCode和android:versionName特性的定義。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=" package="com.example.package.name"
android:versionCode="2"
android:versionName="1.1">
<application android:icon="@drawable/icon" android:label="@string/app_name">
...
</application>
</manifest>
在這個(gè)例子中,android:versionCode的值顯示當(dāng)前apk是第二版釋放的代碼,而android:codeName字符串中表述了相應(yīng)的小版本號(hào)。
Android框架提供了一個(gè)API來(lái)查詢應(yīng)用程序的版本信息。為了獲取版本信息,應(yīng)用程序可以使用PackageManager的getPackageInfo(java.lang.String, int)方法。
指定程序的系統(tǒng)API等級(jí)
如果你的程序有最低的Android平臺(tái)限制,或者只是設(shè)計(jì)用于特定范圍的Android平臺(tái),那么,你就可以在應(yīng)用程序的manifest文件中指定API等級(jí)的信息。這樣做是為了確保應(yīng)用程序只能安裝到搭載有兼容的Android系統(tǒng)的設(shè)備上。
指定API等級(jí)限制,在manifest文件中<uses-sdk>元素,并附帶一個(gè)或多個(gè)特性:
· android:minSdkVersion——應(yīng)用程序能運(yùn)行的最低Android系統(tǒng)的版本,通過(guò)平臺(tái)的API等級(jí)標(biāo)識(shí)指定。
· android:targetSdkVersion——指定程序設(shè)計(jì)用于運(yùn)行的API等級(jí)。在一些情況下,允許應(yīng)用程序顯式的指定目標(biāo)運(yùn)行的API等級(jí),而不是僅設(shè)定最低運(yùn)行的API等級(jí)。
· android:maxSdkVersion——應(yīng)用程序能運(yùn)行的最高Android系統(tǒng)的版本,通過(guò)平臺(tái)的API等級(jí)標(biāo)識(shí)指定。重要:使用這個(gè)特性之前,請(qǐng)閱讀<uses-sdk>文檔。
當(dāng)準(zhǔn)備安裝應(yīng)用程序時(shí),系統(tǒng)會(huì)檢查這個(gè)屬性的值并與系統(tǒng)的版本進(jìn)行比較。如果android:minSdkVersion的值大于系統(tǒng)的版本,系統(tǒng)會(huì)放棄當(dāng)前程序的安裝。相似的,系統(tǒng)也只在android:maxSdkVersion與系統(tǒng)的版本兼容時(shí)才執(zhí)行安裝。
如果你沒有在manifest中指定這些特性,那么,系統(tǒng)會(huì)假設(shè)你的程序與所有平臺(tái)的版本兼容,且沒有最高的API等級(jí)限制。