デバイスの適合性の概要

Android は、スマートフォン、タブレット、テレビなど、さまざまなデバイスで動作するように設計されています。デバイスの幅が広いということは、アプリの潜在的なユーザー層が非常に大きいということです。すべてのデバイスでアプリを成功させるには、機能のばらつきを許容し、さまざまな画面構成に適応する柔軟なユーザー インターフェースを提供する必要があります。

デバイスの互換性を確保するため、Android には動的なアプリ フレームワークが用意されています。このフレームワークでは、構成固有のアプリリソースを静的ファイルで提供できます。たとえば、画面サイズごとに異なる XML レイアウトを提供できます。Android は、現在のデバイス構成に基づいて適切なリソースを読み込みます。アプリのデザインと追加のアプリ リソースを事前に検討することで、さまざまなデバイスでユーザー エクスペリエンスを最適化する単一のアプリケーション パッケージ(APK)を公開できます。

ただし、必要に応じて、アプリの機能要件を指定し、Google Play ストアからアプリをインストールできるデバイスの種類を制御できます。このドキュメントでは、アプリにアクセスできるデバイスを管理する方法と、適切なユーザーにアプリを届けるための準備方法について説明します。

「適合性」とは

Android 開発には、デバイスの互換性とアプリの互換性という 2 種類の互換性があります。

Android はオープンソース プロジェクトであるため、どのハードウェア メーカーでも Android オペレーティング システムを搭載したデバイスを開発できます。ただし、デバイスが「Android 互換」であるのは、Android 実行環境向けに作成されたアプリを正しく実行できる場合のみです。Android 実行環境の正確な詳細は、Android 互換性プログラムで定義されています。互換性があるとみなされるには、各デバイスが互換性テストスイート(CTS)に合格する必要があります。

アプリ デベロッパーは、デバイスが Android 互換かどうかを気にする必要はありません。Android 互換のデバイスにのみ Google Play ストアが含まれているためです。したがって、ユーザーが Google Play ストアからアプリをインストールした場合、そのユーザーは Android 互換デバイスを使用していることになります。

ただし、アプリが、考えられる各デバイス設定に対応しているかどうかを考慮する必要があります。Android はさまざまなデバイス構成で動作するため、一部の機能はすべてのデバイスで利用できるわけではありません。たとえば、一部のデバイスにはコンパス センサーが搭載されていません。アプリのコア機能でコンパス センサーが必要な場合、アプリはその機能を搭載したデバイスにのみ対応します。

アプリを利用できるデバイスを管理する

Android は、アプリがプラットフォーム API を通じて利用できるさまざまな機能をサポートしています。コンパス センサーなどのハードウェア ベースの機能、アプリ ウィジェットなどのソフトウェア ベースの機能、プラットフォームのバージョンに依存する機能などがあります。すべてのデバイスがすべての機能をサポートしているわけではないため、アプリに必要な機能に基づいて、デバイスでのアプリの可用性を制御する必要がある場合があります。

アプリのユーザーベースをできるだけ拡大するには、1 つの 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 12 や Android 13 など、異なるバージョンの Android プラットフォームが搭載されている場合があります。プラットフォームの後継バージョンでは、以前のバージョンで使用できない 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 を使用しているアプリは、将来のバージョンの Android と互換性があります。

ただし、アプリがより新しいプラットフォーム バージョンで追加された 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 では各デバイスに 2 つの特性を定義しています。画面サイズ(画面の物理的なサイズ)と画面密度(画面上のピクセルの物理的な密度、DPI)です。さまざまな構成を簡素化するため、Android では、これらのバリエーションをグループに一般化して、ターゲット設定を容易にしています。

  • 4 つの一般化されたサイズ: 小、標準、大、特大
  • いくつかの一般化された密度: mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)など

デフォルトでは、アプリはすべての画面サイズと密度に対応しています。これは、システムが各画面に必要な UI レイアウトと画像リソースを調整するためです。一般的な画面密度に合わせて最適化されたビットマップ画像を提供する。

可能な限り柔軟なレイアウトを使用して、ユーザー エクスペリエンスを最適化します。縦向きと横向き、大きいウィンドウ サイズと小さいウィンドウ サイズなど、構成が大幅に変更されるレイアウトがある場合は、構成の小さな変更に柔軟に対応できる代替レイアウトを提供することを検討してください。これにより、タブレット、スマートフォン、折りたたみ式デバイスなどのフォーム ファクタでのユーザー エクスペリエンスが向上します。また、マルチウィンドウ モードでウィンドウのサイズが変更された場合にも役立ちます。

さまざまな画面用の代替リソースを作成する方法と、必要に応じてアプリを特定の画面サイズに制限する方法については、画面の互換性の概要と大画面アプリの品質に関するガイドラインをご覧ください。

ビジネス上の理由でアプリの公開を管理する

デバイスの特性に基づいてアプリの提供を制限するだけでなく、ビジネス上または法律上の理由でアプリの提供を制限する必要がある場合もあります。このような状況に対応するため、Google Play ストアでは、Google Play Console でフィルタ オプションを提供しています。これにより、ユーザーの言語 / 地域や携帯通信会社など、技術以外の理由でアプリの提供を制御できます。

技術的な互換性(必要なハードウェア コンポーネントなど)のフィルタリングは、常に APK または AAB ファイルに含まれる情報に基づいて行われます。ただし、技術的な理由以外(地理的な地域など)によるフィルタリングは、常に Google Play Console で処理されます。

その他のリソース:

アプリのリソースの概要
アプリのリソースをアプリコードから分離するための Android アプリの構造化方法に関する情報。特定のデバイス設定用の代替リソースを提供する方法など。
Google Play 上のフィルタ
Google Play ストアでアプリがさまざまなデバイスにインストールされないようにする方法に関する情報。
Android での権限
Android が、アプリが特定の API を使用する際にユーザーの同意を必要とする権限システムを使用して、アプリによる特定の API へのアクセスを制限する方法。