Android compileSdkVersion、minSdkVersion、targetSdkVersion

compileSdkVersion

compileSdkVersion是我們告訴Gradle,我們是用哪一版本的Android Sdk去編譯程序的,可以使用這個版本的API,比如我們使用的是7.0的版本,compileSdkVersion=24,那麼我們對於拍照裁剪圖片等功能的操作,就可以使用FileProvider了。

我們需要注意的是:我們改變compileSdkVersion的版本號,本質上改變不了我們程序的運行,雖然可能會報錯誤❌或者警告⚠️,但compileSdkVersion 只會在編譯期間起作用,因爲環境是compileSdkVersion這個版本的SDK,所以你可以用一些這個版本的API,但是隻是IDE給你的便利性幫助而已,幫助你檢測代碼,避免使用一些棄用的API。就算你用個低版本的compileSdkVersion,你依然可以那麼寫,但是可能會報錯,報警告,但是你強制打包,其實也是沒有問題的。IDE只是個工具,他的環境也只是工具的環境,不代表你應用運行時的表現。

所以希望大家用最新的sdk版本作爲開發環境,compileSdkVersion設置成最新的,這樣我們可以使用到最新SDK的API方法和機制。

如果我們使用了比如V4,V7包,有沒有發現必須和compileSdkVersion的版本相匹配,比如我們compileSdkVersion = 26,那麼V4,v7的版本也要相應的是26.xx.xx,首位的26必須一致,後兩位沒有要求,就是說明編譯所依賴的SDK和依賴包必須是統一版本,不然兩個不兼容,編譯會通不過。同時也是爲了使用該版本的新特性。

minSdkVersion

最好理解的就是minSdkVersion了,就是我們的app能夠運行的最小版本,如果選擇16,那麼就是Android 4.1 以及以上的設備才能運行我們app,如果小於這個版本,那麼抱歉運行不了,我們不支持。這是應用程序支持api的下限。這也是應用商店判斷這個應用是否能運行在設備上的一個依據之一。

在開發中也會根據這個下限去判斷,是否可以用某個api方法,如果是下限之下的那麼就會有警告,避免調用一些在新的版本已經改變或者過時的方法。

當我們引用了第三方的庫,如果某幾個庫的minSdkVersion分別是API5,API10,API16的方法,那麼我們的minSdkVersion最少就是16。

對於minSdkVersion的選擇,我們應該看各個api的佔比,不過因爲基數太大了(十幾億)所以就算是0.7%也是個天文數字,所以我們需要根據自己應用的受衆,以及是否需要適配低版本的需要,一般說來我們適配4.1以上,即minSdkVersion=16,不過還要根據自己的實際情況,去選擇相應的版本號。

targetSdkVersion

targetSdkVersion是這哥三裏面最難以理解的一個了,不過也是最有趣的一個。

targetSdkVersion的含義對於我們來說就有點陌生而熟悉了。

什麼是目標設備SDK版本?
是和minSdkVersion相對應的上限嗎?
如果我運行在比targetSdkVersion高的設備上,會出現什麼?
如果是比targetSdkVersion低的設備呢?
滿滿的疑問

首先targetSdkVersion是android向前兼容的主要方式,怎麼說呢?官方是這樣說的:

除非更新targetSdkVersion,否則不改變應用的行爲。 這允許您在處理行爲更改之前使用新的API(如您更新過的compileSdkVersion)
簡單的說就是你的應用已經針對這個版本的手機,做了充分的兼容性處理和測試性處理,比如 if(Build.VERSION.SDK_INT >= 23) { … } ,這樣針對不同的SDK版本做不同的處理,這就說明我們不能隨便的改變targetSdkVersion得值,我們必須做好充足的兼容性處理和測試處理才行。

在 Android 4.4 (API 19)以後,AlarmManager 的 set() 和 setRepeat() 這兩個 API 的行爲發生了變化。在 Android 4.4 以前,這兩個 API 設置的都是精確的時間,系統能保證在 API 設置的時間點上喚醒 Alarm。因爲省電原因 Android 4.4 系統實現了 AlarmManager 的對齊喚醒,這兩個 API 設置喚醒的時間,系統都對待成不精確的時間,系統只能保證在你設置的時間點之後某個時間喚醒。雖然api的名字沒有改變,但是功能結果已經發生改變,我們設置targetSdkVersion爲16,Android4.4之前,那麼我們在Android4.4之後運行會出現什麼呢?難道就不能用了嗎?不準確了嗎?
當然不是,系統通過targetSdkVersion來保證Android的向前兼容性,在Android4.4之後的設備上,系統會判斷你的targetSdkVersion是否小於19,如果小於的話,那就按照19之前的api方法,如果大於等於19,那麼就按照之後的api方法來走,保證了程序運行的一致性。也就是向前兼容性。

但是還有一個問題:

Android 6.0新增加了動態權限申請,我們的targetSdkVersion是5.0,如果我們運行在Android 6.0的設備上怎麼辦?
因爲我們這個可以向前兼容,向後不行啊,如果你的代碼裏處理了Android 6.0的動態權限處理,那麼可以的,如果沒呢?你想啥呢大哥?更新應用處理唄~~

targetSdkVersion 的大部分更新變化都會記錄在VERSION_CODES,所有的細節也會在每個版本的平臺亮點寫明。

targetSdkVersion保證的是api的一致性。
所以一般minSdkVersion <targetSdkVersion<= compileSdkVersion
不隨意更改targetSdkVersion,更改targetSdkVersion必須做好兼容。

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