本篇文章介紹了Android SDK更新的包裡關於compileSdk、minSdk、targetSdk、buildTools、Tools、Platform-tools的概念
0 前言
在開發中經常發現有AS有更新提示,在之前沒有完全弄明白這些SDK,Tools的概念前都不敢輕易去更新,總擔心更完就編譯出錯,API不能用==情況。所以對這幾個概念進行深度梳理。
1 參考文章
國外一篇很清楚的關於compileSdk、minSdk、targetSdk的文章,建議看完譯文後再重新看一遍原文
原文:
picking-your-compilesdkversion-minsdkversion-targetsdkversion
譯文:
如何選擇 compileSdkVersion, minSdkVersion 和 targetSdkVersion
關於tools的解釋:
Android關於buildToolVersion與CompileSdkVersion的區別
2 compileSdk、minSdk、targetSdk到概念
以下內容摘自譯文
2.1 compileSdkVersion
compileSdkVersion 告訴 Gradle 用哪個 Android SDK 版本編譯你的應用。使用任何新新增的 API 就需要使用對應 Level 的 Android SDK。
需要強調的是 修改 compileSdkVersion 不會改變執行時的行為 。當你修改了 compileSdkVersion 的時候,可能會出現新的編譯警告、編譯錯誤,但新的 compileSdkVersion 不會被包含到 APK 中:它純粹只是在編譯的時候使用。(你真的應該修復這些警告,他們的出現一定是有原因的)
因此我們強烈推薦 總是使用最新的 SDK 進行編譯 。在現有程式碼上使用新的編譯檢查可以獲得很多好處,避免新棄用的 API ,並且為使用新的 API 做好準備。
注意,如果使用 Support Library ,那麼使用最新發布的 Support Library 就需要使用最新的 SDK 編譯。例如,要使用 23.1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 23 (大版本號要一致!)。通常,新版的 Support Library 隨著新的系統版本而釋出,它為系統新增加的 API 和新特性提供相容性支援。
2.2 minSdkVersion
如果 compileSdkVersion 設定為可用的最新 API,那麼 minSdkVersion 則是應用可以執行的最低要求。minSdkVersion 是 Google Play 商店用來判斷使用者裝置是否可以安裝某個應用的標誌之一。
在開發時 minSdkVersion 也起到一個重要角色:lint 預設會在專案中執行,它在你使用了高於 minSdkVersion 的 API 時會警告你,幫你避免呼叫不存在的 API 的執行時問題。如果只在較高版本的系統上才使用某些 API,通常使用執行時檢查系統版本的方式解決。
請記住,你所使用的庫,如 Support Library 或 Google Play services,可能有他們自己的 minSdkVersion 。你的應用設定的 minSdkVersion 必需大於等於這些庫的 minSdkVersion 。例如有三個庫,它們的 minSdkVersion 分別是 4, 7 和 9 ,那麼你的 minSdkVersion 必需至少是 9 才能使用它們。在少數情況下,你仍然想用一個比你應用的 minSdkVersion 還高的庫(處理所有的邊緣情況,確保它只在較新的平臺上使用),你可以使用 tools:overrideLibrary 標記,但請做徹底的測試!
當你決定使用什麼 minSdkVersion 時候,你應該參考當前的 Android 分佈統計,它顯示了最近 7 天所有訪問 Google Play 的裝置資訊。他們就是你把應用釋出到 Google Play 時的潛在使用者。最終這是一個商業決策問題,取決於為了支援額外 3% 的裝置,確保最佳體驗而付出的開發和測試成本是否值得。
當然,如果某個新的 API 是你整個應用的關鍵,那麼確定 minSdkVersion 的值就比較容易了。不過要記得 14 億裝置中的 0.7% 也是個不小的數字。
2.3 targetSdkVersion
三個版本號中最有趣的就是 targetSdkVersion 了。 targetSdkVersion 是 Android 提供向前相容的主要依據,在應用的 targetSdkVersion 沒有更新之前系統不會應用最新的行為變化。這允許你在適應新的行為變化之前就可以使用新的 API (因為你已經更新了 compileSdkVersion 不是嗎?)。
targetSdkVersion 所暗示的許多行為變化都記錄在 VERSION_CODES 文件中了,但是所有恐怖的細節也都列在每次釋出的平臺亮點中了,在這個 API Level 表中可以方便地找到相應的連結。
例如,Android 6.0 變化文件中談了 target 為 API 23 時會如何把你的應用轉換到執行時許可權模型上,Android 4.4 行為變化闡述了 target 為 API 19 及以上時使用 set() 和 setRepeating() 設定 alarm 會有怎樣的行為變化。
由於某些行為的變化對使用者是非常明顯的(棄用的 menu 按鈕,執行時許可權等),所以將 target 更新為最新的 SDK 是所有應用都應該優先處理的事情。但這不意味著你一定要使用所有新引入的功能,也不意味著你可以不做任何測試就盲目地更新 targetSdkVersion ,請一定在更新 targetSdkVersion 之前做測試!你的使用者會感謝你的。
3 buildTools、Tools、Platform-tools
buildTools、Tools、Platform-tools這3個東西其實都是開發工具,即它的版本更新並不會影響執行的APP,只是工具上的升級。
在 build.gradle 中的 buildToolsVersion 版本號一般是API-LEVEL.0.0,其中API-LEVEL要大於等於compileSdkVersion。
在前面的compileSdkVersion解釋中建議選用最新的SDK Version,so,buildToolsVersion也建議選擇最新的版本號。build.gradle中這2個的修改可以讓你體驗最新的API和工具。
至於Tools、Platform-tools這2個東西,直接更新最新吧。Only 工具。
總結
經過上面的深入瞭解後,總結以下:
- 當AS提示Gradle或者Android SDK更新後,大膽更新吧,先全部下載下來
- 更新完後,直接將compileSdkVersion、buildToolsVersion修改為最新的版本號,放心的更改,該完後如果有廢棄API編譯器還會給你提示。
- minSdkVersion 和 targetSdkVersion 要慎重修改。除非核心程式碼中會提高minSdkVersion的版本號,其他的建議執行時判斷版本號。targetSdkVersion的修改要注意程式碼是否適應更新後的版本號,要測試完全,最典型的例子就是23版本的執行時許可權問題的處理。如果targetSdkVersion提升到了23,如果程式碼沒有進行執行時許可權判斷會直接崩潰。
結尾
更多文章關注我的公眾號