Android API適配(compileSdkVersion,minSdkVersion,targetSdkVersion 作用和區(qū)別)

minSdkVersion:應用可以運行的最低要求
compileSdkVersion:控制可以使用哪個版本的api
targetSdkVersion:應用的兼容模式

compileSdkVersion,minSdkVersion,targetSdkVersion詳解

1.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 (大版本號要一致?。?。通常,新版的 Support Library 隨著新的系統(tǒng)版本而發(fā)布,它為系統(tǒng)新增加的 API 和新特性提供兼容性支持

2.minSdkVersion

如果 compileSdkVersion 設(shè)置為可用的最新 API,那么 minSdkVersion 則是應用可以運行的最低要求。minSdkVersion 是 Google Play 商店用來判斷用戶設(shè)備是否可以安裝某個應用的標志之一。
在開發(fā)時 minSdkVersion 也起到一個重要角色:lint 默認會在項目中運行,它在你使用了高于 minSdkVersion 的 API 時會警告你,幫你避免調(diào)用不存在的 API 的運行時問題。如果只在較高版本的系統(tǒng)上才使用某些 API,通常使用運行時檢查系統(tǒng)版本的方式解決。

3.targetSdkVersion

三個屬性中最難懂的就是這個了targetSdkVersion 是 Android 提供向前兼容的主要依據(jù),在應用的 targetSdkVersion 沒有更新之前系統(tǒng)不會應用最新的行為變化。
具體點就是隨著 Android 系統(tǒng)的升級,某個系統(tǒng)的 API 或者模塊的行為可能會發(fā)生改變,但是為了保證老 APK 的行為還是和以前兼容。只要 APK 的 targetSdkVersion 不變,即使這個 APK 安裝在新 Android 系統(tǒng)上,其行為還是保持老的系統(tǒng)上的行為,這樣就保證了系統(tǒng)對老應用的前向兼容性。
舉個栗子
在 Android 4.4 (API 19)以后,AlarmManager 的 set() 和 setRepeat() 這兩個 API 的行為發(fā)生了變化。在 Android 4.4 以前,這兩個 API 設(shè)置的都是精確的時間,系統(tǒng)能保證在 API 設(shè)置的時間點上喚醒 Alarm。因為省電原因 Android 4.4 這兩個 API 設(shè)置的喚醒時間,系統(tǒng)都對待成不精確的時間,系統(tǒng)只能保證在你設(shè)置的時間點之后某個時間喚醒。
這時,雖然 API 沒有任何變化,但是實際上 API 的行為卻發(fā)生了變化,如果老的 APK 中使用了此 API,并且在應用中的行為非常依賴 AlarmManager 在精確的時間喚醒,例如鬧鐘應用。如果 Android 系統(tǒng)不能保證兼容,老的 APK 安裝在新的系統(tǒng)上,就會出現(xiàn)問題。
Android 系統(tǒng)是怎么保證這種兼容性的呢?這時候 targetSdkVersion 就起作用了。APK 在調(diào)用系統(tǒng) AlarmManager 的 set() 或者 setRepeat() 的時候,系統(tǒng)首先會查一下調(diào)用的 APK 的 targetSdkVersion 信息,如果小于 19,就還是按照老的行為,即精確設(shè)置喚醒時間,否者執(zhí)行新的行為。

理想上,在穩(wěn)定狀態(tài)下三者的關(guān)系應該更像這樣:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
用較低的 minSdkVersion 來覆蓋最大的人群,用最新的 SDK 設(shè)置 target 和 compile 來獲得新版本最好的效果。

Android API適配

有些軟件是在低版本SDK開發(fā)的,當Android8.0出來后,沒辦法在Android8.0上運行。這時候我們需要修改compileSdkVersion為最新SDK版本,修改后編譯可能報錯(可能使用了在Android8.0已經(jīng)廢棄的API),這時候需要根據(jù)報錯原因來修改API兼容問題。

最后編輯于
?著作權(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)容