對這幾個概念模模糊糊,看到一篇文章就記錄下來。html
當你發佈一個應用以後,(取決於具體的發佈時間)可能沒過幾個月 Android 系統就發佈了一個新版本。這對你的應用意味着什麼,全部東西都不能用了?別擔憂,向前兼容是 Android 很是關注的事情。用戶在升級到新版 Android 的時候,用之前版本的 SDK 構建的現有應用應該不會出問題。這就是 compileSdkVersion, minSdkVersion 和 targetSdkVersion 的做用:他們分別控制可使用哪些 API ,要求的 API 級別是什麼,以及應用的兼容模式。java
compileSdkVersion告訴Gradle用哪個Android SDK版本編譯你的應用。使用任何新添加的API就須要使用對應Level的Android SDK。須要強調的是修改 compileSdkVersion 不會改變運行時的行爲,當你修改了compileSdkVersion的時候,可能出現新的編譯警告、編譯錯誤,可是新的compileSdkVersion不會被包含到APK中,它只是純粹在編譯的時候使用,所以咱們強烈推薦老是使用最新的SDK進行編譯,在現有代碼上使用新的編譯檢查能夠得到不少好處。避免棄用的API,而且爲新的API作好準備。android
注意若是使用Support Library,那麼使用最新的Support Library就須要使用最新的SDK編譯,例如,要使用23.1.1版本的Support Library , compileSdkVersion就必須至少23(大版本號要一致)。一般,新版的Support Library隨着新的系統版本而發佈。他爲系統新的增長API和新特性提供兼容性支持。api
若是compileSdkVersion設置可用最新的API,那麼minSdkVersion則是應用可用運行的最低要求。minSdkVersion是Google Play商店用來判斷用戶設備是否能夠安裝某個應用的標誌之一。app
在開發時,minSdkVersion也起到一個重要角色:lint默認會在項目中運行,它在你使用了高於minSdkVersion的API時會警告你,幫你避免調用不存在API的運行時問題,若是隻在較高版本的系統上才使用某些API,一般使用運行時檢查系統版本的方式解決。ide
請記住,你所使用的庫,如 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是Android提供向前兼容的主要依據,在應用的targetSdkVersion沒有更新以前系統不會應用最新的行爲變化。(這句話的意思是系統會根據targetSdkVersion的版原本決定是否引入新的api依據特性)這容許你在適應新的行爲變化以前就可使用新的API(由於你已經更新compileSdkVersion不是嗎)。targetSdkVersion 所暗示的許多行爲變化都記錄在 VERSION_CODES 文檔中了,可是全部恐怖的細節也都列在每次發佈的平臺亮點中了,在這個 API Level 表中能夠方便地找到相應的連接。因爲某些行爲的變化對用戶是很是明顯的(棄用的 menu 按鈕,運行時權限等),因此將 target 更新爲最新的 SDK 是全部應用都應該優先處理的事情。但這不意味着你必定要使用全部新引入的功能,也不意味着你能夠不作任何測試就盲目地更新 targetSdkVersion ,請必定在更新 targetSdkVersion 以前作測試!你的用戶會感謝你的。gradle
因此設置正確的 compileSdkVersion, minSdkVersion 和 targetSdkVersion 很重要。如你所想, Gradle 和 Android Studio 都在構建系統中集成了它們。在你的模塊的 build.gradle 文件中(也能夠在 Android Studio 的項目結構選項中)設置:ui
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 文件,你會看到相似下面這樣的標籤:
<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7" />
若是你在 manifest 文件中手工設置,你會發現 Gradle 在構建時會忽略它們(儘管其它構建系統可能會明確依賴它們)。
若是你按照上面示例那樣配置,你會發現這三個值的關係是:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
這種直覺是合理的,若是 compileSdkVersion 是你的最大值,minSdkVersion 是最小值,那麼最大值必需至少和最小值同樣大且 target 必需在兩者之間。理想上,在穩定狀態下三者的關係應該更像這樣:
minSdkVersion(lowest)<= targetSdkVersion == compileSdkVersion(latest)
用較低的 minSdkVersion 來覆蓋最大的人羣,用最新的 SDK 設置 target 和 compile 來得到最好的外觀和行爲。
引用文章地址:
http://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion-targetsdkversion/