英文原文:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion
轉(zhuǎn)載原文:https://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion-targetsdkversion/
相關(guān)閱讀:
如何選擇compileSdkVersion, minSdkVersion 和 targetSdkVersion
作者:Ian Lake斗这,Google Android 推廣工程師;翻譯:韓國愷玛界。
當你發(fā)布一個應用之后谊迄,(取決于具體的發(fā)布時間)可能沒過幾個月 Android 系統(tǒng)就發(fā)布了一個新版本琼牧。這對你的應用意味著什么墅茉,所有東西都不能用了伟阔?
別擔心,向前兼容是 Android 非常關(guān)注的事情筹淫。用戶在升級到新版 Android 的時候,用以前版本的 SDK 構(gòu)建的現(xiàn)有應用應該不會出問題呢撞。這就是 compileSdkVersion, minSdkVersion 和 targetSdkVersion 的作用:他們分別控制可以使用哪些 API 损姜,要求的 API 級別是什么,以及應用的兼容模式狸相。
compileSdkVersion
compileSdkVersion 告訴 Gradle 用哪個 Android SDK 版本編譯你的應用薛匪。使用任何新添加的 API 就需要使用對應 Level 的 Android SDK。
需要強調(diào)的是修改 compileSdkVersion 不會改變運行時的行為脓鹃。當你修改了 compileSdkVersion 的時候逸尖,可能會出現(xiàn)新的編譯警告、編譯錯誤瘸右,但新的 compileSdkVersion 不會被包含到 APK 中:它純粹只是在編譯的時候使用娇跟。(你真的應該修復這些警告,他們的出現(xiàn)一定是有原因的)
因此我們強烈推薦總是使用最新的 SDK 進行編譯太颤。在現(xiàn)有代碼上使用新的編譯檢查可以獲得很多好處苞俘,避免新棄用的 API ,并且為使用新的 API 做好準備龄章。
注意吃谣,如果使用 Support Library ,那么使用最新發(fā)布的 Support Library 就需要使用最新的 SDK 編譯做裙。例如岗憋,要使用 23.1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 23 (大版本號要一致C)仔戈。通常,新版的 Support Library 隨著新的系統(tǒng)版本而發(fā)布拧廊,它為系統(tǒng)新增加的 API 和新特性提供兼容性支持监徘。
minSdkVersion
如果 compileSdkVersion 設置為可用的最新 API,那么 minSdkVersion 則是應用可以運行的最低要求吧碾。minSdkVersion 是 Google Play 商店用來判斷用戶設備是否可以安裝某個應用的標志之一凰盔。
在開發(fā)時 minSdkVersion 也起到一個重要角色:lint 默認會在項目中運行,它在你使用了高于 minSdkVersion 的 API 時會警告你滤港,幫你避免調(diào)用不存在的 API 的運行時問題廊蜒。如果只在較高版本的系統(tǒng)上才使用某些 API趴拧,通常使用運行時檢查系統(tǒng)版本的方式解決。
請記住山叮,你所使用的庫著榴,如 Support Library 或 Google Play services,可能有他們自己的 minSdkVersion 屁倔。你的應用設置的 minSdkVersion 必需大于等于這些庫的 minSdkVersion 脑又。例如有三個庫,它們的 minSdkVersion 分別是 4, 7 和 9 锐借,那么你的 minSdkVersion 必需至少是 9 才能使用它們问麸。在少數(shù)情況下,你仍然想用一個比你應用的 minSdkVersion 還高的庫(處理所有的邊緣情況钞翔,確保它只在較新的平臺上使用)严卖,你可以使用 tools:overrideLibrary 標記,但請做徹底的測試布轿!
當你決定使用什么 minSdkVersion 時候哮笆,你應該參考當前的 Android 分布統(tǒng)計,它顯示了最近 7 天所有訪問 Google Play 的設備信息汰扭。他們就是你把應用發(fā)布到 Google Play 時的潛在用戶稠肘。最終這是一個商業(yè)決策問題,取決于為了支持額外 3% 的設備萝毛,確保最佳體驗而付出的開發(fā)和測試成本是否值得项阴。
當然,如果某個新的 API 是你整個應用的關(guān)鍵笆包,那么確定 minSdkVersion 的值就比較容易了环揽。不過要記得 14 億設備中的 0.7% 也是個不小的數(shù)字。
targetSdkVersion
三個版本號中最有趣的就是 targetSdkVersion 了庵佣。 targetSdkVersion 是 Android 提供向前兼容的主要依據(jù)薯演,在應用的 targetSdkVersion 沒有更新之前系統(tǒng)不會應用最新的行為變化。這允許你在適應新的行為變化之前就可以使用新的 API (因為你已經(jīng)更新了 compileSdkVersion 不是嗎秧了?)。
targetSdkVersion 所暗示的許多行為變化都記錄在 VERSION_CODES 文檔中了序无,但是所有恐怖的細節(jié)也都列在每次發(fā)布的平臺亮點中了验毡,在這個 API Level 表中可以方便地找到相應的鏈接。
例如帝嗡,Android 6.0 變化文檔中談了 target 為 API 23 時會如何把你的應用轉(zhuǎn)換到運行時權(quán)限模型上晶通,Android 4.4 行為變化闡述了 target 為 API 19 及以上時使用 set() 和 setRepeating() 設置 alarm 會有怎樣的行為變化。
由于某些行為的變化對用戶是非常明顯的(棄用的 menu 按鈕哟玷,運行時權(quán)限等)狮辽,所以將 target 更新為最新的 SDK 是所有應用都應該優(yōu)先處理的事情一也。但這不意味著你一定要使用所有新引入的功能,也不意味著你可以不做任何測試就盲目地更新 targetSdkVersion 喉脖,請一定在更新 targetSdkVersion 之前做測試椰苟!你的用戶會感謝你的。
Gradle 和 SDK 版本
所以設置正確的 compileSdkVersion, minSdkVersion 和 targetSdkVersion 很重要树叽。如你所想舆蝴, Gradle 和 Android Studio 都在構(gòu)建系統(tǒng)中集成了它們。在你的模塊的 build.gradle 文件中(也可以在 Android Studio 的項目結(jié)構(gòu)選項中)設置:
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.example.checkyourtargetsdk"
minSdkVersion 7
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
}
編譯時用到的 compileSdkVersion 是和構(gòu)建工具版本一起設置的 Android 設置之一题诵。其他兩個稍有不同洁仗,他們在構(gòu)建變體(build variant)的那里聲明。defaultConfig 是所有構(gòu)建變體的基礎(chǔ)性锭,也是設置這些默認值的地方赠潦。你可以想象在一個更復雜的系統(tǒng)中,應用的某些版本可能會有不同的 minSdkVersion 草冈。
minSdkVersion 和 targetSdkVersion 與 compileSdkVersion 的另一個不同之處是它們會被包含進最終的 APK 文件中她奥,如果你查看生成的 AndroidManifest.xml 文件,你會看到類似下面這樣的標簽:
<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7" />
如果你在 manifest 文件中手工設置疲陕,你會發(fā)現(xiàn) Gradle 在構(gòu)建時會忽略它們(盡管其它構(gòu)建系統(tǒng)可能會明確依賴它們)方淤。
綜合來看
如果你按照上面示例那樣配置,你會發(fā)現(xiàn)這三個值的關(guān)系是:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
這種直覺是合理的蹄殃,如果 compileSdkVersion 是你的最大值携茂,minSdkVersion 是最小值,那么最大值必需至少和最小值一樣大且 target 必需在二者之間诅岩。
理想上讳苦,在穩(wěn)定狀態(tài)下三者的關(guān)系應該更像這樣:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
用較低的 minSdkVersion 來覆蓋最大的人群,用最新的 SDK 設置 target 和 compile 來獲得最好的外觀和行為吩谦。