uses-sdk配置
uses-sdk用來設置app對android系統的兼容性。它包含三個可選的配置項,分別為android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion,例如:
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="23" android:maxSdkVersion="23" />
配置項的值是一個代表Android API Level的整數。每個API Level對應一個Android系統的版本。API Level和Android版本的最新對應關系如圖所示(截止2015年9月30日)。
android:minSdkVersion配置項含義
此選項表示應用運行時所需要的最低的API版本。也就是說,在低於android:minSdkVersion指定的API Level的Android系統上,應用無法正常運行。Android系統在安裝一個應用時會首先檢查此項配置,如果當前系統的API Level低於這里指定的API Level,則應用無法被安裝到系統中。
如果在AndroidManifest.xml中不指定android:minSdkVersion,則會默認其值為1,也就是說應用能夠被安裝到所有的Android系統中。如果應用中使用了高版本系統中才有的API,會導致應用在低版本系統中運行時崩潰。因此,一般來說所有的應用都應當指定合適的android:minSdkVersion值。即使應用確實能夠兼容到Android 1.0,也應當顯式的指定android:minSdkVersion為1,以明確的告知項目的其他開發者,這是一個需要兼容到Android 1.0的項目。
android:minSdkVersion配置除了在應用安裝時會使用外,在開發階段還會影響到Android lint。如果在代碼中調用了一個高於android:minSdkVersion指定的API Level的API,Android lint會給出一個Lint error。例如android.content.res.Resources的getDrawable(int id, Theme theme)方法是在API Level21后才開始有的,如果指定了android:minSdkVersion低於21,會就給出如下的編譯警告。
android:minSdkVersion配置項選取
通常一個應用在開發前就應當確定該應用能夠兼容的最低的Android版本。顯然一個應用能夠兼容的Android版本越低,就越能夠安裝在更多的Android設備上,獲得最大的用戶群體。但是兼容越低的Android版本,同時也意味着無法利用高版本API帶來的各種便利和效果,雖然Android推出了V4和V7兼容包,將一些高版本才能使用的組件放到兼容包中,但這並不能解決所有兼容性問題。此外,兼容更低版本意味着應用需要適配更多的低端機型,需要有更多的兼容性代碼,應用發布前需要做更多的兼容性測試,這些都會帶來開發成本的提高。
根據Google官方的統計(http://developer.android.com/about/dashboards/index.html),使用Android 2.2版本的設備在全部Android設備中只占0.2%,Android 2.2以下版本的設備占比均低於0.1%。如果應用能夠兼容到Android 2.3(API Level 9),那么可以就可以覆蓋99%以上的Android設備。因此,一般應用設置android:minSdkVersion為9就可以覆蓋絕大多數的用戶了。
此外,一款應用是否能夠在一款機器上運行,除了受應用的最低兼容版本限制外,還受到應用的硬件需求的限制。所有的應用在運行時都會設備的硬件上有一定的要求,對一些特定類型的應用來說,需要較高的硬件性能才可以滿足其正常運行的需要。例如,游戲類型的應用在運行時需要較高的CPU和GPU資源,包含大量圖片的應用需要占用較高的內存。通常來說,運行越低版本的Android設備意味其硬件性能越低,如果硬件性能不能滿足應用的需要,即使軟件上能夠兼容,應用也無法正常運行。
最后一點,所有應用在開發前都應當有目標用戶群體的設定,如果設備的用戶根本不會接觸或使用這種類型的應用,那么即使軟硬件上都能夠兼容,也是沒有意義的。通常來說,持有越低版本的Android設備意味着年齡段越大,或消費能力越低。
一般來說,對大多數類型的應用,能夠兼容到Android 4.0就已經可以了。
android:targetSdkVersion配置項含義
此選項表示應用的目標系統版本,如果在AndroidManifest.xml中不指定android:targetSdkVersion,則會默認其值等於android:minSdkVersion。
對開發者來說,此選項意味着應用在開發階段能夠支持到的目標系統版本,結合minSdkVersion,開發者需要對minSdkVersion到targetSdkVersion之間的所有系統版本上進行細致的測試,保證沒有任何兼容性問題。
對系統來說,應用在運行時,系統會檢查其targetSdkVersion配置,如果當前系統版本低於或等於此項配置,表示應用開發者已經在當前系統上進行了全面的測試,無需做任何兼容性處理。如果當前系統版本高於此項配置,表示此應用開發時沒有在當前系統版本上進行測試(這通常是因為當前系統版本發布時間晚於應用的發布時間),這時系統就會執行一系列的兼容性策略,保證應用能夠在當前系統上正確的運行。這類似於Windows上的”以兼容模式運行這個程序”的功能,只是Android會自動根據當前版本和targetSdkVersion設置來選擇是否使用兼容模式,以及兼容的目標版本。
android:targetSdkVersion配置項選取
targetSdkVersion配置項通常始終保持為當前最新的Android系統版本。如果應用發布后,Android系統版本又有新的更新,則下次應用更新時,應當將targetSdkVersion更新到最新的Android系統版本(當前還需要在新的系統上進行一些兼容性開發和測試)。
android:maxSdkVersion配置項含義
此選項的含義和android:minSdkVersion相反,它表示應用所能運行的最高的API版本。在Android 2.0.1及其以下的Android系統上,安裝一個應用時會先檢查此項配置,如果當前系統的API Level高於這里指定的API Level,則應用無法被安裝到系統中。在Android 2.0.1以上的系統上,安裝應用不會檢查此項配置,也就是說在Android 2.0.1以上的系統上 android:maxSdkVersion會被忽略。
由於目前絕大多數設備都運行在Android2.2以上系統中,這項配置已經沒有任何必要去設置了。
三個配置項的意義和影響范圍小結
這里再對三個配置項的意義和影響范圍進行一下小結。可以看到,這三個選項對主要影響的是Android Lint和應用的安裝,對代碼編譯沒有任何影響,對程序的運行也基本沒有影響。
影響范圍 | minSdkVersion | targetSdkVersion | maxSdkVersion |
---|---|---|---|
Android lint | 如果使用了高於minSdkVersion指定版本的API,則會給出Lint error | 沒有影響 | 沒有影響 |
代碼編譯 | 沒有影響 | 沒有影響 | 沒有影響 |
應用安裝 | 如果當前系統版本低於minSdkVersion指定版本,則拒絕安裝 | 沒有影響 | 對Android 2.0.1及其以下系統,如果當前系統版本高於maxSdkVersion指定版本,則拒絕安裝,對Android 2.0.1以上版本沒有影響 |
程序運行 | 沒有影響 | 如果當前系統版本高於targetSdkVersion指定版本,則應用會自動在兼容模式下運行 | 沒有影響 |
Library工程中三個配置項的影響
在Android Library工程的AndroidManifest.xml文件中也可以配置android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion,不過這三個配置對引用它的工程沒有任何影響,最終生成應用的這三個配置都只和應用本身所在工程配置有關,和它引用的Library工程中的配置無關。例如,有一個Library工程為A,它被一個能編譯成apk的非Library工程B引用,B工程編譯成的apk為B.apk。A工程下AndroidManifest.xml文件中的這三個配置項,無論如何配置,對B工程的編譯,以及B.apk的安裝和運行都沒有任何影響。
雖然Library工程的android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion配置對應用的安裝和運行沒有影響,但並不表示這三個配置沒有作用。他們的作用主要有如下幾點。
1. Library工程在開發時,Android lint同樣會根據此項配置來檢查應用中是否在代碼中使用了高版本的API,如果代碼中使用了高於minSdkVersion指定版本的API,則會給出Lint error。
2. Library工程開發完成后是需要給其他開發者使用的,當一個應用的開發者需要使用一個Library工程的時候,看到Library工程的android:minSdkVersion,android:targetSdkVersion和android:maxSdkVersion這幾項配置,就可以知道此Library工程能夠穩定運行的版本范圍,例如Library工程中android:minSdkVersion設置為11,表示Library工程能夠在在API Level11及其以上的Android版本中運行,這意味着很可能Library工程中使用了API Level11及其以上版本中的API,這時如果引用它的工程對應的android:minSdkVersion設置為9,則雖然編譯后的apk能夠在API Level9對應的Android2.3系統上安裝,但很可能出現應用在調用Library工程的某個接口時出現找不到API的異常。所以,應用開發者必須要保證應用的android:minSdkVersion設置大於等於其所引用的每一個Library工程中的android:minSdkVersion設置。
參考:
1. http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
2. http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#M
3. http://stackoverflow.com/questions/9503705/for-android-library-projects-is-uses-sdk-meaningful-in-manifest