裝置相容性總覽

Android 經過特別設計,可在手機、平板電腦和電視等多種裝置上執行。多款裝置可為應用程式帶來廣大的潛在目標對象。為了讓應用程式能在所有裝置上順利執行,應用程式必須能夠容許功能變化,並提供可適應不同螢幕設定的靈活使用者介面。

為協助提高裝置相容性,Android 提供動態應用程式架構,您可以在靜態檔案中提供設定專用的應用程式資源,例如適用於不同螢幕大小的不同 XML 版面配置。接著,Android 會根據目前的裝置設定載入適當的資源。儘管您的應用程式設計和其他應用程式資源允許,您可以發布單一應用程式套件 (APK),藉此最佳化各種裝置上的使用者體驗。

不過,您可以視需要指定應用程式的功能需求,並控管哪些類型的裝置可從 Google Play 商店安裝應用程式。本文件說明如何控管有權存取應用程式的裝置,以及如何準備應用程式來觸及合適的目標對象。

「相容性」是什麼意思?

Android 開發作業有兩種類型的相容性:裝置相容性應用程式相容性

由於 Android 是一項開放原始碼專案,任何硬體製造商都可以建構搭載 Android 作業系統的裝置。但只有在裝置能正確執行為 Android 執行環境編寫的應用程式時,裝置才算是「與 Android 相容」。Android 執行環境的確切詳細資料由 Android 相容性計畫定義。每部裝置都必須通過 Compatibility Test Suite (CTS) 才算相容。

應用程式開發人員無須擔心裝置是否與 Android 相容,因為只有與 Android 相容的裝置才會提供 Google Play 商店。因此,如果使用者從 Google Play 商店安裝應用程式,他們使用的是與 Android 相容的裝置。

不過,您必須考量應用程式是否與各項潛在裝置設定相容。由於 Android 可在各種裝置設定下執行,因此部分功能僅適用於部分裝置。舉例來說,某些裝置可能不包含指南針感應器。如果應用程式的核心功能需要使用指南針感應器,則應用程式只能與支援該功能的裝置相容。

控管應用程式對裝置的供應情形

Android 支援應用程式可透過平台 API 使用的各種功能。部分功能以硬體為基礎 (例如指南針感應器);有些功能以軟體為基礎 (例如應用程式小工具),有些則取決於平台版本。並非所有裝置都支援所有功能,因此您可能需要根據應用程式的必要功能,控管應用程式對裝置的供應情形。

如要讓應用程式盡可能有最多的使用者數量,請使用單一 APK 或 AAB 盡可能支援多項裝置設定。在多數情況下,您可以在執行階段停用選用功能,以及提供應用程式資源,並提供不同設定的替代選項 (例如適用於不同螢幕大小的版面配置)。如有需要,您可以根據下列裝置特性,透過 Google Play 商店限制應用程式對特定裝置提供:

裝置功能

為了根據裝置功能管理應用程式的可用性,Android 會針對可能無法在所有裝置上使用的任何硬體或軟體功能定義功能 ID。例如,指南針感應器的地圖項目 ID 為 FEATURE_SENSOR_COMPASS,應用程式小工具的功能 ID 則為 FEATURE_APP_WIDGETS

如有必要,您可以使用應用程式資訊清單檔案中的 <uses-feature> 元素宣告功能,在使用者裝置未提供必要功能時,禁止使用者安裝您的應用程式。

舉例來說,如果應用程式無法在沒有指南針感應器的裝置上運作,您可以使用下列資訊清單標記,將指南針感應器宣告為必要條件:

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

Google Play 商店會將應用程式需要的功能與每位使用者裝置上的可用功能進行比較,判斷您的應用程式是否與每部裝置相容。如果裝置不具備應用程式所需的所有功能,使用者就無法安裝應用程式。

不過,如果應用程式的主要功能不「需要」裝置功能,請將 required 屬性設為 "false",並在執行階段檢查裝置功能。如果目前裝置未提供應用程式功能,請優雅降級至對應的應用程式功能。舉例來說,您可以呼叫 hasSystemFeature() 來查詢某項功能是否可用,如下所示:

Kotlin

if (!packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature()
}

Java

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature();
}

如要瞭解可用來透過 Google Play 商店控管應用程式供應情形的所有篩選器,請參閱「Google Play 的篩選功能」說明文件。

平台版本

不同裝置可能會執行不同的 Android 平台版本,例如 Android 12 或 Android 13。每個連續平台版本通常會新增前一個版本未提供的 API。為了指出可以使用的 API 組合,每個平台版本都會指定一個 API 級別。舉例來說,Android 12 是 API 級別 31,Android 13 則是 API 級別 33。

您必須在 build.gradle 檔案中指定 minSdkVersiontargetSdkVersion 的值:

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(30)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

Groovy

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 30

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

如要進一步瞭解 build.gradle 檔案,請參閱「建構設定」。

每個後續版本的 Android 都會提供相容性,支援透過舊版平台版本的 API 建構的應用程式。因此,您的應用程式與日後的 Android 版本相容,同時搭配記錄的 Android API。

不過,如果應用程式使用在較新平台版本中新增的 API,但不需要這些 API 來提供主要功能,請在執行階段檢查 API 級別,並在 API 級別過低時優雅降級對應的功能。在這種情況下,請將 minSdkVersion 設為應用程式主要功能可能適用的最低值,然後將目前系統的版本 SDK_INTBuild.VERSION_CODES 中對應您要檢查的 API 級別的代號常數比較,如以下範例所示:

Kotlin

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop()
}

Java

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop();
}

畫面設定

Android 可在手機、平板電腦和電視等各種大小的裝置上執行。為了根據裝置類型分類裝置,Android 會定義兩種裝置的特性:螢幕尺寸 (螢幕實際大小) 和螢幕密度 (螢幕上的像素實體密度,稱為 DPI)。為了簡化不同的設定,Android 將這些變化版本一般化為群組,以便指定這些變數:

  • 四種概略大小:小、中等、大和特大
  • 幾種概略密度:mdpi (medium)、hdpi (high)、xhdpi (extra High)、xxhdpi (extra-extra High) 和其他

根據預設,您的應用程式與所有螢幕尺寸和密度相容,因為系統會針對各個畫面,視需要調整 UI 版面配置和圖片資源。針對常見螢幕密度提供最佳化的點陣圖圖片。

盡可能使用彈性版面配置,提供最佳使用者體驗。如果版面配置有大規模設定變更 (例如直向和橫向,或大型與小型視窗),請考慮提供能靈活調整設定以靈活調整的替代版面配置。這改善了平板電腦、手機和折疊式裝置等板型規格的使用者體驗。在多視窗模式下變更視窗大小時,這也能派上用場。

如要瞭解如何為不同螢幕建立額外資源,以及如何在必要時將應用程式限制在特定螢幕尺寸,請參閱「螢幕相容性總覽」和「大螢幕應用程式品質指南」。

基於業務原因控管應用程式的供應情形

除了根據裝置特性限制應用程式的供應情形,您可能還需要基於業務或法律因素限制應用程式的可用性。在這種情況下,Google Play 商店在 Play 管理中心提供篩選選項,可讓您基於非技術因素 (例如使用者語言代碼或無線電信業者) 控管應用程式供應情形。

技術相容性的篩選依據,例如必要的硬體元件,一律會以 APK 或 AAB 檔案中的資訊為依據。不過,Google Play 管理中心一律會處理非技術性因素 (例如地理位置的篩選) 作業。

其他資源:

應用程式資源總覽
瞭解 Android 應用程式的結構,以將應用程式資源與應用程式程式碼分開,包括如何為特定裝置設定提供額外資源。
Google Play 篩選器
Google Play 商店會以各種方式禁止您的應用程式安裝在不同裝置上。
Android 中的權限
Android 如何利用必須取得使用者同意,才能讓應用程式使用這類 API 的權限系統,限制應用程式存取特定 API。