02.23 Android學習——uses-sdk標籤詳解

Android學習——uses-sdk標籤詳解

1 前言

我們都知道,Android的版本在不斷的迭代,並且每個版本都加入了不同的新特性。那麼隨著Android的用戶量越來越多,Android的開發人員就必須熟悉Android各個版本的特性並且確保自己的應用能夠正常運行在不同版本中。

由於Android的版本實在太多,開發人員的精力總是有限的,不可能一下子都能兼顧得到所有的版本,這個時候,我們就必須通過一種方式能夠說明當前應用能夠支持的最低Android版本、最高版本,同時系統能夠自動獲取到這些信息並且判斷當前系統版本是否支持該應用,不支持的版本就不給予安裝,避免用戶安裝後才發現不不支持帶來的負體驗。

當然,谷歌這個巨頭肯定也考慮到了這方面的事情,所以就提供了<uses-sdk>標籤,裡面包含了minSdkVersion、targetSdkVersion、maxSdkVersion三個字段,本文會跟大家一起去學習瞭解。/<uses-sdk>

2 什麼是API Level

在講解<uses-sdk>標籤之前,我們一起來了解下API Leval究竟是什麼東西?/<uses-sdk>

按照官方的說法是:API Level是一個整數,是安卓系統中所使用的框架版本

的唯一標識。它並不是我們開發時所使用的SDK版本,也不是指Android的版本,但是它和我們所使用的Android的版本卻存在一定的對應關係。如下表中的Android 2.3 和 2.3.1 所使用的API Level 是 9,而2.3.3 所使用的API Level是10。

下圖是來自谷歌官方文檔的Android系統版本和API Level的對應關係

Android學習——uses-sdk標籤詳解

3 <uses-sdk>標籤說明/<uses-sdk>

<uses-sdk> 標籤是在AndroidMainfest.xml文件中使用的,它的用法是:/<uses-sdk>

1 <uses-sdk>

此時需要注意的是:

過去我們使用Eclipse進行開發的時候,uses-sdk是需要我們直接在AndroidMainfest.xml進行聲明的。

而如今我們使用的是Android Studio,同時我們是在app模塊的build.gradle進行聲明,在編譯的時候將會自動生成到

AndroidMainfest.xml中。大家可以直接打開gs-target-setting/app/build/intermediates/manifests/full/debug/AndroidMainfest.xml進行查看。

如果你直接在AndroidMainfest.xml聲明瞭,那麼編譯的時候將會被忽略,同時會以build.gradle的為準重新生成覆蓋原來的值。

好了,我們都知道uses-sdk標籤裡面總共包含了minSdkVersion、maxSdkVersion、targetSdkVersion三個屬性,另外,當我們使用Android Studio後,我們創建的項目同時也是Gradle項目,裡面會包含有compileSdkVersion和buildToolsVersion屬性,接下來我們就一起來了解下這五個屬性的作用和使用方式。

3.1 minSdkVersion

1> 作用一:指定應用運行時所需要的最小API Level

該屬性主要用於指定該應用運行時所需要的最小API Level。如果我們不去特別指明的話,默認值為1,意思是該應用兼容所有的Android版本。

如果我們設置了應用運行時所需要的最小API Level,並且系統的API Level低於我們設置的minSdkVersion,那麼Android系統將會拒絕該應用的安裝。

下面我們將會舉一個例子進行說明:

設備信息

<table><tbody>品牌紅米Note3 雙網通Android系統版本Android 5.0.2API Level21/<tbody>/<table>

將github中的示例代碼clone下來後,使用Android Studio,修改build.gradle中的minSdkVersion的值為21以上,比如22.然後點擊運行的時候,編譯後的安裝包將無法安裝到設備上,並且會有類似下圖的提示

2> 作用二:Lint將會對項目進行靜態代碼檢測,當項目中使用的API高於minSdkVersion,將會進行警告,避免在低版本中調用了不存在的API導致應用產生Bug。

下面我們也舉一個例子進行說明

例如我們設置了minSdkVersion為1,那麼我們在項目中調用了ActionBar(ActionBar是屬於API Level為11提供的新API),IDE將會利用Lint進行檢測並且提示我們調用了API Level為11才能調用的API

3.2 targetSdkVersion

該屬性用於指定該應用的目標API Level,也是一個整數。如果我們不進行設置,那麼targetSdkVersion默認值將會和minSdkVersion的值一樣。

這個屬性的作用是用於通知系統該應用已經針對這個API Level的Android版本進行過測試,系統不必再使用兼容模式來讓應用程序向前兼容這個目標版本。當然,應用依然能夠在低於targetSdkVersion的系統上正常運行。

如果平臺的API Level高於你的應用程序中的targetSdkVersion屬性指定的值,系統會開啟兼容行為來確保你的應用程序繼續以期望的形式來運行。

