裝置相容性總覽

Android 專為在多種不同裝置上執行而設計,例如手機、平板電腦和電視。裝置種類繁多,代表應用程式有龐大的潛在目標對象。如要讓應用程式在所有裝置上都能順利運作,就必須容許功能差異,並提供可配合不同螢幕設定調整的彈性使用者介面。

為確保裝置相容性,Android 提供動態應用程式架構,您可以在靜態檔案中提供特定設定的應用程式資源,例如針對不同螢幕大小提供不同的 XML 版面配置。然後根據目前的裝置設定載入適當的資源。只要預先規劃應用程式設計和額外的應用程式資源,您就能發布單一應用程式套件 (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 檔案中指定 minSdkVersion 和 targetSdkVersion 值:

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(36)
        ...
    }
}

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 36
        ...
    }
}

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

每個後續 Android 版本都與使用舊版平台 API 建構的應用程式相容,因此只要使用 Android API 說明文件中的 API,應用程式就能與未來的 Android 版本相容。

不過,如果應用程式使用較新平台版本新增的 API,但主要功能不需要這些 API,請在執行階段檢查 API 級別,並在 API 級別過低時,優雅降級對應的功能。在這種情況下,請將 minSdkVersion 設為應用程式主要功能可用的最低值,然後將目前系統的版本 SDK_INT 與 Build.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 (中)、hdpi (高)、xhdpi (超高)、xxhdpi (極高) 等

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

盡可能使用彈性版面配置,提供最佳使用者體驗。如果版面配置會因設定大幅變更而調整 (例如直向和橫向,或視窗大小較大與較小),建議提供替代版面配置,以便靈活因應設定的小幅變更。這可改善平板電腦、手機和摺疊式裝置等板型規格的使用者體驗。在多視窗模式下,視窗大小變更時,這項功能也很有幫助。

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

基於業務考量控管應用程式的適用國家/地區

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

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

其他資源:

應用程式資源總覽
說明 Android 應用程式如何區分應用程式資源和應用程式程式碼,包括如何為特定裝置設定提供額外資源。
Google Play 篩選器
Google Play 商店如何防止應用程式安裝在不同裝置上的相關資訊。
Android 中的權限
Android 如何透過權限系統限制應用程式存取特定 API,該系統會要求使用者同意應用程式使用這些 API。