条件付きモジュールのデバイス ターゲティング

条件付きモジュールのデバイス ターゲティングとは

デバイス ターゲティング(DT)を使用すると、デバイスのハードウェアに基づいて、条件付き機能モジュールをデバイスに配信できます。たとえば、一部の機能をハイエンド デバイスにのみ配信し、この機能を使用できないデバイスには配信しないように設定することもできます(そのようなデバイスのスペースを節約できます)。これは、Play Feature Delivery の機能モジュールのコンセプトに基づいています。以下で説明するように、ターゲティング条件を(現時点では RAM、特定のデバイスモデル、または使用可能なシステム機能に基づいて)定義し、モジュールを特定のデバイス グループにターゲティングできます。

デベロッパーが実施する手順

デバイス ターゲティングを既存のアプリに統合するには、概要として次の手順が必要になります。

  1. デバイスのハードウェアに基づいて、一連のデバイスにのみ配信する機能を開発します。
    • この機能を機能モジュールとして実装します。
    • AndroidManifest.xml のモジュール条件セクションで、配信先のデバイス グループを指定します。
  2. デバイス ターゲティング構成を作成し、機能モジュールをユーザーのデバイスに配信する方法を Play が認識できるようにします。
    • Google Play Developer API を設定します(まだ完了していない場合)。この API を使用して DT 構成を Play に送信します
    • 手順に沿って DT 構成を作成します。
  3. AAB を Play にアップロードし、すべてが正しく構成されているかどうかをテストします。

このドキュメントでは、Android Gradle プラグインを使用して、条件付き配信用のデバイス ターゲティングを追加する方法について説明します。

デバイス ターゲティングを使用して条件付き機能モジュールを作成する

機能モジュールをアプリに追加する

Play Feature Delivery を使用すると、アプリの特定の機能を条件付きで配信したり、オンデマンドでダウンロードさせたりできます。詳しくは、こちらの概要をご覧ください。デバイス ターゲティングを使用すると、指定したグループに割り当てられたデバイスに、条件付きで機能を配信できます。

条件付き配信に DT を使用するには、bundletool バージョン 1.7.0 以上を使用する必要があります。そのためには、Android Gradle プラグインの bundletool バージョンを明示的に指定します。これは、ルート build.gradle ファイルの buildscript セクションで行うことができます。

buildscript {
  dependencies {
    classpath "com.android.tools.build:bundletool:1.7.0"
    ...
  }
  ...
}

機能モジュールを作成するには、Android アプリをモジュール化する手順を使用します。

機能の開発が完了したら、機能の AndroidManifest.xml でデバイス ターゲティングに基づいて配信条件を指定できます。dist:module 要素の dist:conditions 内にデバイス グループ条件を指定する必要があります。条件に関する一般的な情報については、こちらをご覧ください。デバイス グループでは、この機能を配信するすべてのグループを指定できる新しい条件を使用できます。

<dist:device-groups>
  <dist:device-group dist:name="..." />
  <dist:device-group dist:name="..." />
  ...
</dist:device-groups>

たとえば、_my_group1 というデバイス グループを定義したとします(この定義方法の詳細については、以下のデバイス ターゲティング構成の作成のセクションをご覧ください)。機能モジュールを _my_group1 デバイスに属するデバイスにのみ配信する場合、その AndroidManifest.xml は次のようになります。

<manifest ...>
  ...
  <dist:module dist:title="...">
    <dist:delivery>
      <dist:install-time>
        <dist:conditions>
          <dist:device-groups>
            <dist:device-group dist:name="my_group_1"/>
          </dist:device-groups>
          ...
        </dist:conditions>
      </dist:install-time>
    </dist:delivery>
  </dist:module>
  ...
</manifest>

_my_group1 と _my_group2 の両方をターゲットとする機能の場合、AndroidManifest.xml は次のようになります。

<manifest ...>
  ...
  <dist:module dist:title="...">
    <dist:delivery>
      <dist:install-time>
        <dist:conditions>
          <dist:device-groups>
            <dist:device-group dist:name="my_group_1"/>
            <dist:device-group dist:name="my_group_2"/>
          </dist:device-groups>
          ...
        </dist:conditions>
      </dist:install-time>
    </dist:delivery>
  </dist:module>
  ...
</manifest>

完了したら、Android App Bundle(AAB)をビルドできます。

ローカルテスト

先に進む前に、App Bundle をローカルでテストして、すべてが正しく設定されているか確認することをおすすめします。bundletool を使用して、ローカルでアプリのビルドとテストを行い、正しいデバイス グループを明示的に指定します。最初に build-apks を使用して一連の .apks ファイルを生成してから、install-apks を使用して接続されたデバイスにアプリをデプロイします。device-groups フラグを使用して、インストールするグループを指定することもできます。このローカルテストの方法について詳しくは、こちらをご覧ください。このページは DT については更新されていないため、device-groups フラグに関する情報は記載されていません。

bundletool build-apks --bundle=/path/to/app.aab --output=/path/to/app.apks --local-testingbundletool install-apks --apks=/path/to/app.apks --device-groups=my_group_1,my_group_2

別の方法: extract-apks を使用して、特定のデバイス用の APK のセットを抽出することもできます(get-device-spec を使用するとともに、このデバイスのデバイス グループを指定します)。

bundletool get-device-spec --output=/path/to/device-spec.json --device-groups=my_group_1,my_group_2bundletool extract-apks --apks=/path/to/existing_APK_set.apks --output-dir=/path/to/device_specific_APK_set.apks --device-spec=/path/to/device-spec.json

Google Play Developer API でデバイス ターゲティング構成を作成する

Google Play Developer API のスタートガイド(まだ完了していない場合)

デバイス ターゲティングの構成(デバイス グループの定義)を行うには、Android Publisher API を使って構成を Google Play にアップロードする必要があります。API の詳細については上記のリンクをご覧ください。使用を開始するための手順がいくつか用意されています。

  1. 必要に応じて、API プロジェクトを作成して Google Play Console にリンクします。
  2. API アクセス クライアントを設定します。

API リファレンスはこちらで確認できます。後で API 経由でビルドをアップロードする場合は、Edits メソッドを使用します。また、API を使用する前に、こちらのページを確認することをおすすめします。

Device Target Configuration API の使用

デバイス ターゲティング構成を作成するには、次の API 呼び出しを使用します。

デバイス ターゲティング構成の作成

HTTP リクエスト POST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs
パスパラメータ なし
リクエストの本文 デバイス ターゲティング構成
レスポンスの本文 デバイス ターゲティング構成
デバイス ターゲティング構成オブジェクト
{
  device_groups: [
    {
      name: string,
      device_selectors: [
        {
          device_ram : {
            min_bytes: integer
            max_bytes: integer
          },
          included_device_ids: [
            {
              build_brand: string,
              build_device: string
            }
          ],
          excluded_device_ids: [
            {
              build_brand: string,
              build_device: string
            }
          ],
          required_system_features: [
            {
              name: string
            }
          ],
          forbidden_system_features: [
            {
              name: string
            }
          ]
        }
      ]
    }
  ]
}

フィールド:

  • device_tier_config_id(整数): このデバイス ターゲティング構成に対応する ID。
  • device_groups(オブジェクト): グループの定義。

    • name(文字列): デバイス グループの名前(自分で定義した文字列 ID)。
    • device_selectors(オブジェクト): このグループに属するデバイスの要件。
    • device_ram(オブジェクト): デバイスの RAM の要件。
      • min_bytes(整数): 必要な最小 RAM(バイト単位)。
      • max_bytes(整数): 必要な最大 RAM(バイト単位)。
    • included_device_ids(オブジェクト): このセレクタに含めるデバイスモデル(グループあたり最大 10,000 個の device_ids)。デバイスがセレクタに一致するには、このリストに含まれている必要があります。これはセレクタ全体に一致するための必要条件であり、十分条件ではありません(セレクタ内の要件を組み合わせる方法については下記の注をご覧ください)。
      • build_brand(文字列): デバイスのメーカー。
      • build_device(文字列): デバイスのモデルコード。
    • excluded_device_ids(オブジェクト): このセレクタで除外するデバイスモデル(グループあたり最大 10,000 個の device_ids)。このリストにあるデバイスは、セレクタ内の他のすべての要件に一致したとしても、セレクタに一致しません。
      • build_brand(文字列): デバイスのメーカー。
      • build_device(文字列): デバイスのモデルコード。
    • required_system_features(オブジェクト): デバイスがこのセレクタに含まれるために搭載している必要がある機能(グループあたり最大 100 個の機能)。デバイスがセレクタに一致するには、このリストにあるすべてのシステム機能を搭載している必要があります。これはセレクタ全体に一致するための必要条件であり、十分条件ではありません(セレクタ内の要件を組み合わせる方法については下記の注をご覧ください)。

      システム機能リファレンス

      • name(文字列): システム機能
    • forbidden_system_features(オブジェクト): このセレクタに含まれるために、デバイスが搭載してはいけない機能(グループあたり最大 100 個の機能)。デバイスがこのリスト内にあるシステム機能を搭載している場合、セレクタの他のすべての要件に一致しても、セレクタに一致しません。

      システム機能リファレンス

      • name(文字列): システム機能

デバイスのメーカーとモデルコードの正しい形式を見つけるには、Google Play Console のデバイス カタログを使用して、次のいずれかを行います。

  • 下記の例のように、デバイス カタログを使用して個々のデバイスを調べ、メーカーとモデルコードを見つけます(Google Pixel 4a の場合、メーカーは「Google」、モデルコードは「sunfish」となります)。

    デバイス カタログの Pixel 4a のページ

    デバイス カタログの Pixel 4a のページ

  • サポートされているデバイスの CSV をダウンロードし、build_brandbuild_device にそれぞれメーカーとモデルコードを使用します。

たとえば、次のグループは RAM が 4 GB を超えるすべてのデバイスと一致します。ただし、Pixel 5(Google Redfin)と Pixel 3(RAM が 4 GB 未満の Google Blueline)は除きます。

device_groups: [
  {
    name: "my_group_1",
    device_selectors: [
      {
        device_ram: {
          min_bytes: 4294967296
        },
        excluded_device_ids: [
          {
            build_brand: "google",
            build_device: "redfin"
          }
        ]
      },
      {
        included_device_ids: [
          {
            build_brand: "google",
            build_device: "blueline"
          }
        ]
      }
    ]
  }
]

これは次のように解釈できます。

[ (RAM > 4GB) AND NOT (google redfin) ] OR [ (google blueline) ]

Google Play にアップロードする前に、次の手順に沿ってデバイス ターゲティング構成を検証してください。

デバイス ターゲティング構成を ID で取得する

次の呼び出しを使用して、ID で特定のデバイス ターゲティング構成を取得できます。

HTTP リクエスト GEThttps://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs/{deviceTierConfigId}
パスパラメータ なし
リクエストの本文 なし
レスポンスの本文 デバイス ターゲティング構成

デバイス ターゲティング構成のリストを取得する

次の呼び出しを行うと、最新のデバイス ターゲティング構成を 10 個取得できます(または、page_token クエリ パラメータを使用して 10 個のセットを適切に指定します)。

HTTP リクエスト GEThttps://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs
パスパラメータ なし
クエリ パラメータ page_token(省略可)- 10 個の DTC からなる特定のグループを指定するために使用されます。これは、10 個以上の DTC を作成している場合に、最近作成した 10 個よりも前に作成した DTC を確認したいときに便利です。
リクエストの本文 なし
レスポンスの本文 デバイス ターゲティング構成のリスト

page_token

デバイス ターゲティング構成を検証する

bundletool には、Google Play にアップロードする前に、デバイス ターゲティング構成が意図通りに動作することを検証するためのコマンドが 2 つあります。

bundletool print-device-targeting-config により、JSON ファイルの構文が正しいことを検証し、デバイス グループをわかりやすい形式で可視化できます。

bundletool print-device-targeting-config --config=mydtc.json

bundletool evaluate-device-targeting-config により、特定のデバイスにどのグループが一致するかを評価できます。ターゲット デバイスをワークステーションに接続し、--connected-device フラグを使用します。もしくは、デバイス プロパティを含む JSON ファイルを手動でコンパイルし、--device-properties フラグを使用して指定します。

bundletool evaluate-device-targeting-config --config=mydtc.json --connected-device
bundletool evaluate-device-targeting-config --config=mydtc.json --device-properties=deviceproperties.json

デバイス プロパティ ファイルは、DeviceProperties protobuf 構造に沿った JSON ファイルでなければなりません。次に例を示します。

{
  "ram": 2057072640,
  "device_id": {
    "build_brand":"google",
    "build_device":"redfin"
  },
  "system_features": [
    {
      "name":"android.hardware.bluetooth"
    },
    {
      "name":"android.hardware.camera"
    }
  ]
}

Android App Bundle を Google Play にアップロードする

API 経由

Google Play Developer API を使用して、Android App Bundle を Google Play にアップロードしたり、特定のデバイス ターゲティング構成をビルドにリンクしたりすることができます。

Edits メソッドの全般的な概要と、Google Play Console のさまざまなトラックへのリリースに関する詳細な例をご覧ください(最後のリンクでは、ページ内にリストされている APK 対応 API の代わりに、AAB 対応 API を使用する必要があります)。ビルドのデバイス ターゲティング構成を指定するには、edits.bundle.upload メソッドを呼び出す際に、次のように構成 ID をdeviceTierConfigId クエリ パラメータに追加します。

https://androidpublisher.googleapis.com/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/bundles?deviceTierConfigId="{deviceTierConfigId}"

Google Play Console 経由

こちらの手順に沿って Android App Bundle をアップロードします。最新の DTC 構成が App Bundle に適用されます。

補足事項

curl によるクイック スタート

以下に、コマンドライン ツール curl を使用した新しいデバイス ターゲティング構成の作成と、Edits API を使用した新しい編集の作成、新しい AAB のアップロード(特定のデバイス ターゲティング構成への関連付け)、トラックまたはリリース構成の設定、編集のコミット(変更の公開)の例を示します。ロケーションが次のようになっていることを確認します。

まず、デバイス ターゲティング構成を作成し、呼び出しが成功したときに受け取る deviceTierConfigId をメモします。

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPOST -H "Content-Type: application/json" -d "{ device_groups: [ { name: "my_group_1", device_selectors: [ { device_ram: { min_bytes: 4294967296 }, excluded_device_ids: [ { build_brand: "google", build_device: "redfin" } ] }, { included_device_ids: [ { build_brand: "google", build_device: "blueline" } ] } ] } ] }" https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs

編集を開始すると、編集用の ID と有効期限が表示されます。次の呼び出し用に ID を保存します。

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPOST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/edits

AAB をアップロードし、クエリ パラメータとしてデバイス ターゲティング構成(deviceTierConfigId)を指定します。呼び出しが成功すると、ビルドのバージョン コード、sha1 および sha256 が表示されます。次回の呼び出し用にバージョン コードを保存します。

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" --data-binary @$HOME/{aabFile} -H "Content-Type: application/octet-stream" -XPOST https://androidpublisher.googleapis.com/upload/androidpublisher/v3/applications/{packageName}/edits/{editID}/bundles?deviceTierConfigId="{deviceTierConfigId}

AAB を目的のトラックに割り当てます(テストには内部テストトラックを使用することをおすすめします。こちらでさまざまなトラックの詳細をご覧いただけます。ここではリリースノートなしで簡単に公開していますが、未公開のリリースとリリースノートを段階的に公開する方法について詳しくは、こちらのページをご覧ください。Publisher API を初めて使用する場合は、すべてが正しく構成されるように、未公開のリリースとして作成してから、Google Play Console でリリースを完了することをおすすめします

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPUT -H "Content-Type: application/json" -d "{ releases: [{status: '{status}', versionCodes: ['{versionCode}'] }]}" https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/edits/{editID}/tracks/{track}

変更をコミットします(Play 上の目的のトラックにすべての変更が公開されるため、慎重に行ってください)。

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPOST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/edits/{editID}:commit