Google Play でのフィルタ

ユーザーが Google Play でダウンロードするアプリを検索したりブラウジングしたりする際、その結果は、アプリがデバイスに対応しているかどうかに基づいてフィルタリングされます。たとえば、カメラを必要とするアプリの場合、カメラを搭載していないデバイスには表示されません。このフィルタリング機能により、デベロッパーはアプリの配信を管理し、可能な限り最良のユーザー エクスペリエンスを実現することができます。

Google Play でのフィルタリングは、複数のタイプのアプリ メタデータと設定を基準にしています。たとえば、マニフェストの宣言、必須ライブラリ、構造の依存関係、および Google Play Console で設定する一連の配信管理(対象地域や価格設定など)が含まれます。

Google Play のフィルタリングは、マニフェスト宣言と Android フレームワークの他の側面も部分的に考慮していますが、実際のフィルタリング動作はこのフレームワークとは異なり、特定の API レベルに関係するものではありません。このドキュメントでは、Google Play が使用する現行のフィルタリング ルールについて説明します。

Google Play でのフィルタリングの仕組み

Google Play は以下に説明するフィルタ制限を使用して、Google Play アプリでアプリをブラウジングしたり、検索したりしているユーザーにアプリを表示するかどうかを決定します。

Google Play は、アプリを表示するかどうかを決定する際に、デバイスのハードウェア要件とソフトウェア要件を確認し、同時に携帯通信会社、ロケーション、その他の特性も確認します。次にこれらを、アプリのマニフェスト ファイルと公開情報で指定されている制限事項や依存関係と比較します。

フィルタルールに基づいてアプリがデバイスに対応していれば、Google Play はそのアプリをユーザーに表示します。対応していない場合、Google Play は、検索結果やブラウジング中のカテゴリ内にそのアプリを表示しません。ユーザーが Google Play 内のアプリ ID を直接指定するディープリンクをタップして明示的にアプリをリクエストした場合でも、非対応のアプリが表示されることはありません。

アプリに対して利用可能なフィルタは、自由に組み合わせて使用することができます。たとえば、アプリの minSdkVersion 要件を "4" に設定し、smallScreens="false" に設定して、さらに Google Play へのアップロード時に、ヨーロッパ諸国(携帯通信会社)だけをターゲットにすることもできます。Google Play のフィルタにより、3 つの要件すべてに適合していないデバイスでは、このアプリが使用できなくなります。

すべてのフィルタリング制限はアプリのバージョンごとに固有のものであり、バージョン間で変えることができます。たとえば、あるユーザーがアプリをインストール済みであり、そのアプリをそのユーザーに表示しないアップデートを公開すると、そのユーザーにはアップデートが利用可能であることがわかりません。

Google Play ウェブサイト上のフィルタリング

ユーザーが Google Play ウェブサイトをブラウジングする際には、公開されているすべてのアプリが表示されます。ただし、Google Play ウェブサイトでは、ユーザーが登録しているデバイスごとにアプリが対応しているかどうかアプリの要件を比較し、デバイスに対応しているアプリだけをインストールできるようになっています。

アプリ マニフェストに基づくフィルタリング

フィルタの多くは、アプリのマニフェスト ファイル(AndroidManifest.xml)内の要素によってトリガーされます(ただし、マニフェスト ファイル内のすべての要素がフィルタリングをトリガーできるわけではありません)。フィルタリングのトリガーに使用できるマニフェスト要素のリストと、各要素のフィルタリングの仕組みについて表 1 に示します。

表 1. Google Play でのフィルタリングをトリガーするマニフェスト要素

マニフェスト要素 フィルタ名 フィルタの仕組み
<supports-screens> 画面サイズ

<supports-screens> 要素の属性を設定することで、アプリがサポート可能な画面サイズを指定できます。アプリが公開されると、Google Play はこの属性を使用して、ユーザー デバイスの画面サイズに基づいて、アプリをユーザーに表示するかどうかを決定します。

一般的なルールとして、Google Play は、デバイスのプラットフォームが小さいレイアウトを大きな画面に表示できる一方で、大きなレイアウトを小さな画面に表示できるような調整はできないと想定しています。そのため、アプリが「通常」の画面サイズだけをサポートすると宣言している場合、Google Play は、「通常」画面サイズのデバイスと「大型」画面サイズのデバイスの両方に対してそのアプリを使用できるようにしますが、「小型」画面サイズのデバイスに対してはそのアプリを使用できないようにフィルタリングします。

