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 會報紅,如下:
但是如果設定為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