標籤:
裝置的相容性
聲明:
本文由Gordon翻譯
發佈於www.dlvoice.com
歡迎轉載,但請保留此聲明
原文地址:http://developer.android.com/guide/practices/compatibility.html
Android可以運行在不同類型的裝置上,從手機到平板以及電視都可以運行。這些不同的裝置將為開發人員提供大量的潛在使用者。那麼為了能夠讓你的應用在所有的裝置上運行良好,你就需要接受一些特性的多樣性以及提供一個不同螢幕配置的友好的使用者介面。
為了達到這樣的目的,Android提供了一個動態架構。開發人員只需要在此基礎上提供一個包含不同配置應用資源的靜態檔案(比如不同的螢幕大小對應的不同的XML布局)。然後,Android就會根據不同的裝置配置載入相應的資源檔。因此,只要一點有預見性的應用設計加上一些額外的應用資源,你就可以讓你的應用只需要一個應用程式套件(APK)就可以在不同的裝置上運行良好。
當然,若是有必要,你可以指定你的應用效能需求,這樣Google市集就可以控制哪些裝置能夠安裝你的應用。本文將會講解如何讓你的應用控制使用的裝置以及如何保證你的應用被合適的使用者訪問。更多的關於如何讓應用適配不同的裝置請閱讀“Supporting Different Devices”章節。
相容性是什麼意思?
在閱讀Android開發手冊的時候,你在不同的情況下將都會遇到“相容性”這個詞。總得來說,有兩種類型的相容性:裝置的相容性和應用的相容性。
因為Android是一個開源的項目,任何硬體廠商都可以生產一個運行Android作業系統的裝置。然而,只有當裝置可以正確運行基於Android執行環境寫的應用時,我們稱之為“Android相容的”。關於Android執行環境的細節方面是在“Android Compatibility program”中定義的,並且每個裝置都需要通過相容性測試(CTS)才能認為是可相容的。
作為一個應用開發人員,你不需要擔心裝置是否是Android相容的,因為只有Android相容的裝置才能使用Google市集。所以,你可以認為那些從Google市集安裝你的應用的使用者使用的都是Android相容的裝置。
但是,你確實需要確定你的應用是否在各種裝置配置下都是相容的。因為Android在很多不同配置的裝置上運行,不是所有的特性在任何裝置都支援的。例如,一些裝置就可能不支援羅盤感應器,假如你的應用要求一個羅盤感應器,那麼你的應用就只和那些有羅盤感應器的裝置相容。
控制應用對不同裝置的相容性
應用可以通過平台的API來使用Android支援的各種特性,一些特性是和硬體相關的(比如羅盤感應器),一些是和軟體相關的(比如應用的小組件)以及一些是和平台版本相關的。不是所有的裝置都支援所有的特性,所以你需要基於你應用的需求來控制對裝置的相容性。
為了讓你的應用能夠被最大限度地被使用者使用,你需要努力讓你的應用能夠使用一個APK相容儘可能多的裝置。在大多數情況下,你可以通過在運行時禁止可選的特性以及對不同的配置提供可選的應用資源(比如對不同的螢幕大小使用不同的布局)來實現這樣的目的。假如有必要,你可以通過Google市集基於以下的裝置特性來決定是否可以安裝你的應用:
裝置特性
為了能夠根據裝置的特性管理應用的相容性,Android對那些不是在所有裝置上都存在的硬體和軟體特性定義了一個特性ID。比如,羅盤感應器的特性ID就是FEATURE_SENSOR_COMPASS以及應用小組件的特性ID就是FEATURE_APP_WIDGETS。
假如有必要,你可以在應用的Manifest檔案中聲明一個<uses-feature>元素,這樣不支援這些特性的裝置就不能安裝你的應用。
舉例來說,假如你的應用對沒有羅盤感應器的裝置不感興趣,那你就可以像下面這樣在manifest檔案中聲明一個羅盤感應器的需求:
<manifest ... > <uses-feature android:name="android.hardware.sensor.compass" android:required="true" /> ... </manifest>
Google市集會把你的應用的特性需求和使用者裝置的可用特性進行比較,然後來確定你的應用是否符合對應的裝置。若是裝置沒有支援應用所需要的所有特性,則使用者就不能安裝你的應用。
當然,假如你的應用主要功能並不需要這樣的裝置特性,你就應當設定required屬性為false,然後在應用啟動並執行時候再檢查對應的裝置特性。若是裝置不支援這些特性,就需要把相關的應用特性關閉。舉例來說,你可以按如下所示來調用hasSystemFeature()函數查詢裝置是否支援對應的特性:
PackageManager pm = getPackageManager(); if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) { // This device does not have a compass, turn off the compass feature disableCompassFeature(); }
更多的關於使用Google市集來控制應用是否可用可以參考“Filters on Google Play”文檔。
注意:一些系統許可權和裝置特性是相關的。比如,你的應用請求訪問BLUETOOTH(藍芽)的許可權,這隱含的意思就是需求FEATRUE_BLUETOOTH的裝置特性。你可以通過設定<uses-feature>中的required為”false”來防止把不支援藍芽的裝置過濾掉。更多的隱含請求的資訊請閱讀“Permission that Imply Feature Requirements”。
平台版本
不同的裝置可能運行不通的Android平台版本,比如Android4.0,android4.4等。新的版本經常會加入一些之前版本不支援的新的API。為了說明哪些API是可用得,每一個平台版本都指定了一個API level。比如Android1.0是API level 1以及Android4.4是API level 19。
應用可以使用API level來聲明相容的最低版本,可以使用<uses-sdk>標籤中的minSdkVersion屬性。
例如,Calendar Provider API是在Android 4.0中加入的(API level 14)。假如你的應用沒有這些API就不能工作,你就應當聲明應用支援的最小版本是API level 14:
<manifest ... > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> ... </manifest>
minSdkVersion屬性是應用所能相容的最小版本,targetSdkVersion屬性是應用已經最佳化過的最高版本。
所有的Android版本都是向前相容的,所以高版本的應用應當都是支援舊版本的Android API的。
注意:targetSdkVersion並不阻止高於這個版本值的裝置安裝應用,但是這個值也是很重要的,因為它表明了你的應用是否繼承了新的版本的行為變化。假如你沒有更新targetSdkVersion的值到最新的版本,在最新版本上啟動並執行系統就會認為你的應用需要一些先前相容的特性。例如,在Android4.4的行為改變中,通過AlarmManager API建立的鬧鐘預設將不正確,這樣系統就可以分批處理應用鬧鐘從而節省系統功耗。但是假如你的應用目標API level小於9,系統就會保持這個之前的API。
然而,當你的應用使用了最新的平台版本的API,但是主要功能中並沒有使用這個API,你就應當在啟動並執行時候檢查API level,然後對於API level較低的時候進行一些處理。這種情況下,就設定minSdkVersion為主要功能的最低值就可以了,然後在代碼中比較當前系統的版本,SDK_INT就是在Build.VERSION_CODES中定義的表示API level的宏。舉例如下:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { // Running on something older than API level 11, so disable // the drag/drop features that use ClipboardManager APIs disableDragAndDrop(); }
螢幕的配置
Android會在不同螢幕大小的裝置上運行,比如手機,平板和TV。為了通過螢幕的類型來分類裝置,Android為每個裝置定義了兩個屬性:螢幕大小(螢幕的物理大小)以及螢幕密度(螢幕像素的密度,稱為DPI)。為了簡化不同的配置,Android把他們分成了以下幾類:
四個通用的大小值:小,中等,大和超大。
一些通用的密度值:mdpi(中等),hdpi,xhdpi(特別高),xxhdpi(特別特別高)以及別的。
預設來說,你的應用應當和所有的螢幕大小以及密度相容,因為系統會根據螢幕對你的UI布局以及圖片資源進行自適應的調整。然後,你需要根據不同的螢幕配置來加入不同的布局以及圖片,這樣使用者才會有更好的體驗。
更多的關於如何根據不同的螢幕配置來建立可選的資源,以及如何讓你的應用使用不同的螢幕大小,可以參閱“Supporting Different Screen”章節。
商業原因控制應用的相容性
除了裝置屬性導致的應用相容性外,還有可能有商業和法律原因到指定的應用相容性。比如一個顯示倫敦地鐵啟動並執行時刻表的應用,可能對英國之外的地方是沒有用得。這種情況下,Google市集在開發人員介面提供了一些過濾的選項,讓你可以不需要進行技術上的處理就能夠控制應用的有效性,比如使用者的地址或者無線載波。
技術上的相容性的過濾總是基於APK檔案的資訊進行。而非技術性的過濾則是通過Google市集的開發人員控制介面來進行過濾的。
緊接著你可以閱讀下面的內容:
Providing Resources
它是關於Android應用如何把不同的應用資源和應用代碼結合起來以及如何為不同的裝置配置提供不同的資源。
Filters on Google Play
它是關於Google市集使用的不同方法來防止你的應用安裝在不同裝置上。
這些章節你也可能感興趣:
System Permissions
它是關於Android應用如何把不同的應用資源和應用代碼結合起來以及如何為不同的裝置配置提供不同的資源。
Android API Guides –Device Compatibility