アプリが <supports-screens> 属性を宣言していない場合、Google Play は、この属性のデフォルト値を使用します。デフォルト値は API レベルによって異なります。特に次の点に注意が必要です。

  • android: minSdkVersion または android: targetSdkVersion が 3 以下に設定されているアプリの場合、<supports-screens> 要素自体が未定義となり、属性が使用できなくなります。この場合、Google Play は、アプリが「通常」画面サイズ向けに設計されていると想定し、「通常」画面サイズや「大型」画面サイズのデバイスに対してアプリを表示します。

  • android: minSdkVersion または android: targetSdkVersion が 4 以上に設定されているアプリの場合、すべての属性のデフォルトが "true" になります。この場合、アプリはデフォルトですべての画面サイズをサポートすると見なされます。

例 1
マニフェストが <uses-sdk android:minSdkVersion="3"> を宣言していて、<supports-screens> 要素を含んでいません。結果: Google Play は、他のフィルタが適用されていない限り、「小型」画面サイズのデバイスのユーザーにはアプリを表示しませんが、「通常」画面サイズと「大型」画面サイズのデバイスのユーザーにはアプリを表示します。

例 2
マニフェストが <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"> を宣言していて、<supports-screens> 要素を含んでいません。結果: Google Play は、他のフィルタが適用されていない限り、すべてのデバイスのユーザーにアプリを表示します。

例 3
マニフェストが <uses-sdk android:minSdkVersion="4"> を宣言していて、<supports-screens> 要素を含んでいません。結果: Google Play は、他のフィルタが適用されていない限り、すべてのユーザーにアプリを表示します。

アプリの画面サイズのサポートを宣言する方法については、<supports-screens>複数画面のサポートをご覧ください。

<uses-configuration> デバイス構成:
キーボード、ナビゲーション、タッチ スクリーン

アプリは特定のハードウェア機能をリクエストできます。Google Play は、リクエストされたハードウェアを備えたデバイスに対してのみアプリを表示します。

例 1
マニフェストが <uses-configuration android:reqFiveWayNav="true" /> を含んでおり、5 方向ナビゲーション コントロールを備えていないデバイス上でユーザーがアプリを検索しています。結果: Google Play はユーザーにアプリを表示しません。

例 2
マニフェストが <uses-configuration> 要素を含んでいません。結果: Google Play は、他のフィルタが適用されていない限り、すべてのユーザーにアプリを表示します。

詳細については、<uses-configuration> をご覧ください。

<uses-feature> デバイス機能
name

アプリは、デバイスが特定のデバイス機能を備えていることをリクエストできます。この機能は Android 2.0(API レベル 5)で導入されました。

例 1
マニフェストが <uses-feature android:name="android.hardware.sensor.light" /> を含んでいて、光センサーを備えていないデバイス上でユーザーがアプリを検索しています。結果: Google Play はユーザーにアプリを表示しません。

例 2
マニフェストが <uses-feature> 要素を含んでいません。結果: Google Play は、他のフィルタが適用されていない限り、すべてのユーザーにアプリを表示します。

詳細については、<uses-feature> をご覧ください。

暗黙的な機能に基づくフィルタリング: Google Play は、<uses-permission> 要素を通じてリクエストされた権限を <uses-feature> 要素で宣言される権限と同等の機能要件と解釈することがあります。下記の <uses-permission> をご覧ください。

OpenGL-ES バージョン
openGlEsVersion

アプリは、<uses-feature android:openGlEsVersion="int"> 属性を使用して、デバイスが特定の OpenGL-ES バージョンをサポートしていることをリクエストできます。

例 1
アプリが、マニフェスト内で openGlEsVersion を複数回指定することで、複数の OpenGL-ES バージョンをリクエストしています。結果: Google Play は、指定されたバージョンの中で最も新しいものをアプリがリクエストしていると想定します。

例 2
アプリが OpenGL-ES バージョン 1.1 をリクエストしていて、OpenGL-ES バージョン 2.0 をサポートしているデバイス上でユーザーがアプリを検索しています。結果: Google Play は、他のフィルタが適用されていない限り、ユーザーにアプリを表示します。デバイスが「OpenGL-ES バージョン X をサポートしている」と通知すると、Google Play は、そのデバイスが X よりも前のバージョンもサポートすると想定します。

例 3
OpenGL-ES のバージョンを通知しないデバイス(Android 1.5 以前を搭載しているデバイスなど)上でユーザーがアプリを検索しています。結果: Google Play は、そのデバイスが OpenGL-ES 1.0 だけをサポートしていると想定します。Google Play は、openGlEsVersion を指定していないアプリや、OpenGL-ES バージョン 1.0 より新しいバージョンを指定していないアプリだけをユーザーに表示します。

