如何選擇 compileSdkVersion, minSdkVersion 和 targetSdkVersion

如何選擇 compileSdkVersion, minSdkVersion 和 targetSdkVersion

2016-01-09Guokai HanAndroidNo commentshtml

英文原文:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersionandroid

做者:Ian Lake,Google Android 推廣工程師;翻譯:韓國愷。app

當你發佈一個應用以後,(取決於具體的發佈時間)可能沒過幾個月 Android 系統就發佈了一個新版本。這對你的應用意味着什麼,全部東西都不能用了?ide

別擔憂,向前兼容是 Android 很是關注的事情。用戶在升級到新版 Android 的時候,用之前版本的 SDK 構建的現有應用應該不會出問題。這就是 compileSdkVersionminSdkVersion 和 targetSdkVersion 的做用:他們分別控制可使用哪些 API ,要求的 API 級別是什麼,以及應用的兼容模式。工具

compileSdkVersion

compileSdkVersion 告訴 Gradle 用哪一個 Android SDK 版本編譯你的應用。使用任何新添加的 API 就須要使用對應 Level 的 Android SDK。測試

須要強調的是修改 compileSdkVersion 不會改變運行時的行爲。當你修改了 compileSdkVersion 的時候,可能會出現新的編譯警告、編譯錯誤,但新的 compileSdkVersion 不會被包含到 APK 中:它純粹只是在編譯的時候使用。(你真的應該修復這些警告,他們的出現必定是有緣由的)gradle

所以咱們強烈推薦老是使用最新的 SDK 進行編譯。在現有代碼上使用新的編譯檢查能夠得到不少好處,避免新棄用的 API ,而且爲使用新的 API 作好準備。ui

注意,若是使用 Support Library ,那麼使用最新發布的 Support Library 就須要使用最新的 SDK 編譯。例如,要使用 23.1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 23 (大版本號要一致!)。一般,新版的 Support Library 隨着新的系統版本而發佈,它爲系統新增長的 API 和新特性提供兼容性支持。google

minSdkVersion

若是 compileSdkVersion 設置爲可用的最新 API,那麼 minSdkVersion 則是應用能夠運行的最低要求。minSdkVersion 是 Google Play 商店用來判斷用戶設備是否能夠安裝某個應用的標誌之一。spa

在開發時 minSdkVersion 也起到一個重要角色:lint 默認會在項目中運行,它在你使用了高於 minSdkVersion  的 API 時會警告你,幫你避免調用不存在的 API 的運行時問題。若是隻在較高版本的系統上才使用某些 API,一般使用運行時檢查系統版本的方式解決。

請記住,你所使用的庫,如 Support Library 或 Google Play services,可能有他們本身的 minSdkVersion 。你的應用設置的 minSdkVersion 必需大於等於這些庫的 minSdkVersion 。例若有三個庫,它們的 minSdkVersion 分別是 4, 7 和 9 ,那麼你的 minSdkVersion  必需至少是 9 才能使用它們。在少數狀況下,你仍然想用一個比你應用的 minSdkVersion 還高的庫(處理全部的邊緣狀況,確保它只在較新的平臺上使用),你可使用 tools:overrideLibrary 標記,但請作完全的測試!

當你決定使用什麼 minSdkVersion 時候,你應該參考當前的 Android 分佈統計,它顯示了最近 7 天全部訪問 Google Play 的設備信息。他們就是你把應用發佈到 Google Play 時的潛在用戶。最終這是一個商業決策問題,取決於爲了支持額外 3% 的設備,確保最佳體驗而付出的開發和測試成本是否值得。

固然,若是某個新的 API 是你整個應用的關鍵,那麼肯定 minSdkVersion 的值就比較容易了。不過要記得 14 億設備中的 0.7% 也是個不小的數字。

targetSdkVersion

三個版本號中最有趣的就是 targetSdkVersion 了。 targetSdkVersion 是 Android 提供向前兼容的主要依據,在應用的 targetSdkVersion 沒有更新以前系統不會應用最新的行爲變化。這容許你在適應新的行爲變化以前就可使用新的 API (由於你已經更新了 compileSdkVersion 不是嗎?)。

targetSdkVersion 所暗示的許多行爲變化都記錄在 VERSION_CODES 文檔中了,可是全部恐怖的細節也都列在每次發佈的平臺亮點中了,在這個 API Level 表中能夠方便地找到相應的連接。

例如,Android 6.0 變化文檔中談了 target 爲 API 23 時會如何把你的應用轉換到運行時權限模型上,Android 4.4 行爲變化闡述了 target 爲 API 19 及以上時使用 set() 和 setRepeating() 設置 alarm 會有怎樣的行爲變化。

因爲某些行爲的變化對用戶是很是明顯的(棄用的 menu 按鈕,運行時權限等),因此將 target 更新爲最新的 SDK 是全部應用都應該優先處理的事情。但這不意味着你必定要使用全部新引入的功能,也不意味着你能夠不作任何測試就盲目地更新 targetSdkVersion ,請必定在更新 targetSdkVersion 以前作測試!你的用戶會感謝你的。

Gradle 和 SDK 版本

因此設置正確的 compileSdkVersion, minSdkVersion 和 targetSdkVersion 很重要。如你所想, Gradle 和 Android Studio 都在構建系統中集成了它們。在你的模塊的 build.gradle 文件中(也能夠在 Android Studio 的項目結構選項中)設置:

 

1

2

3

4

5

6

7

8

9

10

11

12

android {

  compileSdkVersion 23

  buildToolsVersion "23.0.1"

 

  defaultConfig {

    applicationId "com.example.checkyourtargetsdk"

    minSdkVersion 7

    targetSdkVersion 23

    versionCode 1

    versionName "1.0"

  }

}

編譯時用到的 compileSdkVersion 是和構建工具版本一塊兒設置的 Android 設置之一。其餘兩個稍有不一樣,他們在構建變體(build variant)的那裏聲明。defaultConfig 是全部構建變體的基礎,也是設置這些默認值的地方。你能夠想象在一個更復雜的系統中,應用的某些版本可能會有不一樣的 minSdkVersion 。

minSdkVersion 和 targetSdkVersion 與 compileSdkVersion 的另外一個不一樣之處是它們會被包含進最終的 APK 文件中,若是你查看生成的 AndroidManifest.xml 文件,你會看到相似下面這樣的標籤:

 

1

<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7" />

若是你在 manifest 文件中手工設置,你會發現 Gradle 在構建時會忽略它們(儘管其它構建系統可能會明確依賴它們)。

綜合來看

若是你按照上面示例那樣配置,你會發現這三個值的關係是:

 

1

minSdkVersion <= targetSdkVersion <= compileSdkVersion

這種直覺是合理的,若是 compileSdkVersion 是你的最大值,minSdkVersion 是最小值,那麼最大值必需至少和最小值同樣大且 target 必需在兩者之間。

理想上,在穩定狀態下三者的關係應該更像這樣:

 

1

2

minSdkVersion (lowest possible) <=

    targetSdkVersion == compileSdkVersion (latest SDK)

用較低的 minSdkVersion 來覆蓋最大的人羣,用最新的 SDK 設置 target 和 compile 來得到最好的外觀和行爲。#BuildBetterApps

相關文章
相關標籤/搜索