裝置相容性總覽

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 API 建構的應用程式提供相容性,因此您的應用程式與日後的 Android 版本相容,並搭配記錄的 Android API。

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

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。