[轉(zhuǎn)]如何選擇 compileSdkVersion, minSdkVersion 和 targetSdkVersion

英文原文:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion
作者:Ian Lake锋喜,Google Android 推廣工程師亏镰;翻譯:韓國愷门怪。

1452360350129590.png

當(dāng)你發(fā)布一個應(yīng)用之后移迫,(取決于具體的發(fā)布時間)可能沒過幾個月 Android 系統(tǒng)就發(fā)布了一個新版本憔购。這對你的應(yīng)用意味著什么薯蝎,所有東西都不能用了?

別擔(dān)心忱叭,向前兼容是 Android 非常關(guān)注的事情。用戶在升級到新版 Android 的時候今艺,用以前版本的 SDK 構(gòu)建的現(xiàn)有應(yīng)用應(yīng)該不會出問題韵丑。這就是 compileSdkVersion, minSdkVersiontargetSdkVersion 的作用:他們分別控制可以使用哪些 API ,要求的 API 級別是什么洼滚,以及應(yīng)用的兼容模式埂息。

一、compileSdkVersion

compileSdkVersion 告訴 Gradle 用哪個 Android SDK 版本編譯你的應(yīng)用。使用任何新添加的 API 就需要使用對應(yīng) Level 的 Android SDK千康。

需要強(qiáng)調(diào)的是修改 compileSdkVersion 不會改變運(yùn)行時的行為享幽。當(dāng)你修改了 compileSdkVersion 的時候,可能會出現(xiàn)新的編譯警告拾弃、編譯錯誤值桩,但新的 compileSdkVersion 不會被包含到 APK 中:它純粹只是在編譯的時候使用。(你真的應(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 (大版本號要一致?欢妗)。通常跟畅,新版的 Support Library 隨著新的系統(tǒng)版本而發(fā)布咽筋,它為系統(tǒng)新增加的 API 和新特性提供兼容性支持。

二徊件、minSdkVersion

如果 compileSdkVersion 設(shè)置為可用的最新 API奸攻,那么 minSdkVersion 則是應(yīng)用可以運(yùn)行的最低要求。minSdkVersion 是 Google Play 商店用來判斷用戶設(shè)備是否可以安裝某個應(yīng)用的標(biāo)志之一庇忌。

在開發(fā)時 minSdkVersion 也起到一個重要角色:lint 默認(rèn)會在項目中運(yùn)行舞箍,它在你使用了高于 minSdkVersion 的 API 時會警告你,幫你避免調(diào)用不存在的 API 的運(yùn)行時問題皆疹。如果只在較高版本的系統(tǒng)上才使用某些 API疏橄,通常使用運(yùn)行時檢查系統(tǒng)版本的方式解決。

請記住略就,你所使用的庫捎迫,如 Support LibraryGoogle Play services,可能有他們自己的 minSdkVersion 表牢。你的應(yīng)用設(shè)置的 minSdkVersion 必需大于等于這些庫的 minSdkVersion 窄绒。例如有三個庫,它們的 minSdkVersion 分別是 4, 7 和 9 崔兴,那么你的 minSdkVersion 必需至少是 9 才能使用它們彰导。在少數(shù)情況下蛔翅,你仍然想用一個比你應(yīng)用的 minSdkVersion 還高的庫(處理所有的邊緣情況,確保它只在較新的平臺上使用)位谋,你可以使用 tools:overrideLibrary 標(biāo)記山析,但請做徹底的測試!

當(dāng)你決定使用什么 minSdkVersion 時候掏父,你應(yīng)該參考當(dāng)前的 Android 分布統(tǒng)計笋轨,它顯示了最近 7 天所有訪問 Google Play 的設(shè)備信息。他們就是你把應(yīng)用發(fā)布到 Google Play 時的潛在用戶赊淑。最終這是一個商業(yè)決策問題爵政,取決于為了支持額外 3% 的設(shè)備,確保最佳體驗而付出的開發(fā)和測試成本是否值得陶缺。

當(dāng)然钾挟,如果某個新的 API 是你整個應(yīng)用的關(guān)鍵,那么確定 minSdkVersion 的值就比較容易了组哩。不過要記得 14 億設(shè)備中的 0.7% 也是個不小的數(shù)字等龙。

三处渣、targetSdkVersion

三個版本號中最有趣的就是 targetSdkVersion 了伶贰。 targetSdkVersion 是 Android 提供向前兼容的主要依據(jù),在應(yīng)用的 targetSdkVersion 沒有更新之前系統(tǒng)不會應(yīng)用最新的行為變化罐栈。這允許你在適應(yīng)新的行為變化之前就可以使用新的 API (因為你已經(jīng)更新了 compileSdkVersion 不是嗎黍衙?)。

targetSdkVersion 所暗示的許多行為變化都記錄在 VERSION_CODES 文檔中了荠诬,但是所有恐怖的細(xì)節(jié)也都列在每次發(fā)布的平臺亮點中了琅翻,在這個 API Level 表中可以方便地找到相應(yīng)的鏈接。
例如柑贞,Android 6.0 變化文檔中談了 target 為 API 23 時會如何把你的應(yīng)用轉(zhuǎn)換到運(yùn)行時權(quán)限模型上方椎,Android 4.4 行為變化闡述了 target 為 API 19 及以上時使用 set()setRepeating() 設(shè)置 alarm 會有怎樣的行為變化。

由于某些行為的變化對用戶是非常明顯的(棄用的 menu 按鈕钧嘶,運(yùn)行時權(quán)限等)棠众,所以將 target 更新為最新的 SDK 是所有應(yīng)用都應(yīng)該優(yōu)先處理的事情。但這不意味著你一定要使用所有新引入的功能有决,也不意味著你可以不做任何測試就盲目地更新 targetSdkVersion 闸拿,請一定在更新 targetSdkVersion 之前做測試!你的用戶會感謝你的书幕。

Gradle 和 SDK 版本

所以設(shè)置正確的 compileSdkVersion, minSdkVersion 和 targetSdkVersion 很重要新荤。如你所想, GradleAndroid Studio 都在構(gòu)建系統(tǒng)中集成了它們台汇。在你的模塊的 build.gradle 文件中(也可以在 Android Studio 的項目結(jié)構(gòu)選項中)設(shè)置:

android {
  compileSdkVersion 23
  buildToolsVersion "23.0.1"

  defaultConfig {
    applicationId "com.example.checkyourtargetsdk"
    minSdkVersion 7
    targetSdkVersion 23
    versionCode 1
    versionName “1.0”
  }
}

編譯時用到的 compileSdkVersion 是和構(gòu)建工具版本一起設(shè)置的 Android 設(shè)置之一苛骨。其他兩個稍有不同篱瞎,他們在構(gòu)建變體(build variant)的那里聲明。defaultConfig 是所有構(gòu)建變體的基礎(chǔ)痒芝,也是設(shè)置這些默認(rèn)值的地方奔缠。你可以想象在一個更復(fù)雜的系統(tǒng)中,應(yīng)用的某些版本可能會有不同的 minSdkVersion 吼野。

minSdkVersion 和 targetSdkVersion 與 compileSdkVersion 的另一個不同之處是它們會被包含進(jìn)最終的 APK 文件中校哎,如果你查看生成的 AndroidManifest.xml 文件,你會看到類似下面這樣的標(biāo)簽:

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

如果你在 manifest 文件中手工設(shè)置瞳步,你會發(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)系應(yīng)該更像這樣:

minSdkVersion (lowest possible) <=     targetSdkVersion == compileSdkVersion (latest SDK)

用較低的 minSdkVersion 來覆蓋最大的人群,用最新的 SDK 設(shè)置 target 和 compile 來獲得最好的外觀和行為测蘑。#BuildBetterApps

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灌危,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碳胳,更是在濱河造成了極大的恐慌勇蝙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挨约,死亡現(xiàn)場離奇詭異味混,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诫惭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門翁锡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夕土,你說我怎么就攤上這事馆衔。” “怎么了隘弊?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵哈踱,是天一觀的道長。 經(jīng)常有香客問我梨熙,道長开镣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任咽扇,我火速辦了婚禮邪财,結(jié)果婚禮上陕壹,老公的妹妹穿的比我還像新娘。我一直安慰自己树埠,他們只是感情好糠馆,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怎憋,像睡著了一般又碌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绊袋,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天毕匀,我揣著相機(jī)與錄音,去河邊找鬼癌别。 笑死皂岔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的展姐。 我是一名探鬼主播躁垛,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼圾笨!你這毒婦竟也來了教馆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墅拭,失蹤者是張志新(化名)和其女友劉穎活玲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谍婉,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年镀钓,在試婚紗的時候發(fā)現(xiàn)自己被綠了穗熬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丁溅,死狀恐怖唤蔗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窟赏,我是刑警寧澤妓柜,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站涯穷,受9級特大地震影響棍掐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拷况,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一作煌、第九天 我趴在偏房一處隱蔽的房頂上張望掘殴。 院中可真熱鬧,春花似錦粟誓、人聲如沸奏寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽病瞳。三九已至,卻和暖如春悲酷,著一層夾襖步出監(jiān)牢的瞬間仍源,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工舔涎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留笼踩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓亡嫌,卻偏偏與公主長得像嚎于,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挟冠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容