天天看點

compileSdkVersion and minSdkVersion and targetSdkVersion 差別compileSdkVersion、minSdkVersion、targetSdkVersion 差別

compileSdkVersion、minSdkVersion、targetSdkVersion 差別

一直以來沒有真正弄懂這三者的差別,查閱很多資料後做一個總結。

compileSdkVersion

compileSdkVersion 是編譯 app 時的 API 版本。意思時你可以使用你指定的版本的 API 特性,包含此版本一下的所有 API 。如果你使用 API 16版本的新特性,但是設定的 compileSdkVersion 為15,那麼你的編譯不會通過。如果你設定 compileSdkVersion 為16,你仍然可以在 API 15版本的裝置上運作,隻要你的app沒有嘗試調用任何 API 16才會有的新特性,比如MediaCodec等。

targetSdkVersion

targetSdkVersion 不會對app的編譯和你使用的 API 産生影響。但是會對你的程式在裝置上的運作狀态有影響,什麼意思?比如:

  • 權限申請,同樣的代碼,同一個App,在裝置版本是 Android 6.0 或者更高的情況下

    targetSdkVersion 23如下所示:

    compileSdkVersion and minSdkVersion and targetSdkVersion 差別compileSdkVersion、minSdkVersion、targetSdkVersion 差別

但是如果我把 targetSdkVersion 設定成22,權限提示不會彈出來。

  • 通知欄顯示,衆所周知在 Android 8.0之後需要設定 channel ,否則通知欄不會顯示出來。是以即使我在 Android 8.0的裝置,但是我 targetSdkVersion 指定小于26,那麼通知欄即使沒有設定 channel ,通知欄也會顯示出來。

是以 targetSdkVersion 的作用是讓你的 App 運作的狀态和其設定的版本保持一緻特性。

minSdkVersion

這個比較簡單,就是目前應用所能支援的最低版本。注意如果 targetSdkVersion 沒有指定,那麼 targetSdkVersion = minSdkVersion。

舉個例子,Android 是在 API 16才引入 MediaCodec ,是以如果在 minSdkVersion 設定15時調用相關方法,Android studio 會報紅,如下:

compileSdkVersion and minSdkVersion and targetSdkVersion 差別compileSdkVersion、minSdkVersion、targetSdkVersion 差別

但是如果設定為16後,As不再報紅。

總結

  • compileSdkVersion 基本上隻和 App 的編譯有關,除非 App 運作在比 compileSdkVersion 指定版本高的 Android 裝置上,并且使用了高版本的新特性 API。
  • targetSdkVersion 和 App 的運作時有關,當 App 運作在23以上版本的 Android 裝置時,如果 targetSdkVersion 低于23,那麼也是不會有運作時的權限申請彈窗出現。

總的來說 compileSdkVersion >= targetSdkVersion >= minSdkVersion。如果你隻是為特定版本 Android 裝置做适配 App 時,在你沒有确認沒有使用到21以上的新特性的話,compileSdkVersion 可以盡可能高,但是 targetSdkVersion 請盡量指定為21。

參考

https://stackoverflow.com/questions/26694108/what-is-the-difference-between-compilesdkversion-and-targetsdkversion

https://stackoverflow.com/questions/24510219/what-is-the-difference-between-min-sdk-version-target-sdk-version-vs-compile-sd