例 4
マニフェストが openGlEsVersion を指定していません。結果: Google Play は、他のフィルタが適用されていない限り、すべてのユーザーにアプリを表示します。

詳細については、<uses-feature> をご覧ください。

<uses-library> ソフトウェア ライブラリ

アプリは、デバイスが特定の共有ライブラリを備えていることをリクエストできます。

例 1
アプリが com.google.android.maps ライブラリをリクエストしていて、com.google.android.maps ライブラリを備えていないデバイス上でユーザーがアプリを検索しています。結果: Google Play はユーザーにアプリを表示しません。

例 2
マニフェストが <uses-library> 要素を含んでいません。結果: Google Play は、他のフィルタが適用されていない限り、すべてのユーザーにアプリを表示します。

詳細については、<uses-library> をご覧ください。

<uses-permission>  

厳密に言えば、Google Play は、<uses-permission> 要素に基づくフィルタリングは行いません。ただし、Google Play はこの要素を読み取り、アプリのハードウェア機能要件が <uses-feature> 要素内で適切に宣言されていない可能性がないか判断します。たとえば、アプリが CAMERA パーミッションをリクエストしつつ、<uses-feature> 要素内で android.hardware.camera を宣言していない場合、Google Play は、このアプリがカメラをリクエストしていると見なし、カメラを搭載していないデバイスのユーザーにはアプリを表示しません。

一般的に、アプリがハードウェア関連パーミッションをリクエストしている場合、対応する <uses-feature> 宣言がなかったとしても、Google Play は、アプリがそのハードウェア機能をリクエストしていると想定します。さらに、Google Play は、<uses-feature> 宣言で暗黙的に指定されている機能に基づいてフィルタリングを設定します。

ハードウェア機能を暗黙的に指定するパーミッションのリストについては、<uses-feature> 要素のドキュメントをご覧ください。

