条件付き配信を設定する

条件付き配信を使用すると、アプリのインストール時に機能モジュールを自動的にダウンロードするための特定のデバイス構成要件を設定できます。 たとえば、拡張現実(AR)用の機能を含む機能モジュールが、AR 対応のデバイスに限り、アプリのインストール時に利用可能になるように構成できます。

現在、この配信メカニズムは、以下のデバイス設定に基づいて、アプリのインストール時のモジュールのダウンロードを制御できます。

指定したすべての要件をデバイスが満たさない限り、モジュールはアプリのインストール時にダウンロードされません。ただし、アプリは後で、Play Core SDK を使用してオンデマンドでモジュールをダウンロードするようリクエストできます。

まず、Android Studio 3.5 以上を使用していることを確認してください。以下のセクションで、機能モジュールに条件付き配信機能のサポートを追加する手順を示します。

新しいモジュールを追加して条件付き配信オプションを指定する

条件付き配信を指定する機能モジュールを新規作成する場合、以下のように、新規モジュール ウィザードを使用すると最も簡単に作成できます。

  1. [New Module] ダイアログを開くには、メニューバーから [File] > [New] > [New Module] を選択します。
  2. [New Module] ダイアログで [Dynamic Feature Module] を選択して、[Next] をクリックします。
  3. 通常どおりモジュールを設定して、[Next] をクリックします。
  4. [Module Download Options] セクションで次のように入力します。

    1. [Module title] にモジュールのタイトルを半角 50 文字(全角 25 文字)以内で指定します。プラットフォームがこのタイトルを使用するのは、たとえば、モジュールをダウンロードするかどうかをユーザーに確認するときに、モジュールを識別するためです。そのため、アプリのベース モジュールのタイトルを、文字列リソースとして指定して、翻訳できるようにする必要があります。Android Studio を使ってこのモジュールを作成すると、IDE はその文字列リソースをベース モジュールに追加して、次のようなエントリをその機能モジュールのマニフェストに挿入します。

      <dist:module
          ...
          dist:title="@string/feature_title">
      </dist:module>
      
    2. [Install-time inclusion] のプルダウン メニューで [Only include module at app install for devices with specified features] を選択します。これにより、デバイスの機能や国など、指定した特定の設定を持つデバイスにだけ、アプリのインストール時にアプリと一緒に取り込むモジュールが作成されます。Android Studio はデベロッパーの選択に合わせて、モジュールのマニフェストに以下を挿入します。

      <dist:module ... >
        <dist:delivery>
            <dist:install-time>
                <dist:conditions>
                    <!-- If you specify conditions, as described in the steps
                         below, the IDE includes them here. -->
                </dist:conditions>
            </dist:install-time>
        </dist:delivery>
      </dist:module>
      
    3. モジュールの自動ダウンロードを特定の国や最小 API レベルに限定する場合は、[Finish] をクリックしてモジュールの作成を完了した後、最小 API レベルに基づく条件を指定します。手順については、下記のセクションをご覧ください。それ以外の条件については、[+ device feature] をクリックして、インストール時にモジュールをダウンロードするうえでデバイスに必要な機能を指定します。

    4. [device-feature] の横にあるプルダウン メニューから、以下のオプションのいずれかを選択して、その値を指定します。

      • Name: インストール時にモジュールをダウンロードするうえでデバイスに必要なハードウェアまたはソフトウェアの機能を指定できます。条件付き配信でサポートされる機能は、PackageManagerFEATURE_* 定数としてリストする機能と同じです。このオプションを選択した場合、プルダウンの横にある欄に、機能の定数値(「bluetooth」など)の入力を始めて、表示される候補の中からいずれかを選択します。
      • OpenGL ES Version: インストール時にモジュールをダウンロードするうえでデバイスに必要な OpenGL ES のバージョンを指定できます。このオプションを選択した場合、プルダウンの横にある欄に、バージョン(「0x00030001」など)の入力を始めて、表示される候補の中からいずれかを選択します。
    5. 対象とするデバイスの機能に基づく条件を複数追加する場合は、指定するデバイス機能の条件ごとに [+ device feature] をクリックします。

    6. Android 4.4(API レベル 20)以下を搭載したデバイスでこのモジュールを使用可能にして、マルチ APK に含める場合は、[Fusing] チェックボックスをオンにします。このモジュールのオンデマンド動作を有効にし、融合(Fusing)を無効にすると、分割 APK のダウンロードとインストールに対応していないデバイスを対象外にすることができます。Android Studio はデベロッパーの選択に合わせて、モジュールのマニフェストに以下を挿入します。

      <dist:module ...>
          <dist:fusing dist:include="true | false" />
      </dist:module>
      
  5. モジュール ダウンロード オプションの設定が完了したら、[Finish] をクリックします。

