はじめに
Play for On-device AI は、Android App Bundle と Google Play 配信のメリットをカスタム ML モデルの配信にもたらします。これにより、デバイス エコシステムの複雑さを軽減し、追加費用なしでモデルのパフォーマンスを向上させることができます。これにより、コード、アセット、ML モデルを含む単一のアーティファクトを Play に公開し、多数の配信モードとターゲティング オプションから選択できます。
利点
- 1 つの公開アーティファクトを Google Play にアップロードし、ホスティング、配信、更新、ターゲティングを Google Play に委任します。追加費用はかかりません。
- ML モデルをインストール時、ファスト フォロー、またはオンデマンドで配信します。
- インストール時の配信では、アプリの起動時に非常に大きなモデルが存在することが保証されます。モデルは APK としてインストールされます。
- fast-follow 配信は、アプリのインストール後にバックグラウンドで自動的に行われます。モデルが完全にダウンロードされる前に、ユーザーがアプリを開く可能性があります。モデルはアプリの内部ストレージ スペースにダウンロードされます。
- オンデマンド配信では、実行時にモデルをリクエストできます。これは、モデルが特定のユーザーフローでのみ必要な場合に便利です。モデルはアプリの内部ストレージにダウンロードされます。
- デバイスモデル、システム プロパティ、RAM に基づいて、特定のデバイスをターゲットとする ML モデルのバリアントを配信します。
- Google Play の自動パッチ適用により、アプリ アップデートを小さく最適化された状態に保ちます。つまり、ファイルの差分のみをダウンロードする必要があります。
考慮事項
- Play for On-device AI を使用すると、Google Play デベロッパー販売 / 配布契約および Play Core ソフトウェア開発キット利用規約の各条項に同意したことになります。
- Play for On-device AI によってダウンロードされたモデルは、アプリでのみ使用する必要があります。モデルを他のアプリに提供しないでください。
- 個々の AI パックは、圧縮されたダウンロード サイズに基づいて最大 1.5 GB にできます。App Bundle から生成されるアプリのバージョンの累積アプリサイズの上限は 4 GB です。
- サイズが 1 GB を超えるアプリの場合、最小 SDK レベルを 21 以上に設定する必要があります。
オンデバイス AI のための Google Play の使用方法
オンデバイス AI のための Google Play では、AI パックが使用されます。配布可能なカスタムモデルをアプリバンドルの AI パックにパッケージ化します。AI パックをインストール時、高速フォロー、オンデマンドのいずれで配信するかを選択できます。
AI パックを App Bundle にパッケージ化することで、テストトラックや段階的な公開など、Google Play の既存のテストツールとリリースツールをすべて使用して、カスタムモデルを使用したアプリの配信を管理できます。
AI Pack はアプリのバイナリと一緒に更新されます。新しいアプリ リリースで AI パックに変更が加えられていない場合、Google Play の自動パッチ適用プロセスにより、ユーザーが AI パックを再ダウンロードする必要がなくなります。Google Play はアプリの更新時に 変更された部分のみをダウンロードします
AI パックにはモデルのみが含まれます。Java/Kotlin ライブラリとネイティブ ライブラリは使用できません。ML モデルを実行するためにライブラリやコードを配布する必要がある場合は、ベース モジュールまたは機能モジュールに移動します。機能モジュールを構成して、AI パックと同じダウンロードとターゲティングの設定を適用できます。
AI パックで LiteRT と MediaPipe を使用する
LiteRT と MediaPipe は AI パックで使用できます。モデルを AI パックにパッケージ化し、インストール時パックまたは高速フォローパックとオンデマンド パックの手順に沿ってアクセスします。
参考資料:
- LiteRT のスタートガイド
- サンプルアプリは、LiteRT モデルを AI パックにパッケージ化して、実行時に読み込む方法を示しています。
- AI パックで使用できる事前トレーニング済みの LiteRT モデルが多数用意されています。
- MediaPipe を使ってみる
- fast-follow パックとオンデマンド パックの場合、AssetCache.java を使用してアセットを読み込むことができます(例:
.binarypbファイル)をファイルパスで指定します。 - インストール時のパックには、AndroidAssetUtil.java を使用できます。
- fast-follow パックとオンデマンド パックの場合、AssetCache.java を使用してアセットを読み込むことができます(例:
AI パックを使ってみる
オンデバイス AI のための Google Play の使用を開始する方法の概要は次のとおりです。
- モデルを AI パックにパッケージ化して Android App Bundle に含め、AI パックの配信方法を指定します。
- [省略可] 異なるデバイスに異なるモデルを配信する場合は、AI パックのデバイス ターゲティングを構成できます。たとえば、AI パック A を特定のデバイスモデルに、AI パック B を 6 GB 以上の RAM を搭載したデバイスに配信し、他のすべてのデバイスにはモデルを配信しないようにできます。
- [省略可] オンデマンド配信または fast-follow 配信を使用している場合は、Play AI Delivery Library をアプリに統合して、必要に応じて AI パックをダウンロードします。
- App Bundle をテストして Google Play にリリースします。
Android Gradle プラグインのバージョンを確認する
AI Pack を使用するには、Android Gradle プラグイン(AGP)のバージョンが 8.8 以降であることを確認してください。このバージョンは Android Studio Ladybug 2 にパッケージ化されています。
モデルを AI パックに抽出する
以下の手順では Android Studio は必要ありません。
- プロジェクトの最上位ディレクトリに、AI パックのディレクトリを作成します。このディレクトリ名は AI パック名として使用されます。AI パック名の先頭は英字にしてください。その後には、英字、数字、アンダースコアのみ使用できます。
AI パックのディレクトリに
build.gradleファイルを作成し、下記のコードを入力します。AI パックの名前と、配信タイプを 1 つだけ指定します。// In the AI pack's build.gradle file: plugins { id 'com.android.ai-pack' } aiPack { packName = "ai-pack-name" // Directory name for the AI pack dynamicDelivery { deliveryType = "[ install-time | fast-follow | on-demand ]" } }プロジェクトのアプリの
build.gradleファイルで、下記のように、プロジェクト内の各 AI パックの名前を追加します。// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }次のように、プロジェクトの
settings.gradleファイルにプロジェクト内のすべての AI パックをインクルードします。// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'AI パック内に
src/main/assets/ディレクトリを作成します。モデルを
src/main/assetsディレクトリに配置します。ここでもサブディレクトリを作成できます。アプリのディレクトリ構造は次のようになります。build.gradlesettings.gradleapp/ai-pack-name/build.gradleai-pack-name/src/main/assets/your-model-directories
モデルを読み込んで実行するコードを追加します。この方法は、AI パックの配信モードによって異なります。インストール時とファスト フォロー/オンデマンドの手順については、以下をご覧ください。
[省略可] デバイス ターゲティングを構成して、さまざまなデバイスにさまざまなモデルを配信します。
Gradle を使用して Android App Bundle をビルドします。生成された App Bundle のルートレベルのディレクトリには、以下が含まれるようになりました。
ai-pack-name/manifest/AndroidManifest.xml: AI パックの識別子と配信モードを設定しますai-pack-name/assets/your-model-directories: AI パックの一部として配信されるすべてのアセットを含むディレクトリ
Gradle は各 AI パックのマニフェストを生成し、
assets/ディレクトリを出力します。
インストール時配信の設定
インストール時に配信されるように設定された AI パックは、アプリの起動時にすぐに利用できます。このモードで配信される AI パックにアクセスするには、Java AssetManager API を使用します。
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
fast-follow 配信とオンデマンド配信を設定する
fast-follow 配信またはオンデマンド配信で AI パックをダウンロードするには、Play AI Delivery Library を使用します。
Play AI Delivery Library への依存関係を宣言する
アプリの build.gradle ファイルで、Play AI Delivery Library への依存関係を宣言します。
dependencies {
...
implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}
ステータスを確認
各 AI パックは、アプリの内部ストレージ内の個別のフォルダに保存されます。AI パックのルートフォルダを確認するには、getPackLocation() メソッドを使用します。このメソッドは以下の値を返します。
| 戻り値 | ステータス |
|---|---|
有効な AiPackLocation オブジェクト |
AI パックのルートフォルダは assetsPath() ですぐにアクセスできます |
null |
不明な AI パックまたは AI パックは利用できません |
AI パックのダウンロード情報を取得する
getPackStates() メソッドを使用して、ダウンロードのサイズを確認し、パックがすでにダウンロード中かどうかを判別します。
Task<AiPackStates> getPackStates(List<String> packNames)
getPackStates() は Task<AiPackStates> を返す非同期メソッドです。AiPackStates オブジェクトの packStates() メソッドは Map<String, AiPackState> を返します。このマップには、リクエストされた各 AI パックの状態(名前がキーになっています)が含まれます。
Map<String, AiPackState> AiPackStates#packStates()
最終リクエストは次のように表示されます。
final String aiPackName = "myAiPackName"; aiPackManager .getPackStates(Collections.singletonList(aiPackName)) .addOnCompleteListener(new OnCompleteListener<AiPackStates>() { @Override public void onComplete(Task<AiPackStates> task) { AiPackStates aiPackStates; try { aiPackStates = task.getResult(); AiPackState aiPackState = aiPackStates.packStates().get(aiPackName); } catch (RuntimeExecutionException e) { Log.d("MainActivity", e.getMessage()); return; });
次の AiPackState メソッドは、AI パックのサイズ、これまでにダウンロードされた量(リクエストされた場合)、すでにアプリに転送された量を提供します。
AI パックのステータスを取得するには、status() メソッドを使用します。このメソッドは、AiPackStatus クラスの定数フィールドに対応する整数としてステータスを返します。まだインストールされていない AI パックのステータスは AiPackStatus.NOT_INSTALLED です。
リクエストが失敗した場合は、errorCode() メソッドを使用します。このメソッドは、AiPackErrorCode クラスの定数フィールドに対応する戻り値を返します。
インストール
fetch() メソッドを使用して、AI パックの初回ダウンロードを行うか、AI パックの更新の完了を要求します。
Task<AiPackStates> fetch(List<String> packNames)
このメソッドは、パックのリストと初回ダウンロードの状態およびサイズを含む AiPackStates オブジェクトを返します。fetch() でリクエストされた AI パックがすでにダウンロード中の場合は、ダウンロード ステータスが返され、追加のダウンロードは開始されません。
ダウンロード状態をモニタリングする
AI パックのインストールの進行状況をトラッキングするには、AiPackStateUpdateListener を実装する必要があります。個々の AI パックのステータスをトラッキングできるように、ステータスの更新はパックごとに分類されます。リクエストしたすべてのダウンロードが完了する前に、利用可能になった AI パックの使用を開始できます。
void registerListener(AiPackStateUpdateListener listener) void unregisterListener(AiPackStateUpdateListener listener)
大規模なダウンロード
ダウンロードのサイズが 200 MB を超えていて、ユーザーが Wi-Fi に接続していない場合、モバイルデータ通信でダウンロードを続行することにユーザーが明示的に同意するまで、ダウンロードは開始されません。同様に、ダウンロードのサイズが大きく、ユーザーの Wi-Fi 接続が切断された場合は、ダウンロードが一時停止され、モバイルデータ接続を使用してダウンロードを続行するにはユーザーの明示的な同意が必要になります。一時停止されたパックは WAITING_FOR_WIFI の状態になります。ユーザーに同意を求める UI フローをトリガーするには、showConfirmationDialog() メソッドを使用します。
アプリがこのメソッドを呼び出さなかった場合、ダウンロードは一時停止され、ユーザーの Wi-Fi 接続が回復したときに限り、自動的に再開されます。
ユーザー確認が必要
パックのステータスが REQUIRES_USER_CONFIRMATION の場合、ユーザーが showConfirmationDialog() で表示されるダイアログを承認するまで、ダウンロードは続行されません。このステータスは、アプリが Google Play で認識されない場合(アプリがサイドローディングされた場合など)に発生することがあります。この場合、showConfirmationDialog() を呼び出すと、アプリが更新されます。更新後、AI パックを再度リクエストする必要があります。
リスナーの実装例を次に示します。
AiPackStateUpdateListener aiPackStateUpdateListener = new AiPackStateUpdateListener() { private final ActivityResultLauncher<IntentSenderRequest> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == RESULT_OK) { Log.d(TAG, "Confirmation dialog has been accepted."); } else if (result.getResultCode() == RESULT_CANCELED) { Log.d(TAG, "Confirmation dialog has been denied by the user."); } } }); @Override public void onStateUpdate(AiPackState aiPackState) { switch (aiPackState.status()) { case AiPackStatus.PENDING: Log.i(TAG, "Pending"); break; case AiPackStatus.DOWNLOADING: long downloaded = aiPackState.bytesDownloaded(); long totalSize = aiPackState.totalBytesToDownload(); double percent = 100.0 * downloaded / totalSize; Log.i(TAG, "PercentDone=" + String.format("%.2f", percent)); break; case AiPackStatus.TRANSFERRING: // 100% downloaded and assets are being transferred. // Notify user to wait until transfer is complete. break; case AiPackStatus.COMPLETED: // AI pack is ready to use. Run the model. break; case AiPackStatus.FAILED: // Request failed. Notify user. Log.e(TAG, aiPackState.errorCode()); break; case AiPackStatus.CANCELED: // Request canceled. Notify user. break; case AiPackStatus.WAITING_FOR_WIFI: case AiPackStatus.REQUIRES_USER_CONFIRMATION: if (!confirmationDialogShown) { aiPackManager.showConfirmationDialog(activityResultLauncher); confirmationDialogShown = true; } break; case AiPackStatus.NOT_INSTALLED: // AI pack is not downloaded yet. break; case AiPackStatus.UNKNOWN: Log.wtf(TAG, "AI pack status unknown") break; } } }
または、getPackStates() メソッドを使用して、現在のダウンロードのステータスを取得できます。AiPackStates には、ダウンロードの進行状況、ダウンロードのステータス、失敗のエラーコードが含まれます。
AI パックにアクセスする
ダウンロード リクエストが COMPLETED 状態になったら、ファイル システム呼び出しを使用して AI パックにアクセスできます。AI パックのルートフォルダを取得するには、getPackLocation() メソッドを使用します。
AI パックは、AI パックのルート ディレクトリ内の assets ディレクトリに保存されます。assetsPath() コンビニエンス メソッドを使用して、assets ディレクトリへのパスを取得できます。特定のアセットへのパスを取得するには、次のメソッドを使用します。
private String getAbsoluteAiAssetPath(String aiPack, String relativeAiAssetPath) { AiPackLocation aiPackPath = aiPackManager.getPackLocation(aiPack); if (aiPackPath == null) { // AI pack is not ready return null; } String aiAssetsFolderPath = aiPackPath.assetsPath(); // equivalent to: FilenameUtils.concat(aiPackPath.path(), "assets"); String aiAssetPath = FilenameUtils.concat(aiAssetsFolderPath, relativeAiAssetPath); return aiAssetPath; }
デバイス ターゲティングを構成する
デバイス ターゲティングの手順に沿って、AI パックを受け取るデバイスまたはデバイス グループを指定できます。
その他の Play AI Delivery API メソッド
ここでは、アプリで使用できるその他の API メソッドを紹介します。
リクエストをキャンセル
アクティブな AI パック リクエストをキャンセルするには、cancel() を使用します。このリクエストはベスト エフォート型のオペレーションです。
AI パックを削除する
AI パックの削除をスケジュールするには、removePack() を使用します。
複数の AI パックの場所を取得する
複数の AI パックのステータスをまとめてクエリするには、AI パックとその場所のマップを返す getPackLocations() を使用します。getPackLocations() によって返されるマップのエントリは、現在ダウンロードされている最新のパックです。
デバイス ターゲティング
デバイス ターゲティングを使用すると、App Bundle のどの部分を特定のデバイスに配信するかを細かく制御できます。たとえば、大規模なモデルを RAM の容量が大きいデバイスにのみ配信したり、異なるバージョンのモデルを異なるデバイスに配信したりできます。
次のような対象デバイス プロパティをターゲットに設定できます。
- システム オン チップ
- デバイスのモデル
- デバイスの RAM
- システム機能
必要な手順の概要
デバイス ターゲティングを有効にするには、次の手順を行います。
- XML ファイルでデバイス グループを定義します。
- バンドルのどの部分をどのデバイス グループに送信するかを指定します。
- [省略可] 構成をローカルでテストします。
- XML ファイルを含む App Bundle を Google Play にアップロードします。
Android Gradle プラグインのバージョンを確認する
デバイス ターゲティングを使用するには、Android Gradle プラグイン(AGP)のバージョンが 8.10.0 以降であることを確認してください。これは Android Studio(Meerkat 2 以降)にパッケージ化されています。Android Studio の最新の安定版をダウンロードします。
Android Gradle プラグインでこの機能を有効にする
デバイス ターゲティングは、gradle.properties ファイルで明示的に有効にする必要があります。
android.experimental.enableDeviceTargetingConfigApi=true
デバイス ターゲティング構成 XML ファイルを作成する
デバイス ターゲティング構成ファイルは、カスタム デバイス グループを定義する XML ファイルです。たとえば、Qualcomm SM8750 システム オン チップを搭載したすべてのデバイスを含む qti_v79 というデバイス グループを定義できます。
<config:device-targeting-config
xmlns:config="http://schemas.android.com/apk/config">
<config:device-group name="qti_v79">
<config:device-selector>
<config:system-on-chip manufacturer="QTI" model="SM8750"/>
</config:device-selector>
</config:device-group>
</config:device-targeting-config>
デバイス グループは、最大 5 つのデバイス セレクタで構成されます。デバイスがデバイス セレクタのいずれかを満たしている場合、そのデバイスはデバイス グループに含まれます。
1 つのデバイス セレクタに、1 つ以上のデバイス プロパティを設定できます。デバイスがセレクタのすべてのデバイス プロパティに一致する場合、そのデバイスが選択されます。
複数のグループに一致するデバイスには、XML ファイルで最初に定義されているグループのコンテンツが配信されます。XML ファイルでグループを定義する順序が優先順位になります。
どのグループにも一致しないデバイスは、デフォルトの「その他」グループに割り当てられます。このグループは自動的に生成されるため、明示的に定義しないでください。
利用可能なデバイス プロパティ
- device_ram: デバイスの RAM の要件。
- min_bytes(包含的): 必要な最小 RAM(バイト単位)。
- max_bytes(排他的): 必要な最大 RAM(バイト単位)。
- included_device_ids: このセレクタに含めるデバイスモデル(グループあたり最大 10,000 個の device_ids)。このプロパティは、デバイスがリスト内のいずれかの device_id と一致する場合に満たされます。
- build_brand: デバイスのメーカー
- build_device: デバイスのモデルコード
- excluded_device_ids: このセレクタで除外するデバイスモデル(グループあたり最大 10,000 個の device_ids)。デバイスがリスト内のどの device_id にも一致しない場合、このプロパティは満たされます。
- build_brand: デバイスのメーカー
- build_device: デバイスのモデルコード
required_system_features: デバイスがこのセレクタに含まれるために搭載している必要がある機能(グループあたり最大 100 個の機能)。デバイスがこのプロパティを満たすには、このリストにあるすべてのシステム機能を搭載している必要があります。
システム機能リファレンス
- name: システム機能
forbidden_system_features: このセレクタに含まれるために、デバイスが搭載してはいけない機能(グループあたり最大 100 個の機能)。デバイスがこのリスト内にあるシステム機能を搭載している場合、このプロパティを満たしません。
システム機能リファレンス
- name: システム機能
system-on-chip: このセレクタに含めるシステム オン チップ。デバイスがこのプロパティを満たすには、このリストにあるチップを搭載している必要があります。
- manufacturer: システム オン チップのメーカー
- model: システム オン チップ モデル
以下に、考えられるすべてのデバイス プロパティを示す例を示します。
<config:device-targeting-config
xmlns:config="http://schemas.android.com/apk/config">
<config:device-group name="myCustomGroup1">
<config:device-selector ram-min-bytes="8000000000">
<config:included-device-id brand="google" device="redfin"/>
<config:included-device-id brand="google" device="sailfish"/>
<config:included-device-id brand="good-brand"/>
<config:excluded-device-id brand="google" device="caiman"/>
<config:system-on-chip manufacturer="Sinclair" model="ZX80"/>
<config:system-on-chip manufacturer="Commodore" model="C64"/>
</config:device-selector>
<config:device-selector ram-min-bytes="16000000000"/>
</config:device-group>
<config:device-group name="myCustomGroup2">
<config:device-selector ram-min-bytes="4000000000" ram-max-bytes="8000000000">
<config:required-system-feature name="android.hardware.bluetooth"/>
<config:required-system-feature name="android.hardware.location"/>
<config:forbidden-system-feature name="android.hardware.camera"/>
<config:forbidden-system-feature name="mindcontrol.laser"/>
</config:device-selector>
</config:device-group>
</config:device-targeting-config>
公式のデバイス メーカーとデバイスモデルのコード
デバイスのメーカーとモデルコードの正しい形式を見つけるには、Google Play Console のデバイス カタログを使用して、次のいずれかを行います。
下記の例のように、デバイス カタログを使用して個々のデバイスを調べ、メーカーとモデルコードを見つけます(Google Pixel 4a の場合、メーカーは「Google」、モデルコードは「sunfish」となります)。


サポートされているデバイスの CSV をダウンロードし、build_brand と build_device にそれぞれメーカーとモデルコードを使用します。
デバイス ターゲティング構成ファイルを App Bundle に含める
メイン モジュールの build.gradle ファイルに次の行を追加します。
android {
...
bundle {
deviceTargetingConfig = file('device_targeting_config.xml')
deviceGroup {
enableSplit = true // split bundle by #group
defaultGroup = "other" // group used for standalone APKs
}
}
...
}
device_targeting_config.xml は、メイン モジュールを基準とした構成ファイルのパスです。これにより、構成ファイルが App Bundle にパッケージ化されます。
deviceGroup 句により、App Bundle から生成された APK がデバイス グループごとに分割されます。
AI パックでデバイス ターゲティングを使用する
大規模なモデルを、実行可能なデバイスにのみ配信することで、デバイスのサイズを最適化できます。
前のステップで作成した既存の AI パック ディレクトリを取得し、適切なフォルダ(下記参照)に #group_myCustomGroup1、#group_myCustomGroup2 などの接尾辞を付けることで、AI パックをデバイス グループごとにグループ化します。アプリで AI パックを使用する場合、接尾辞でフォルダをアドレス指定する必要はありません(つまり、接尾辞はビルドプロセス中に自動的に削除されます)。
前のステップを実施すると、次のようになります。
...
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup1/
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup2/
...
この例では、接尾辞なしで ai-pack-name/assets/image-classifier/ を参照します。
myCustomGroup1 のデバイスは image-classifier#group_myCustomGroup1/ のすべてのアセットを受け取り、myCustomGroup2 のデバイスは image-classifier#group_myCustomGroup2/ のすべてのアセットを受け取ります。
myCustomGroup1 と myCustomGroup2 のどちらにも属さないデバイスは、空の ai-pack-name パックを受け取ります。
これは、どのデバイス グループにも一致しないデバイスには、AI パックのデフォルトのバリアントが配信されるためです。これには、#group_suffix を含むディレクトリ内にないものがすべて含まれます。
AI パックをダウンロードしたら、インストール時パックの場合は AssetManager、高速フォローパックとオンデマンド パックの場合は AiPackManager を使用して、モデルが存在するかどうかを確認できます。サンプルアプリでは、すべての配信モードでこれを行う例が示されています。
機能モジュールにデバイス ターゲティングを使用する
機能モジュールにデバイス ターゲティングを使用することもできます。機能モジュールをデバイス グループごとに細分化するのではなく、デバイス グループのメンバーシップに基づいてモジュール全体を配信するかどうかを指定します。
myCustomGroup1 または myCustomGroup2 に属するデバイスに機能モジュールを配信するには、その AndroidManifest.xml を変更します。
<manifest ...>
...
<dist:module dist:title="...">
<dist:delivery>
<dist:install-time>
<dist:conditions>
<dist:device-groups>
<dist:device-group dist:name="myCustomGroup1"/>
<dist:device-group dist:name="myCustomGroup2"/>
</dist:device-groups>
...
</dist:conditions>
</dist:install-time>
</dist:delivery>
</dist:module>
...
</manifest>
ローカルでテストする
新しいバンドルのリリースを作成する前に、内部アプリ共有または Bundletool を使用してローカルでテストできます。
内部アプリ共有
内部アプリ共有では、App Bundle を使用して URL を簡単に生成できます。この URL をローカル デバイスでタップすると、そのバージョンのアプリがテストトラックまたは製品版トラックで公開されている場合に Google Play がそのデバイスにインストールする内容を正確にインストールできます。
内部アプリ共有の手順をご覧ください。
bundletool
または、bundletool(1.18.0 以降)を使用して APK を生成し、デバイスにサイドローディングすることもできます。bundletool を使用してアプリをローカルでテストする手順は次のとおりです。
Android Studio または bundletool を使用して App Bundle をビルドします。
--local-testingフラグを使用して APK を生成します。java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
デバイスを接続し、
bundletoolを実行して APK をサイドローディングします。# Example without Device Targeting Configuration java -jar bundletool.jar install-apks --apks=output.apks
# Example with Device Targeting Configuration (you must specify which groups the connected device belongs to) java -jar bundletool.jar install-apks --apks=output.apks --device-groups=myCustomGroup1,myCustomGroup2
bundletool を使用したローカルテストの制限事項
bundletool を使用したローカルテストには、次の制限があります。
fast-followパックは、on-demandパックのように動作します。つまり、アプリがサイドローディングされたときに自動的に取得されることはありません。デベロッパーは、アプリの起動時に手動でリクエストする必要があります。アプリのコードを変更する必要はありません。- パックは Google Play ではなく外部ストレージから取得されるため、ネットワーク エラーが発生した場合のコードの動作をテストすることはできません。
- Wi-Fi 接続を待つシナリオはローカルテストの対象外です。
- アップデートはサポートされません。新しいバージョンのビルドをインストールする前に、以前のバージョンを手動でアンインストールします。
正しい APK がインストールされていることを確認する
正しい APK のみがデバイスにインストールされるようにするには、次のメソッドを使用します。
adb shell pm path {packageName}
次のような出力が表示されます。
package:{...}/base.apk
package:{...}/split_config.en.apk
package:{...}/split_config.xxhdpi.apk
package:{...}/split_main_ai-pack-name.apk
package:{...}/split_main_ai-pack-name.config.group_myCustomGroup1.apk
このリストには、機能モジュールとインストール時の AI パックから作成された APK のみが表示されます。オンデマンド AI パックと高速フォロー AI パックは、APK としてインストールされません。
Google Play でのテストとリリース
内部テストトラックを使用して、Google Play でアプリをエンドツーエンドでテストすることをおすすめします。
この作業が完了したら、段階的な公開を使用して、アプリ アップデートを製品版に段階的にリリースできます。
オンデバイス AI のための Google Play を使用したサンプルアプリ
サンプルアプリをダウンロードします。
各配信モードとデバイス ターゲティング構成の使用方法を示します。詳しくは、ローカルテストのセクションをご覧ください。
関連コンテンツ
Android App Bundle の詳細と、AI Delivery SDK のリファレンスをご覧ください。