編輯:Android資訊
作者:Ian Lake,Google Android 推廣工程師;翻譯:韓國恺。
當你發布一個應用之後,(取決於具體的發布時間)可能沒過幾個月 Android 系統就發布了一個新版本。這對你的應用意味著什麼,所有東西都不能用了?
別擔心,向前兼容是 Android 非常關注的事情。用戶在升級到新版 Android 的時候,用以前版本的 SDK 構建的現有應用應該不會出問題。這就是 compileSdkVersion, minSdkVersion 和 targetSdkVersion 的作用:他們分別控制可以使用哪些 API ,要求的 API 級別是什麼,以及應用的兼容模式。
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 和新特性提供兼容性支持。
如果 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% 也是個不小的數字。
三個版本號中最有趣的就是 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 之前做測試!你的用戶會感謝你的。
所以設置正確的 compileSdkVersion, minSdkVersion 和 targetSdkVersion 很重要。如你所想, Gradle 和 Android Studio 都在構建系統中集成了它們。在你的模塊的 build.gradle 文件中(也可以在 Android Studio 的項目結構選項中)設置:
android { compileSdkVersion 23 buildToolsVersion "23.0.1" defaultConfig { applicationId "com.example.checkyourtargetsdk" minSdkVersion 7 targetSdkVersion 23 versionCode 1 versionName "1.0" } }
編譯時用到的 compileSdkVersion 是和構建工具版本一起設置的 Android 設置之一。其他兩個稍有不同,他們在構建變體(build variant)的那裡聲明。defaultConfig 是所有構建變體的基礎,也是設置這些默認值的地方。你可以想象在一個更復雜的系統中,應用的某些版本可能會有不同的 minSdkVersion 。
minSdkVersion 和 targetSdkVersion 與 compileSdkVersion 的另一個不同之處是它們會被包含進最終的 APK 文件中,如果你查看生成的 AndroidManifest.xml 文件,你會看到類似下面這樣的標簽:
<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7" />
如果你在 manifest 文件中手工設置,你會發現 Gradle 在構建時會忽略它們(盡管其它構建系統可能會明確依賴它們)。
如果你按照上面示例那樣配置,你會發現這三個值的關系是:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
這種直覺是合理的,如果 compileSdkVersion 是你的最大值,minSdkVersion 是最小值,那麼最大值必需至少和最小值一樣大且 target 必需在二者之間。
理想上,在穩定狀態下三者的關系應該更像這樣:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
用較低的 minSdkVersion 來覆蓋最大的人群,用最新的 SDK 設置 target 和 compile 來獲得最好的外觀和行為。#BuildBetterApps
關於本文的內容您可以參與我們 Google+ 帖子上的討論,關注我們的 Android Development Patterns 信息流獲得更多信息。
1、概述 Binder能干什麼?Binder可以提供系統中任何程序都可以訪問的全局服務。這個功能當然是任何系統都應該提供的,下面我們簡單看一下Android的Bi
看到大家提出的關於Android的問題,有一部分可以用EventBus解決,而也有相當多的人推薦使用EventsBus,因為其和GreenDAO出自一家公司,並
第一部分 插件的介紹 Google 在2013年5月的I/O開發者大會推出了基於IntelliJ IDEA java ide上的Android Studio。An
Android Studio是一套面世時間還不長的IDE(即集成開發環境),目前已經免費向谷歌及Android的開發人員發放。Android Studio以Int