如何選擇 compileSdkVersion, minSdkVersion 和 targetSdkVersion

英文原文:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion

轉(zhuǎn)載原文:https://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion-targetsdkversion/

相關(guān)閱讀:

如何選擇compileSdkVersion, minSdkVersion 和 targetSdkVersion

Android targetSdkVersion 原理

作者:Ian Lake斗这,Google Android 推廣工程師;翻譯:韓國愷玛界。

當你發(fā)布一個應用之后谊迄,(取決于具體的發(fā)布時間)可能沒過幾個月 Android 系統(tǒng)就發(fā)布了一個新版本琼牧。這對你的應用意味著什么墅茉,所有東西都不能用了伟阔?

別擔心,向前兼容是 Android 非常關(guān)注的事情筹淫。用戶在升級到新版 Android 的時候,用以前版本的 SDK 構(gòu)建的現(xiàn)有應用應該不會出問題呢撞。這就是 compileSdkVersion, minSdkVersiontargetSdkVersion 的作用:他們分別控制可以使用哪些 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 LibraryGoogle 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 很重要树叽。如你所想舆蝴, GradleAndroid 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 來獲得最好的外觀和行為吩谦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸳谜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子式廷,更是在濱河造成了極大的恐慌咐扭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滑废,死亡現(xiàn)場離奇詭異蝗肪,居然都是意外死亡,警方通過查閱死者的電腦和手機蠕趁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門薛闪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俺陋,你說我怎么就攤上這事豁延£几荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵诱咏,是天一觀的道長苔可。 經(jīng)常有香客問我,道長胰苏,這世上最難降的妖魔是什么硕蛹? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮硕并,結(jié)果婚禮上法焰,老公的妹妹穿的比我還像新娘。我一直安慰自己倔毙,他們只是感情好埃仪,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陕赃,像睡著了一般卵蛉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上么库,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天傻丝,我揣著相機與錄音,去河邊找鬼诉儒。 笑死葡缰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的忱反。 我是一名探鬼主播泛释,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼温算!你這毒婦竟也來了怜校?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤注竿,失蹤者是張志新(化名)和其女友劉穎茄茁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巩割,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡胰丁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喂分。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡机蔗,死狀恐怖蒲祈,靈堂內(nèi)的尸體忽然破棺而出甘萧,到底是詐尸還是另有隱情,我是刑警寧澤梆掸,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布扬卷,位于F島的核電站,受9級特大地震影響酸钦,放射性物質(zhì)發(fā)生泄漏怪得。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一卑硫、第九天 我趴在偏房一處隱蔽的房頂上張望徒恋。 院中可真熱鬧,春花似錦欢伏、人聲如沸入挣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽径筏。三九已至,卻和暖如春障陶,著一層夾襖步出監(jiān)牢的瞬間滋恬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工抱究, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恢氯,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓媳维,卻偏偏與公主長得像酿雪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侄刽,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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