はじめに
オンデバイス AI 向け Google Play は、Android App Bundle と Google Play の配信のメリットをカスタム ML モデルの配信にもたらします。これにより、デバイス エコシステムの複雑さを増すことなく、追加費用なしでモデルのパフォーマンスを改善できます。コード、アセット、ML モデルを含む単一のアーティファクトを Play に公開し、さまざまな配信モードとターゲティング オプションから選択できます。
利点
- 単一の公開アーティファクトを Google Play にアップロードし、ホスティング、配信、更新、ターゲティングを Google Play に委任します。追加料金はかかりません。
- ML モデルをインストール時、高速フォロー、オンデマンドで配信します。
- インストール時の配信では、アプリを開いたときに非常に大きなモデルが存在することを保証できます。モデルは APK としてインストールされます。
- 高速フォロー配信は、アプリのインストール後にバックグラウンドで自動的に行われます。モデルが完全にダウンロードされる前に、ユーザーがアプリを開く可能性があります。モデルはアプリの内部ストレージにダウンロードされます。
- オンデマンド配信では、実行時にモデルをリクエストできます。これは、特定のユーザーフローでのみモデルが必要な場合に便利です。モデルはアプリの内部ストレージにダウンロードされます。
- デバイスモデル、システム プロパティ、RAM に基づいて、特定のデバイスを対象とする ML モデルのバリエーションを配信します。
- Google Play の自動パッチ適用により、アプリのアップデートを小さく最適化できます。つまり、ファイルの差分のみをダウンロードすればよいということです。
考慮事項
- オンデバイス AI 向け Play を使用すると、Google Play デベロッパー販売 / 配布契約および Play Core ソフトウェア開発キット利用規約の各条項に同意したことになります。
- オンデバイス AI 用に Google Play によってダウンロードされたモデルは、アプリでのみ使用されるべきです。モデルを他のアプリに提供してはなりません。
- 個々の AI パックは、圧縮されたダウンロード サイズに基づいて、最大 1.5 GB になります。アプリバンドルから生成されるアプリの任意のバージョンの最大累積アプリサイズは 4 GB です。
- サイズが 1 GB を超えるアプリの場合、最小 SDK レベルを 21 以上に設定する必要があります。
オンデバイス AI のための Google Play の使用方法
オンデバイス AI のための Google Play では AI パックが使用されます。配布準備が整ったカスタムモデルは、アプリバンドルの AI パックにパッケージ化します。AI パックをインストール時、高速フォロー、オンデマンドのいずれで配信するかを選択できます。
AI パックをアプリバンドルにパッケージ化することで、テスト版トラックや段階的リリースなど、Google Play の既存のテストツールやリリースツールをすべて使用して、カスタムモデルでアプリの配信を管理できます。
AI パックはアプリのバイナリとともに更新されます。新しいアプリのリリースで AI パックに変更がない場合、Google Play の自動パッチ処理により、ユーザーが AI パックを再ダウンロードする必要はありません。Google Play は、アプリを更新する際に変更された部分のみをダウンロードします。
AI パックにはモデルのみが含まれます。Java/Kotlin ライブラリとネイティブ ライブラリは許可されていません。ML モデルを実行するためにライブラリやコードを配布する必要がある場合は、ベース モジュールまたは機能モジュールに移動します。AI パックと同じダウンロード設定とターゲティング設定になるように、機能モジュールを構成できます。
AI パックで LiteRT と MediaPipe を使用する
AI パックでは LiteRT と MediaPipe を使用できます。モデルを AI パックにパッケージ化し、インストール時パックまたは高速フォロー パックとオンデマンド パックの手順に沿ってアクセスします。
関連情報:
- LiteRT のスタートガイド
- サンプルアプリは、LiteRT モデルを AI パックにパッケージ化して、実行時に読み込む方法を示しています。
- AI パックで使用して開始できる事前トレーニング済みの LiteRT モデルは多数あります。
- MediaPipe を使ってみる
- fast-follow パックと on-demand パックの場合、AssetCache.java を使用してアセット(画像、音声など)を読み込むことができます。
.binarypb
ファイル)をファイルパスで指定します。 - インストール時のパックには、AndroidAssetUtil.java を使用できます。
- fast-follow パックと on-demand パックの場合、AssetCache.java を使用してアセット(画像、音声など)を読み込むことができます。
AI パックを使ってみる
オンデバイス AI のための Google Play の使用を開始する手順の概要は次のとおりです。
- モデルを AI パックにパッケージ化して Android App Bundle に含め、AI パックの配信方法を指定します。
- [省略可] さまざまなデバイスにさまざまなモデルを配信する場合は、AI パックのデバイス ターゲティングを構成できます。たとえば、特定のデバイスモデルに AI パック A を、6 GB 以上の RAM を搭載したデバイスに AI パック B を配信し、他のすべてのデバイスにはモデルを配信しないようにできます。
- [省略可] オンデマンド配信または fast-follow 配信を使用している場合は、Play AI Delivery Library をアプリに統合して、必要に応じて AI パックをダウンロードします。
- App Bundle をテストして Google Play にリリースします。
Android Gradle プラグインのバージョンを確認する
AI パックを使用するには、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.gradle
settings.gradle
app/
ai-pack-name/build.gradle
ai-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 配信と on-demand 配信を設定する
fast-follow 配信または on-demand 配信で AI パックをダウンロードするには、Play AI Delivery ライブラリを使用します。
Play AI Delivery Library への依存関係を宣言する
アプリの build.gradle
ファイルで、Play AI Delivery ライブラリへの依存関係を宣言します。
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()
とともに表示されるダイアログをユーザーが承認するまで、ダウンロードは続行されません。このステータスは、アプリが 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()
によって返されるマップのエントリは、現在ダウンロードされている最新のパックです。
デバイス ターゲティング
デバイス ターゲティングを使用すると、アプリバンドルのどの部分を特定のデバイスに配信するかをより細かく制御できます。たとえば、大容量モデルを大容量 RAM のデバイスにのみ配信したり、モデルの異なるバージョンを異なるデバイスに配信したりできます。
次のようなデバイス プロパティをターゲットに設定できます。
- システム オン チップ
- デバイスのモデル
- デバイス RAM
- システム機能
必要な手順の概要
デバイス ターゲティングを有効にするには、次の手順が必要です。
- デバイス グループを XML ファイルで定義します。
- バンドルのどの部分をどのデバイス グループに送信するかを指定します。
- [省略可] 構成をローカルでテストします。
- バンドル(XML ファイルを含む)を 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 つ以上のデバイス プロパティを設定できます。デバイスがセレクタのデバイス プロパティのすべてに一致する場合、そのデバイスが選択されます。
複数のグループに一致するデバイスには、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 にそれぞれメーカーとモデルコードを使用します。
デバイス ターゲティング構成ファイルをアプリバンドルに含める
メイン モジュールの 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
は、メイン モジュールに対する構成ファイルの相対パスです。これにより、構成ファイルがアプリバンドルにパッケージ化されます。
deviceGroup
句は、バンドルから生成された 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
パックのように動作します。つまり、アプリがサイドローディングされたときに自動的に取得されることはありません。デベロッパーがアプリの開始時に手動でリクエストする必要があります。アプリのコードを変更する必要はありません。- パックは 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 パックと fast-follow AI パックは APK としてインストールされません。
Google Play でテストとリリースを行う
Google Play で内部テストトラックを使用してアプリをエンドツーエンドでテストすることをおすすめします。
この設定が完了したら、段階的な公開を使用して、アプリのアップデートを本番環境に段階的にリリースできます。
オンデバイス AI のための Google Play を使用するサンプルアプリ
サンプルアプリをダウンロードします。
このサンプルでは、各配信モードとデバイス ターゲティング構成の使用方法を示します。開始するには、ローカル テストをご覧ください。
関連コンテンツ
Android App Bundle について詳しくは、AI Delivery SDK のリファレンスをご覧ください。