首先看谷歌官方文檔對(duì)targetsdkversion的定義:
如果targetsdkversion設(shè)置為23俩功,那么系統(tǒng)認(rèn)為23版本所有功能的特性您已經(jīng)經(jīng)過(guò)充分的測(cè)試,只要 APK 的 targetSdkVersion 不變羹与,即使這個(gè) APK 安裝在新 Android 系統(tǒng)上账胧,其行為還是保持老的系統(tǒng)上的行為,這樣就保證了系統(tǒng)對(duì)老應(yīng)用的前向兼容性。如果沒(méi)有設(shè)置這個(gè)屬性,應(yīng)用就會(huì)出現(xiàn)問(wèn)題,不確保兼容性衣式;
android: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)要一致KЬ颉)委煤。通常,新版的 Support Library 隨著新的系統(tǒng)版本而發(fā)布修档,它為系統(tǒng)新增加的 API 和新特性提供兼容性支持碧绞。
android:minSdkVersion
一個(gè)用于指定應(yīng)用運(yùn)行所需最低 API 級(jí)別的整數(shù)。 如果系統(tǒng)的 API 級(jí)別低于該屬性中指定的值吱窝,Android 系統(tǒng)將阻止用戶安裝應(yīng)用讥邻。 您應(yīng)該始終聲明該屬性。
注意:如果您不聲明該屬性院峡,系統(tǒng)將假定默認(rèn)值為“1”兴使,這表示您的應(yīng)用兼容所有 Android 版本。 如果您的應(yīng)用并不兼容所有版本(例如照激,它使用 API 級(jí)別 3 中引入的 API)发魄,并且您尚未聲明正確的 minSdkVersion,則當(dāng)應(yīng)用安裝在 API 級(jí)別小于 3 的系統(tǒng)上時(shí)实抡,應(yīng)用將在運(yùn)行時(shí)嘗試訪問(wèn)不可用的 API 時(shí)發(fā)生崩潰欠母。 因此欢策,請(qǐng)務(wù)必在 minSdkVersion 屬性中聲明合適的 API 級(jí)別吆寨。
android:targetSdkVersion
三個(gè)版本號(hào)中最有趣的就是 targetSdkVersion 了。 targetSdkVersion 是 Android 提供向前兼容的主要依據(jù)踩寇,在應(yīng)用的 targetSdkVersion 沒(méi)有更新之前系統(tǒng)不會(huì)應(yīng)用最新的行為變化啄清。這允許你在適應(yīng)新的行為變化之前就可以使用新的 API (因?yàn)槟阋呀?jīng)更新了 compileSdkVersion 不是嗎?)。
由于某些行為的變化對(duì)用戶是非常明顯的辣卒,所以將 target 更新為最新的 SDK 是所有應(yīng)用都應(yīng)該優(yōu)先處理的事情掷贾。但這不意味著你一定要使用所有新引入的功能,也不意味著你可以不做任何測(cè)試就盲目地更新 targetSdkVersion 荣茫,請(qǐng)一定在更新 targetSdkVersion 之前做測(cè)試想帅!你的用戶會(huì)感謝你的。
如果你按照上面示例那樣配置啡莉,你會(huì)發(fā)現(xiàn)這三個(gè)值的關(guān)系是:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
這種直覺(jué)是合理的港准,如果 compileSdkVersion 是你的最大值,minSdkVersion 是最小值咧欣,那么最大值必需至少和最小值一樣大且 target 必需在二者之間浅缸。
理想上,在穩(wěn)定狀態(tài)下三者的關(guān)系應(yīng)該更像這樣:
minSdkVersion (lowest possible) <=
targetSdkVersion == compileSdkVersion (latest SDK)
用較低的 minSdkVersion 來(lái)覆蓋最大的人群魄咕,用最新的 SDK 設(shè)置 target 和 compile 來(lái)獲得最好的外觀和行為衩椒。
感謝谷歌官方文檔的詳細(xì)說(shuō)明~