compileSdkVersion, minSdkVersion 和 targetSdkVersion,坑爹的Android studio
compileSdkVersion//SDK編譯版本
compileSdkVersion 告訴 Gradle 用哪個 Android SDK 版本編譯你的應用。使用任何新新增的 API 就需要使用對應 Level 的 Android SDK。
需要強調的是修改 compileSdkVersion 不會改變執行時的行為。當你修改了 compileSdkVersion 的時候,可能會出現新的編譯警告、編譯錯誤,但新的 compileSdkVersion 不會被包含到 APK 中:它純粹只是在編譯的時候使用。(你真的應該修復這些警告,他們的出現一定是有原因的)
因此我們強烈推薦總是使用最新的 SDK 進行編譯
注意,如果使用 Support Library ,那麼使用最新發布的 Support Library 就需要使用最新的 SDK 編譯。例如,要使用 23.1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 23 (大版本號要一致!)。通常,新版的 Support Library 隨著新的系統版本而釋出,它為系統新增加的 API 和新特性提供相容性支援。
minSdkVersion//最小的SDK版本
如果 compileSdkVersion 設定為可用的最新 API,那麼 minSdkVersion 則是應用可以執行的最低要求
在開發時 minSdkVersion 也起到一個重要角色:lint 預設會在專案中執行,它在你使用了高於 minSdkVersion 的 API 時會警告你,幫你避免呼叫不存在的 API 的執行時問題。如果只在較高版本的系統上才使用某些 API,通常使用執行時檢查系統版本的方式解決。
請記住,你所使用的庫,如 Support
Library 或 Google
Play services,可能有他們自己的 minSdkVersion 。你的應用設定的 minSdkVersion 必需大於等於這些庫的 minSdkVersion 。例如有三個庫,它們的 minSdkVersion 分別是 4, 7 和 9 ,那麼你的 minSdkVersion 必需至少是 9 才能使用它們。在少數情況下,你仍然想用一個比你應用的 minSdkVersion 還高的庫(處理所有的邊緣情況,確保它只在較新的平臺上使用),你可以使用
當你決定使用什麼 minSdkVersion 時候,你應該,它顯示了最近 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 的專案結構選項中)設定:
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-sdkandroid:targetSdkVersion="23"android:minSdkVersion="7" />如果你在 manifest 檔案中手工設定,你會發現 Gradle 在構建時會忽略它們(儘管其它構建系統可能會明確依賴它們)。
綜合來看
如果你按照上面示例那樣配置,你會發現這三個值的關係是:
minSdkVersion<=targetSdkVersion<=compileSdkVersion
這種直覺是合理的,如果 compileSdkVersion 是你的最大值,minSdkVersion 是最小值,那麼最大值必需至少和最小值一樣大且 target 必需在二者之間。
理想上,在穩定狀態下三者的關係應該更像這樣:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
用較低的 minSdkVersion 來覆蓋最大的人群,用最新的 SDK 設定 target 和 compile 來獲得最好的外觀和行為
參考網址:
https://medium.com/google-developers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd#.ie59crau1
http://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion-targetsdkversion/