裝置相容性總覽

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_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 (超高)、xxhdpi (extra-extra 高) 等等

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

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

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

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

除了根據裝置特性限制應用程式的可用性之外,您可能還需要基於業務或法律因素限制應用程式的可用性。舉例來說,如果應用程式會顯示倫敦地鐵時刻表的賽程表,對英國境外的使用者可能就不太有用。針對這類情況,Google Play 商店在 Play 管理中心提供篩選選項,可讓您基於非技術原因 (例如使用者的語言代碼或無線電信業者),控管應用程式的供應情形。

技術相容性 (例如必要的硬體元件) 的篩選時,一律會以 APK 或 AAB 檔案中包含的資訊為準。但如果是非技術原因 (例如地理位置) 的篩選,一律前往 Google Play 管理中心處理。

其他資源:

應用程式資源總覽
瞭解 Android 應用程式的結構,以便區分應用程式資源與應用程式程式碼,包括如何為特定裝置設定提供額外資源。
Google Play 篩選器
瞭解 Google Play 商店可透過哪些方式禁止在不同裝置上安裝您的應用程式。
Android 中的權限
Android 如何利用需要使用者同意才能使用這些 API 的權限系統,限制應用程式存取特定 API。