<uses-sdk> 最小フレームワーク バージョン(minSdkVersion

アプリは最小 API レベルを要求できます。

例 1
マニフェストが <uses-sdk android:minSdkVersion="3"> を含んでおり、API レベル 3 で導入された API をアプリが使用しています。ユーザーは API レベル 2 のデバイスでアプリを検索しています。結果: Google Play はユーザーにアプリを表示しません。

例 2
マニフェストが minSdkVersion を含んでおらず、API レベル 3 で導入された API をアプリが使用しています。ユーザーは API レベル 2 のデバイスでアプリを検索しています。結果: Google Play は、minSdkVersion が「1」であると想定し、アプリがすべてのバージョンの Android に対応していると見なします。Google Play は、ユーザーにアプリを表示し、ユーザーがアプリをダウンロードするのを許可します。アプリは実行時にクラッシュします。

2 番目のシナリオを回避するために、常に minSdkVersion を宣言することをおすすめします。詳細については、android:minSdkVersion をご覧ください。

最大フレームワーク バージョン(maxSdkVersion

サポートが終了しました。Android 2.1 以降では、maxSdkVersion 属性のチェックや適用は行われず、アプリのマニフェスト内で maxSdkVersion が設定されていても、SDK はコンパイルしません。すでに maxSdkVersion でコンパイルされているデバイスの場合、Google Play はこれを考慮し、フィルタリングに使用します。

maxSdkVersion を宣言することは推奨されません。詳細については、android:maxSdkVersion をご覧ください。

拡張マニフェスト フィルタ

Google Play では、表 1 のマニフェスト要素のほかに、拡張マニフェスト要素に基づいてアプリをフィルタリングすることもできます。表 2 をご覧ください。

これらのマニフェスト要素と、これらの要素がトリガーするフィルタリングは例外的なユースケースのみに対応します。これらの要素は、アプリの配信に厳密なコントロールが必要な特定のタイプの高性能ゲームと、同様のアプリ向けに設計されています。ほとんどのアプリでは、このフィルタを使用しないでください

表 2. Google Play でのフィルタリング用の拡張マニフェスト要素

マニフェスト要素まとめ
<compatible-screens>

Google Play は、ユーザー デバイスの画面サイズと画面密度が <compatible-screens> 要素内の画面構成(<screen> 要素で宣言)のいずれにも適合しなかった場合、アプリをフィルタリングします。

注: 通常、このマニフェスト要素は使用しないでください。この要素を使用すると、画面サイズと画面密度の組み合わせのうち、指定していないものがすべて除外されることになり、アプリの潜在的なユーザーベースが大幅に縮小する可能性があります。代わりに、<supports-screens> マニフェスト要素(表 1 を参照)を使用し、サポート対象外の画面構成に対して、代替リソースによる画面互換性モードを有効にすることをおすすめします。

<supports-gl-texture>

Google Play は、アプリでサポートされる 1 つ以上の GL テクスチャ圧縮フォーマットがデバイスで同様にサポートされない場合、アプリをフィルタリングします。

その他のフィルタ

Google Play は、他のアプリ特性を使用して、所定のデバイスを使用している特定のユーザーについて、アプリの表示 / 非表示を判断します。下記の表をご覧ください。

表 3. Google Play でのフィルタリングに影響するアプリと公開の特性

フィルタ名 フィルタの仕組み
公開状況

公開されているアプリのみが Google Play 内での検索とブラウジングに表示されます。

アプリの公開が取り消されても、ユーザーの [ダウンロード] で購入したアプリ、インストールしたアプリ、または最近アンインストールしたアプリに表示されている場合は、インストールが可能です。

アプリが保留状態の場合、ユーザーの [ダウンロード] に表示されていても、ユーザーは再インストールしたりアップデートしたりできません。

価格設定状況

すべてのユーザーに有料アプリが表示されるわけではありません。有料アプリが表示されるためには、デバイスが Android 1.1 以降を実行していて、有料アプリを使用できる国にある必要があります。デバイスに SIM カードが搭載されている場合、有料アプリを使用できるかどうかは SIM キャリアで判別されます。デバイスに SIM カードが搭載されていない場合、デバイスの IP アドレスを使用して、そのデバイスが有料アプリを利用できる国にあるかどうかが判断されます。

対象国の指定

アプリを Google Play にアップロードすると、[価格と販売 / 配布地域] でアプリを配布する国を選択できます。アプリを利用できるのは、ここで選択した国の中だけに限られます。

CPU アーキテクチャ(ABI)

特定の CPU アーキテクチャ(ARM EABI v7、x86 など)をターゲットとするネイティブ ライブラリを含むアプリは、そのアーキテクチャをサポートしているデバイスでのみ表示されます。NDK の詳細やネイティブ ライブラリの使用方法については、Android NDK をご覧ください。

コピー保護されたアプリ

Google Play は、Play Console のコピー防止機能のサポートを終了しました。今後、この機能に基づいてアプリをフィルタリングすることはありません。アプリを安全に保護するには、代わりにアプリのライセンス付与を使用してください。詳細については、コピー防止機能の後継機能をご覧ください。

異なるフィルタを使用した複数の APK の公開

一部の特定の Google Play フィルタでは、異なるデバイス構成に別の APK を提供するため、同じアプリの複数の APK を公開できるようになっています。たとえば、高品質のグラフィック アセットを使用するビデオゲームを作成している場合、別々のテクスチャ圧縮フォーマットをサポートする 2 つの APK を作成することが考えられます。この方法で、各デバイスの構成に必要なテクスチャのみを含めることで、APK ファイルのサイズを小さくすることができます。テクスチャ圧縮フォーマットに対する各デバイスのサポート状況に応じて、Google Play は各デバイスに対して、そのデバイスのサポートを宣言した APK を配布します。

現在のところ、各 APK が以下の構成に基づいて別々のフィルタを提供する場合に限り、同一アプリの複数の APK を Google Play 上で公開できます。

  • OpenGL テクスチャ圧縮形式

    <supports-gl-texture> 要素を使用します。

  • 画面サイズ(画面密度も指定可能)

    <supports-screens> 要素や <compatible-screens> 要素を使用します。

  • API レベル

    <uses-sdk> 要素を使用します。

  • CPU アーキテクチャ(ABI)

    特定の CPU アーキテクチャ(ARM EABI v7、x86 など)をターゲットとする Android NDK を使用してビルドしたネイティブ ライブラリを組み込みます。

他のすべてのフィルタも通常どおり機能しますが、Google Play の同一のアプリ掲載情報内にある複数の APK を区別できるのは、この 4 つのフィルタだけに限られます。たとえば、デバイスにカメラが搭載されているかどうかのみを基準として異なる APK を作成しても、同じアプリに複数の APK を公開することはできません

警告: 同じアプリに複数の APK を公開することは特殊なケースです。ほとんどのアプリでは、広範囲のデバイス構成をサポートする APK を 1 つだけ公開すべきです。複数の APK を公開する場合、フィルタ固有のルールに従う必要があります。また、構成ごとに適切なアップデート パスを確保するため、各 APK のバージョン コードに特別な注意を払う必要があります。

Google Play で複数の APK を公開する方法については、複数 APK サポートをご覧ください。

関連ドキュメント

  1. Android の互換性
  2. マルチ APK サポート