Android Gradle プラグインは、動的機能モジュールからの lint の実行をサポートしていません。対応するアプリ モジュールから lint を実行すると、その動的機能モジュールで lint が実行され、すべての問題がアプリの lint レポートに含まれます。

条件付き配信オプションを既存の機能モジュールに追加する

モジュールのマニフェストを使用すれば、既存の機能モジュールに条件付き配信オプションを簡単に追加できます。ただし、追加する前に、条件付き配信オプションと、すでに有効になっている可能性のある他の配信オプションとの互換性について確認する必要があります。

まず、マニフェストを新しい <dist:delivery> 要素に移行する必要があります。古い構文の例を下記のコード スニペットに示します。

<!-- This is the old syntax. -->
<dist:module
  dist:title="@string/feature_title" dist:onDemand="true">
  <dist:fusing dist:include="true"/>
</dist:module>

上記の配信オプションは、現在では次のように指定します。

<dist:module
  dist:title="@string/feature_title">
  <dist:delivery>
      <dist:on-demand/>
  </dist:delivery>
  <dist:fusing dist:include="true"/>
</dist:module>

移行後、デバイス機能に基づく条件付き配信オプションを、次のように指定します。

<dist:module
    dist:title="@string/feature_title">
    <dist:delivery>
      <dist:on-demand/>
      <dist:install-time>
        <dist:conditions>
          <!-- Requires that the device support AR to download the module at
          app install-time.  -->
          <dist:device-feature dist:name="android.hardware.camera.ar"/>
        </dist:conditions>
      </dist:install-time>
    </dist:delivery>
    <dist:fusing dist:include="true"/>
</dist:module>

国や最小 API レベルなど、条件付き配信の他のオプションについては、下記のセクションで説明します。

他のモジュール ダウンロード オプションとの互換性

機能モジュールには、各機能をユーザーのデバイスに配信する方法を設定するオプションが複数用意されているため、条件付き配信オプションが他の設定によってどのように影響を受けるのか把握しておくことが重要です。条件付き配信と他のモジュール ダウンロード オプションとの互換性について以下の表に示します。

モジュール ダウンロード オプション 条件付き配信との互換性
融合(<dist:fusing dist:include="true"/> モジュールに対してこのオプションを true に設定している場合、API レベル 19 以下を搭載しているデバイスにアプリをデプロイする際、指定した条件付き配信オプションは Google Play によって無視されます。つまり、API レベル 19 以下を搭載しているデバイスの場合、融合を有効にしている機能モジュールは、インストール時に常に組み込まれます。
Instant 対応(<dist:module dist:instant="true"/> Instant 対応の機能モジュールは、条件付き配信オプションをサポートしていません。
オンデマンド(<dist:on-demand/> デフォルトでは、条件付き配信オプションを指定した場合、モジュールはオンデマンドでも利用できます。

国に基づく条件を指定する

条件付き配信を使用すると、アプリのインストール時にモジュールをダウンロードする対象から除外する(あるいは対象に含める)国を指定することもできます。たとえば、特定の地域で利用できない支払い方法を実装しているモジュールの場合、この条件の指定が便利です。

この条件の基準となるデバイスの「国」は通常、Google Play アカウントに登録されているユーザーの請求先住所によって判断されます。

モジュールの対象国を指定するには、機能モジュールのマニフェストに以下の設定を追加します。

<dist:conditions>
   <!-- Set to "true" to specify countries to exclude from downloading
   this module at app install-time. By default, modules are available
   for download to all user countries. -->
  <dist:user-countries dist:exclude="true">
    <!-- Specifies the two-letter  CLDR country code for regions that should
    not download the module at app install-time. -->
    <dist:country dist:code="CN"/>
    <dist:country dist:code="HK"/>
  </dist:user-countries>
</dist:conditions>

API レベルの条件を指定する

機能モジュールが Android プラットフォームの特定のバージョンでのみ使用可能な API に依存している場合、デバイスの API レベルに基づく条件の指定が便利です。

デバイスの最小 API レベルまたは最大 API レベルに基づく条件を設定するには、機能モジュールのマニフェストに次のような設定を追加します。

<dist:conditions>
    <!-- Specifies the minimum API level that the device must satisfy
         in order to download your module at app install-time. The API level you
         specify must be greater or equal to the module's own minSdkVersion. -->
   <dist:min-sdk dist:value="21"/>
    <!-- Specifies the maximum API level that the device cannot exceed
         in order to download your module at app install-time. The API level you
         specify must be less than or equal to the module's own maxSdkVersion. -->
   <dist:max-sdk dist:value="24"/>
</dist:conditions>