画面サポート制限の宣言

アプリは、すべての画面サイズと画面密度に対応できるように設計しておくことを強くお勧めしますが、特定の画面設定をサポート対象外にしたいケースもあります。 そのような場合は、このページで説明するように Android でアプリをリサイズする範囲に制限を設けるか、インストール可能な端末を制限することができます。

アプリでサポートする画面サイズを一定の範囲に制限する前に、複数画面をサポートするためのテクニックをすべて理解し、できる限りそれらを実装するようにしてください。

複数の画面用に別々の APK を公開する

すべての画面設定をサポートする単一の APK を作成するのが合理的でない場合は、Google Play で同じアプリ掲載情報に対して複数の APK を公開することができます。 この機能を利用すると、Google Play ストアで個々の掲載情報を作成することなく、それぞれの画面設定(マニフェスト ファイルに宣言)をサポートする APK を別々に提供することができます。

たとえば、ハンドセット版とタブレット版のアプリを両方公開したいけれども、1 つの APK で両方の画面サイズに対応することが不可能な場合などは、1 つのアプリ掲載情報に対して 2 つの APK を公開できます。 Google Play では、各端末の画面設定に応じて、それぞれの端末の画面サイズに合った APK がダウンロードされます。

詳細については、Creating Multiple APKs for Different Screen Sizesをご確認ください。

最大アスペクト比を宣言する

できるだけ多くの端末に対応するためには、アプリで動的にレイアウトを変更して、コンテンツやコントロールが適切に表示および配置されるようにしなければなりません。

大半のアプリは、ユーザーがマルチウィンドウ モードで実行できるように、リサイズ可能にしておく必要もあります。 ユーザーが分割画面やフリーフォーム モードでリサイズ可能なアクティビティを起動し、その縁や角をドラッグしてアクティビティのサイズを変更できるようにしてください。

マルチウィンドウ モードは、Android 7.0 (API レベル 24)以降で動作するすべてのアプリで利用可能です。このモードでは、アプリはデフォルトでリサイズできます。 アプリ全体もしくは特定のアクティビティに対して、属性 android:resizeableActivity true を明示的に指定することもできます。

アプリやアクティビティをマルチウィンドウ モードで実行したくない場合は、android:resizeableActivity false を指定します。 こうすると、アプリは常にフルスクリーンで表示されます。 この動作をシステムで制御する方法は、Android OS のレベルによって異なります。

  • Android 8.0(API レベル 26)以降を対象とするアプリの場合は、レイアウトに合わせて画面いっぱいに表示するよう調整されます。
  • Android 7.1(API レベル 25)以前を対象とするアプリの場合は、アスペクト比を 16:9(約 1.86)として、ウィンドウに対してアプリ インターフェースのサイズが制限されます。 さらに画面アスペクト比が大きい端末で実行されるアプリの場合は、16:9 のレターボックスにアプリが表示され、画面の残りの部分は未使用になります。

アプリのレイアウトが自在に大きなアスペクト比に対応しない場合は、最大アスペクト比を指定して、すべての Android OS レベルでレターボックスが使用されるように明示的に強制することができます。 推奨されるアスペクト比は 2.4(12:5)です。 指定した値よりも大きなアスペクト比の端末では、アプリはレターボックスで実行されます。 指定する値は Wear OS 端末の場合は 1.0 以上、その他の端末の場合は 1.33 以上にしてください。 これらの制限よりも小さな値を設定すると、上述のように OS のレベルに応じてアプリのアスペクト比が制限されます。

Android 8.0(API レベル 26)以上で最大アスペクト比を指定するには、 android:MaxAspectRatio<activity> タグ内で使用し、最大比を宣言します。 次の例は、最大アスペクト比を 2.4 に宣言する方法を示しています。

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<activity android:maxAspectRatio="2.4">
 ...
</activity>

Android 7.1 以前の場合は、次のように android.max_aspect という名前の <meta-data> 要素を <application> 要素に 追加します。

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<meta-data android:name="android.max_aspect" android:value="2.4" />

最大アスペクト比を指定する際は、android:resizeableActivity false も忘れずに指定してください。 これを指定しないと最大アスペクト比が有効になりません。

最大画面サイズの宣言

複数サイズの画面をサポートするためにアプリを完璧に最適化しなくても、Android では大半のアプリを引き伸ばして、より大きな画面にフィットさせることができます。 そのため、ほとんどの場合は最大画面サイズを宣言する必要はありません。

さまざまなサイズの画面に対応する複数の APK を作成する場合は、APK を小さな画面のみに制限する必要はありません。大きな画面に最適化される APK には、より大きな versionCode があるので、Google Play は必ずその APK を大きな画面の端末に提供するからです。

ただし、Android がアプリを大きな画面にリサイズする方法に満足できない場合は、<supports-screens> マニフェスト タグ内で largestWidthLimitDp 属性を指定して、ある幅を超えるリサイズを無効にすることができます。 このようにすると、Android はレイアウトをリサイズする代わりに、画面互換性モードを有効にします。その結果、アプリがサポートする最大サイズでレイアウトが描画され、画面全体を埋めるようにすべてのピクセルが拡大されます。

アプリをタブレットまたはテレビのみに制限する

ハンドセット端末によるアプリのダウンロードを防ぐには、<supports-screens> マニフェスト要素を使用します。

たとえば、次のように宣言すると、large または xlarge の画面を持つ端末のみがアプリをインストールできます。

<manifest ... >
    <supports-screens android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>
    ...
</manifest>

アプリを特定のサイズと密度のみに制限する

<compatible-screens> マニフェスト要素を使用すると、アプリでサポートする具体的な画面サイズと密度を定義できます。 ただし、指定しないサイズと密度はすべて、アプリで非対応の画面設定とみなされるため、この定義を使用しないことを強くお勧めします。 この要素を使用すると、実際にはアプリでサポートできる多くの端末を、容易にブロックしてしまうことになります。

<compatible-screens> 要素は、1 つ以上の <screen> 要素を含む必要があります。 各 <screen> 要素では、android:screenSize および android:screenDensity 属性を使用して、アプリが対応する画面設定を指定します。 各 <screen> 要素には必ず両方の属性を含めて、個々の画面設定を指定する必要があります。片方の属性がないと、その要素は無効になります(Google Play などの外部サービスによって無視されます)。

以下は、アプリが small および normal の画面サイズ(および画面密度のサブセット)にのみ対応する場合のマニフェスト エントリです。

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" />
        <screen android:screenSize="small" android:screenDensity="mdpi" />
        <screen android:screenSize="small" android:screenDensity="hdpi" />
        <screen android:screenSize="small" android:screenDensity="xhdpi" />
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" />
        <screen android:screenSize="normal" android:screenDensity="mdpi" />
        <screen android:screenSize="normal" android:screenDensity="hdpi" />
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>

ここに明示的に宣言されていないサイズと密度の組み合わせに対しては、アプリのインストールが禁止されます。