画面サポートの制限の宣言

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

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

画面ごとに別々の APK を公開する

あらゆる画面構成をサポートする単一の APK を作成することが適切でない場合のために、Google Play では、同一のアプリの掲載情報に対して複数の APK を公開することを許可しています。この機能を使用すると、マニフェスト ファイルで宣言されているように、それぞれが異なる画面構成をサポートする APK を別々に提供できます。しかも、Google Play ストアに個別の掲載情報を作成する必要もありません。

たとえば、スマートフォン版とタブレット版の両方のアプリを公開したいものの、両方の画面サイズ用の 1 つの APK を作成することができない場合、同一のアプリの掲載情報に対して 2 つの APK を公開できます。Google Play は、各デバイスの画面構成に応じて、各デバイスの画面サイズと一致する APK をダウンロードします。

詳しくは、各種の画面サイズ用の複数の APK を作成するをご覧ください。

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

できる限り多くのデバイスをサポートするには、アプリのコンテンツとコントロールが整然と表示されるように、レイアウトを動的に調整する必要があります。

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

マルチウィンドウ モードは 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)以降の最大アスペクト比を設定するには、<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> マニフェスト要素を使用することにより、スマートフォンでアプリをダウンロードできないようにすることができます。

次の例では、ラージとエクストラ ラージの画面の場合にのみアプリをインストールするように宣言しています。

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

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