有關compileSdkVersion、targetSdkVersion的筆記

在 Module 的 build.gradle 文件中,有三個有關 SdkVersion 的內容需要定義,分別是:compileSdkVersionminSdkVersiontargetSdkVersion

有關於這三個值的含義,可以先閱讀下面這兩篇文章:
【1】Android targetSdkVersion 原理
【2】如何選擇 compileSdkVersion, minSdkVersion 和 targetSdkVersion


這裏寫圖片描述


這裏寫圖片描述
其中,最好理解的就是minSdkVersion,這個簡單的說就是定義了編譯好的的 APK 可以運行的最低的 Android 設備版本號。
根據上圖,還需要注意的是,如果只在較高版本的系統上才使用某些 API,通常使用運行時檢查系統版本的方式解決。 當在某些系統級別低當設備上使用較高版本的系統纔有的 API,則需要在主動在代碼中進行判斷,當前 APK 運行的設備的系統版本是否高於該 API 所對應的系統版本,否則就不能夠直接使用。


這裏寫圖片描述


而對於compileSdkVersiontargetSdkVersion,如果對於其概念還有混淆的話,建議先多度幾遍上述文章,尤其是第一篇文章中有關於那個例子的講解。

這裏在根據那個例子詳細的說明一下(會盡量使用通俗的話語說明,如有錯誤,歡迎指正):

在 Android 4.4 (API 19)以後,AlarmManager 的 set() 和 setRepeat() 這兩個 API 的行爲發生了變化。在 Android 4.4 以前,這兩個 API 設置的都是精確的時間,系統能保證在 API 設置的時間點上喚醒 Alarm。因爲省電原因 Android 4.4 系統實現了 AlarmManager 的對齊喚醒,這兩個 API 設置喚醒的時間,系統都對待成不精確的時間,系統只能保證在你設置的時間點之後某個時間喚醒。

假設一個 APK 設置的 targetSdkVersion 爲18,此時有兩種情況,compileSdkVersion 設置的爲 18 或者 19 ,但是無論是那種情況,當 APK 安裝在 Android 4.4 當設備上時,使用 AlarmManagerset() 或者 setRepeat() 都會是使用的精確的時間點,因爲Android 4.4 的設備的系統(OS),會爲了兼容性,實現兩種方案(通過在代碼中用 if-else 判斷),一個是精確的時間點,另一個對待成不精確的時間,而targetSdkVersion 爲18 使用的就是精確的時間點 的方案,這樣,就能保證在應用中的行爲非常依賴 AlarmManager 在精確的時間喚醒時不會因爲是安裝在 Android 4.4 的設備上而不精確了。
但是,也有人會注意到compileSdkVersion 設置的爲 18 或者 19 的差別,那就是,在編譯時,那就是,當 compileSdkVersion 爲 18 時,會直接使用 精準當時間點 的方案;而設置爲 19 時,會先判斷一下 targetSdkVersion 爲 18 ,然後通過if-else 來使用 精準當時間點 的方案。

而如果是 targetSdkVersion 爲19,則當 APK 安裝在 Android 4.4 以下設備時,會因爲該設備對應當系統 只實現了 精確的時間點 的方案而 “被迫” 在精確的時間點被喚醒,而如果是安裝在 Android 4.4 的設備上,則會 “主動” 對待成不精確的時間,系統只能保證在你設置的時間點之後某個時間喚醒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章