根據我們設置的targetSdkVersion 的值,系統會執行很多兼容行為。具體的兼容行為在對應平臺版本的Build.VERSION_CODES(傳送門)中有討論。

一般情況下應該將這個屬性的值設置為最新的API level 值,這樣我們才可以利用新版本系統上的新特性。

下面舉個例子來進行說明:

如果我們將targetSdkVersion的值設置為11甚至更高,當你的應用運行在Android3.0或更高的系統上時,系統會為你的應用使用新的默認主題(Holo主題),並且當運行在大屏幕的設備上時會禁用屏幕兼容模式(screen compatibility mode),因為支持了 API level 11就意味著支持大屏幕。

3.3 maxSdkVersion

該屬性主要用於指定可以運行我們的應用的最高API Level版本。

根據谷歌官方文檔的說明,

在Android1.5, 1.6, 2.0 和2.0.1,在安裝應用或系統升級時,系統會檢查這個值。此時會存在兩種情況:

1> 如果應用設置的maxSdkVersion 值低於系統本身使用的API Level,系統將不會允許安裝該應用

2> 在系統升級後,新系統會重新校驗這個值,如果新系統的API Level高於這個值,新系統會刪除你的應用

在高於2.0.1的系統上,安裝應用時不會再檢驗應用中設置的maxSdkVersion值,在系統升級後也不會重新校驗這個值。此時會存在以下兩種情況:

1> 在Google Play中,將會繼續使用這個屬性進行過濾,不會將該應用展現在API Level高於maxSdkVersion的系統的可安裝應用列表中。

2> 即使我們的應用設置了maxSdkVersion為9(Android 2.3),在Android 4.2的設備上,我們依然可以安裝該應用。

⚠️ 注意

根據官方文檔中的說明, 已經不再推薦使用這個屬性。

3.4 compileSdkVersion

這並不是<uses-sdk>標籤的屬性,而是在們創建的Android Gradle項目中,必需在build.gradle聲明並且賦值的屬性。/<uses-sdk>

compileSdkVersion的作用是指定用於編譯我們應用的API Level對應的Android SDK。如果我們的應用中使用了新添加的API,就必須要使用和新添加的API對應Level的Android SDK。

compileSdkVersion並不會改變應用運行時的行為。當我們修改compileSdkVersion的時候,Android Studio將會出現一些編譯警告、編譯錯誤提示,我們要注意關注並且進行相應的修正。

根據官方文檔的說明,強烈推薦我們使用最新版本的SDK進行編譯,為使用新的特性做好準備。

⚠️ 注意

在ecplise的項目中,compileSdkVersion對應的是projects.properties中的target屬性

例如我們在projects.properties中設置target=android-19,,就是使用sdk中platforms目錄下android-19目錄中的android.jar這個jar包編譯項目。

3.5 buildToolsVersion

這個和compileSdkVersion一樣,並不是<uses-sdk>標籤的屬性,而是在們創建的Android Gradle項目中,必需在build.gradle聲明並且賦值的屬性。/<uses-sdk>

buildToolsVersion的作用是指定用於應用構建的工具版本,例如我們所熟悉的aapt、dx等等。這些工具的一般位於以下目錄:

${ANDROID_SDK_HOME}/build-tools/${buildToolsVersion}

其中 ${ANDROID_SDK_HOME}表示我們的SDK所在的路徑,${buildToolsVersion}表示我們所配置的buildToolsVersion的值

這裡需要注意的是,buildToolsVersion並沒有強制的要求,我們既可以使用新版本的構建工具來構建我們的低版本應用,也可以使用舊版本的構建工具來構建我們的高版本應用。

下面舉個例子進行說明:

1> compileSdkVersion為19,buildToolsVersion為21.1.2,意思是使用高版本的構建工具來構建低版本的應用

2> compileSdkVersion為21,buildToolsVersion為19.1.0,意思是使用低版本的構建工具來構建高版本的應用

⚠️ 注意

在ecplise的項目中,buildToolsVersion對應的是projects.properties中的sdk.buildtools屬性。

例如我們可以在project.properties中設置sdk.buildtools=19.1.0。也可以不設置,不設置的話就是指定最新版本。

4 總結

通過上面瞭解每個屬性的作用後,我們將會發現minSdkVersion、targetSdkVersion、compileSdkVersion三個屬性的關係如下:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

理想狀態下,minSdkVersion、targetSdkVersion、compileSdkVersion三個屬性的關係如下:

minSdkVersion(越低越好) <= targetSdkVersion == compileSdkVersion(最新的API Level)

此時的好處是

1> 用較低的 minSdkVersion 來覆蓋最大的人群

2> 用最新的 SDK 設置 target 和 compile 來獲得最好的外觀和行為,更好的利用新特性


分享到:


相關文章: