- 原文鏈接:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion
- 作者:Ian Lake,Google Android 推廣工程師
- 翻譯:Guokai Han
??當(dāng)你發(fā)布一個(gè)應(yīng)用之后梁呈,可能沒過幾個(gè)月Android系統(tǒng)就發(fā)布了一個(gè)新版本(取決于具體的發(fā)布時(shí)間)婚度。這對(duì)你的應(yīng)用意味著什么?所有的東西都不能用了官卡?
??別擔(dān)心蝗茁,向前兼容是Android非常關(guān)注的事情。用戶在升級(jí)到新版本Android的時(shí)候寻咒,用以前版本的SDK構(gòu)建的現(xiàn)有應(yīng)用應(yīng)該不會(huì)出什么問題哮翘。這就是compileSdkVersion,minSdkVersion和targetSdkVersion的作用毛秘,他們分別控制可以使用哪些API饭寺,要求的API級(jí)別是什么,以及應(yīng)用的兼容模式。
compileSdkVersion
??compileSdkVersion告訴Gradle用哪個(gè)Android SDK版本編譯你的應(yīng)用佩研。使用任何新添加的API就需要使用對(duì)應(yīng)Level的Android SDK柑肴。
??需要強(qiáng)調(diào)的是,修改compileSdkVersion不會(huì)出改變運(yùn)行時(shí)的行為旬薯。當(dāng)你修改了compileSdkVersion的時(shí)候晰骑,可能會(huì)出現(xiàn)新的編譯警告、編譯錯(cuò)誤绊序,但新的compileSdkVersion不會(huì)被包含到APK中硕舆,它只是純粹在編譯的時(shí)候使用。(你應(yīng)該修復(fù)這些警告骤公,他們的出現(xiàn)一定是有原因的)
??因此抚官,我們強(qiáng)烈推薦總是使用最新的SDK進(jìn)行編譯。在現(xiàn)有的代碼上使用新的編譯檢查可以獲得很多的好處阶捆,避免新啟用的API凌节,并為使用新的API做好準(zhǔn)備。
??注意洒试,如果使用Support Library倍奢,那么使用最新發(fā)布的Support Library就需要使用最新的SDK編譯。例如垒棋,要使用23.1.1版本的Support Library卒煞,compileSdkVersion就必須至少是23(最大的版本號(hào)要一致!)叼架。通常畔裕,新版的Support Library隨著新系統(tǒng)的版本而發(fā)布,它為系統(tǒng)增加的API和新特性提供兼容性支持乖订。
minSdkVersion
??如果compileSdkVersion設(shè)置為可用最新的API扮饶,那么minSdkVersion則是應(yīng)用可以運(yùn)行的最低要求。minSDKVersion是Google Play商店用來判斷用戶設(shè)備是否可以安裝某一個(gè)應(yīng)用的標(biāo)志之一乍构。
??在開發(fā)時(shí)贴届,minSdkVersion也起到一個(gè)重要的角色,lint 默認(rèn)在項(xiàng)目中運(yùn)行蜡吧,它在你使用了高于minSdkVersion的API時(shí)毫蚓,會(huì)警告你,幫你避免調(diào)用不存在的API的運(yùn)行時(shí)問題昔善。如果只在高版本的系統(tǒng)上才使用某些API元潘,通常使用運(yùn)行時(shí)檢查系統(tǒng)版本的方式解決。
??請記住君仆,你所使用的庫翩概,如Support Library或Google Play Services牲距,可能有他們自己的minSdkVersion。你的應(yīng)用設(shè)置的minSdkVersion必須大于等于這些庫的minSdkVersion钥庇。例如有三個(gè)庫牍鞠,它們的minSdkVersion分別是 4, 7 和 9 ,那么你的 minSdkVersion必需至少是9才能使用它們评姨。在少數(shù)情況下难述,你仍然想用一個(gè)比你應(yīng)用的minSdkVersion還高的庫(處理所有的邊緣情況,確保它只在較新的平臺(tái)上使用)吐句,你可以使用 tools:overrideLibrary標(biāo)記胁后,但請做徹底的測試!
??當(dāng)你決定使用什么minSdkVersion時(shí)候嗦枢,你應(yīng)該參考當(dāng)前的Android 分布統(tǒng)計(jì)攀芯,它顯示了最近7天所有訪問Google Play的設(shè)備信息。他們就是你把應(yīng)用發(fā)布到Google Play時(shí)的潛在用戶文虏。最終這是一個(gè)商業(yè)決策問題侣诺,取決于為了支持額外 3% 的設(shè)備,確保最佳體驗(yàn)而付出的開發(fā)和測試成本是否值得氧秘。
??當(dāng)然年鸳,如果某個(gè)新的 API 是你整個(gè)應(yīng)用的關(guān)鍵,那么確定 minSdkVersion的值就比較容易了敏储。不過要記得14億設(shè)備中的 0.7% 也是個(gè)不小的數(shù)字。
targetSdkVersion
??三個(gè)版本號(hào)中最有趣的就是targetSdkVersion了朋鞍。targetSdkVersion是Android 提供向前兼容的主要依據(jù)已添,在應(yīng)用的 targetSdkVersion沒有更新之前系統(tǒng)不會(huì)應(yīng)用最新的行為變化。這允許你在適應(yīng)新的行為變化之前就可以使用新的API(因?yàn)槟阋呀?jīng)更新了 compileSdkVersion不是嗎滥酥?)更舞。
??targetSdkVersion所暗示的許多行為變化都記錄在VERSION_CODES 文檔中了,但是所有恐怖的細(xì)節(jié)也都列在每次發(fā)布的平臺(tái)亮點(diǎn)中了坎吻,在這個(gè)API Level表中可以方便地找到相應(yīng)的鏈接缆蝉。
??例如,Android 6.0變化文檔中談了target為API 23 時(shí)會(huì)如何把你的應(yīng)用轉(zhuǎn)換到運(yùn)行時(shí)權(quán)限模型上瘦真,Android 4.4 行為變化闡述了 target 為 API 19 及以上時(shí)使用 set() 和 setRepeating() 設(shè)置 alarm 會(huì)有怎樣的行為變化刊头。
??由于某些行為的變化對(duì)用戶是非常明顯的(棄用的menu按鈕,運(yùn)行時(shí)權(quán)限等)诸尽,所以將target更新為最新的 SDK 是所有應(yīng)用都應(yīng)該優(yōu)先處理的事情原杂。但這不意味著你一定要使用所有新引入的功能,也不意味著你可以不做任何測試就盲目地更新targetSdkVersion 您机,請一定在更新targetSdkVersion之前做測試穿肄!你的用戶會(huì)感謝你的年局。
Gradle和SDK版本
??所以設(shè)置正確的compileSdkVersion, minSdkVersion和 targetSdkVersion很重要。如你所想咸产,Gradle和Android Studio 都在構(gòu)建系統(tǒng)中集成了它們矢否。在你的模塊的build.gradle文件中(也可以在Android Studio的項(xiàng)目結(jié)構(gòu)選項(xiàng)中)設(shè)置:
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.example.checkyourtargetsdk"
minSdkVersion 7
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
}
??編譯時(shí)用到的compileSdkVersion是和構(gòu)建工具版本一起設(shè)置的 Android 設(shè)置之一。其他兩個(gè)稍有不同脑溢,他們在構(gòu)建變體(build variant)的那里聲明僵朗。defaultConfig是所有構(gòu)建變體的基礎(chǔ),也是設(shè)置這些默認(rèn)值的地方焚志。你可以想象在一個(gè)更復(fù)雜的系統(tǒng)中衣迷,應(yīng)用的某些版本可能會(huì)有不同的minSdkVersion 。
??minSdkVersion和targetSdkVersion與compileSdkVersion 的另一個(gè)不同之處是它們會(huì)被包含進(jìn)最終的APK文件中酱酬,如果你查看生成的AndroidManifest.xml文件壶谒,你會(huì)看到類似下面這樣的標(biāo)簽:
<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7"/>
??如果你在manifest文件中手工設(shè)置,你會(huì)發(fā)現(xiàn)Gradle在構(gòu)建時(shí)會(huì)忽略它們(盡管其它構(gòu)建系統(tǒng)可能會(huì)明確依賴它們)膳沽。
綜合看來
??如果你按照上面示例那樣配置汗菜,你會(huì)發(fā)現(xiàn)這三個(gè)值的關(guān)系是:minSdkVersion <= targetSdkVersion <= compileSdkVersion
??這種直覺是合理的,如果compileSdkVersion是你的最大值挑社,minSdkVersion是最小值陨界,那么最大值必需至少和最小值一樣大且 target 必需在二者之間。
??理想上痛阻,在穩(wěn)定狀態(tài)下三者的關(guān)系應(yīng)該更像這樣: minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
??用較低的minSdkVersion來覆蓋最大的人群菌瘪,用最新的SDK設(shè)置 target和compile來獲得最好的外觀和行為。