画面サポートの制限を宣言する

すべての画面サイズと画面密度に適応できるようにアプリを設計することを強くおすすめしますが、特定の画面構成をサポートしたくないアプリもあります。その場合は、このページで説明するように、Android でアプリのサイズを変更できる範囲や、アプリをインストールできるデバイスを制限することができます。

アプリを特定の画面に制限する前に、複数画面をサポートするためのすべての手法を理解して、できる限り実装する必要があります。

画面ごとに個別のアーティファクトを公開する

すべての画面構成をサポートする単一のアプリを作成することが合理的でない場合に備えて、Google Play では、同じアプリの掲載情報に複数のバージョンを公開できます。この機能を使用すると、Google Play ストアで個別の掲載情報を作成することなく、それぞれが異なる画面構成セット(マニフェスト ファイルで宣言)をサポートする個別のアーティファクトを提供できます。

たとえば、アプリのハンドセット版とタブレット版の両方を公開するが、1 つの APK を両方の画面サイズで機能させることができない場合、同じアプリの掲載情報に対して 2 つの APK を公開できます。各デバイスの画面構成に応じて、Google Play は各デバイスの画面サイズと一致する APK をダウンロードします。Android App Bundle を使用して公開する場合、配信される APK は画面密度に合わせて自動的に最適化されますが、画面サイズをターゲットとする場合は、同じ方法を使用する必要があります。

詳細については、各種の画面サイズ用の複数の APK の作成をご覧ください。

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

できるだけ多くのデバイスをサポートするには、アプリのレイアウトを動的に調整して、コンテンツとコントロールを表示し、適切に整理する必要があります。

また、ほとんどのアプリは、ユーザーがマルチ ウィンドウ モードで実行できるように、サイズ変更が可能にする必要があります。ユーザーは、分割画面モードやフリーフォーム モードでサイズ変更可能なアクティビティを起動し、側面や角をドラッグしてアクティビティのサイズを変更できます。

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

Android 12(API レベル 31)では、マルチウィンドウ モードがデフォルトです。画面が大きい(画面幅 600 dp 以上)場合は、アプリの設定にかかわらず、すべてのアプリがマルチウィンドウ モードで実行されます。resizeableActivity="false" の場合、ディスプレイの寸法に合わせるために必要なときに、アプリは互換モードになります。小画面(画面幅 600 dp 未満)では、システムはアクティビティの minWidthminHeightresizeableActivity の設定をチェックして、アクティビティをマルチウィンドウ モードで実行できるかどうかを判断します。resizeableActivity="false" の場合、アクティビティの最小幅と高さに関係なく、アクティビティはマルチウィンドウ モードをサポートしません。

API レベル 30 以前でアプリやアクティビティをマルチウィンドウ モードで実行しない場合は、resizeableActivity=false を設定します。この場合、アプリは常に全画面表示されます。この処理方法は、Android OS のレベルに応じてシステムが制御します。

  • アプリが Android 8.0(API レベル 26)~ Android 11(API レベル 30)をターゲットとしている場合、アプリはレイアウトに従って画面全体に表示されます。
  • アプリが 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)以降で最大アスペクト比を設定するには、<activity> タグ内で android:maxAspectRatio を使用して最大アスペクト比を宣言します。次の例は、最大アスペクト比として 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 などの外部サービスでは無視されます)。

以下に、アプリが小画面サイズと標準画面サイズ(および画面密度のサブセット)にのみ対応している場合のマニフェスト エントリの例を示します。

<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>

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