如何選擇 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 推廣工程師;翻譯:韓國愷。

當(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 (大版本號要一致?。Mǔ?,新版的 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 來獲得最好的外觀和行為。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容