简介
Play for On-device AI 可将 Android App Bundle 和 Google Play 分发的优势引入到自定义 ML 模型分发中,让您无需额外付费,即可降低生态系统复杂性并提升模型性能。借助它,您可以将包含代码、资源和机器学习模型的单个工件发布到 Play,并从多种提交模式和定位选项中进行选择。
优势
- 将单个发布工件上传到 Google Play,并将托管、分发、更新和定位工作委托给 Play,无需额外付费。
- 在安装时、快速跟进或按需分发机器学习模型。
- 安装时传送可确保在应用打开时存在非常大的模型。您的模型将作为 APK 安装。
- 在应用安装完成后,系统会在后台自动进行快速跟进式分发。用户可能会在模型下载完毕之前打开您的应用。您的模型将下载到应用的内部存储空间。
- 借助按需提交,您可以在运行时请求模型,这在仅需要模型来处理特定用户流程时非常有用。您的模型将下载到应用的内部存储空间。
- 提交针对特定设备(基于设备型号、系统属性或 RAM)的 ML 模型变体。
- 借助 Play 的自动补丁功能,您可以使应用更新保持小体量并进行优化,这意味着只需下载文件差异即可。
注意事项
- 使用 Play 设备端 AI 即表示您同意 Google Play 开发者分发协议和 Play Core 软件开发套件服务条款中的条款。
- 我们希望参与抢先体验计划的开发者评估 Play 设备端 AI,并向 Google Play 提供反馈。
- 通过 Play 下载的设备端 AI 模型只能由下载该模型的应用使用。不得将模型提供给其他应用,例如通过服务连接。
- 单个 AI 文件包的大小上限为 1.5GB,具体取决于其压缩后的下载大小。从 app bundle 生成的任何应用版本的累计应用大小上限为 4GB。
- 大小超过 1GB 的应用必须将最低 SDK 级别设置为 21 或更高级别。
- 在抢先体验计划期间,Play for On-device AI 可能会发生变化。
如何使用 Play for On-device AI
Play for On-device AI 使用 AI 软件包。您可以在应用 bundle 中打包准备在 AI 软件包中分发的自定义模型。您可以选择是在安装时分发、快速跟进式分发还是按需分发 AI 资源包。
通过将 AI 软件包与应用 bundle 打包在一起,您可以使用 Play 的所有现有测试和发布工具(例如测试轨道和分阶段发布),通过自定义模型管理应用的分发。
AI 软件包会随应用二进制文件一起更新。如果您的新应用版本未更改 AI 软件包,Play 的自动补丁程序会确保用户无需重新下载该软件包。更新应用时,Play 只会下载发生更改的内容。
AI 文件包仅包含模型。不允许使用 Java/Kotlin 和原生库。如果您需要分发库或代码来运行机器学习模型,请将其移至基本模块或功能模块。您可以配置功能模块,使其具有与 AI 套件相同的下载和定位设置。
将 LiteRT 和 MediaPipe 与 AI 包搭配使用
您可以将 LiteRT 和 MediaPipe 与 AI 软件包搭配使用。将模型打包到 AI 文件包中,然后按照安装时文件包或快速跟进式文件包和按需文件包的说明访问该模型。
更多详情:
- LiteRT 使用入门
- 示例应用展示了如何在 AI 软件包中打包 LiteRT 模型并在运行时加载该模型。
- 您可以使用 AI 套件中的许多预训练 LiteRT 模型来快速上手。
- MediaPipe 使用入门
- 对于快速跟进式分发资源包和按需分发资源包,您可以使用 AssetCache.java 加载资源(例如
.binarypb
文件)的文件路径。 - 对于安装时资源包,您可以使用 AndroidAssetUtil.java。
- 对于快速跟进式分发资源包和按需分发资源包,您可以使用 AssetCache.java 加载资源(例如
AI 套件使用入门
大致来说,您可以通过以下方式开始使用 Play for On-device AI:
- 向 Google Play 提供您的 Play 开发者账号 ID,以加入 EAP。
- 将模型打包到 Android App Bundle 中的 AI 文件包中,并指定 AI 文件包的传送方式。
- [可选] 如果您想向不同设备分发不同的模型,可以为 AI 软件包配置设备定位。例如,您可以将 AI 软件包 A 分发给特定设备型号,将 AI 软件包 B 分发给 RAM 至少为 6GB 的设备,而所有其他设备都不会收到任何软件包。
- [可选] 如果您使用的是按需分发或快速跟进式分发,请将 Play AI Delivery 库集成到您的应用中,以便根据需要下载 AI 软件包。
- 测试您的 app bundle 并将其发布到 Google Play。
提供您的 Play 开发者账号 ID
由于此功能处于抢先体验阶段,因此您的开发者账号需要列入许可名单,才能使用 Play for On-device AI。请向您的 Google Play 合作伙伴经理或 Play for On-device AI 团队成员确认 Play 开发者账号 ID 和应用软件包名称。指定您是否将模型定位到特定设备(这是上一部分中的第 3 步)。目前,我们邀请部分 Play 合作伙伴测试此功能。
检查 Android Gradle 插件版本
如需使用 AI 软件包,请确保您的 Android Gradle 插件 (AGP) 版本至少为 8.8。此版本与 Android Studio Ladybug 2 一起打包。
将模型提取到 AI 文件包中
以下步骤不需要使用 Android Studio。
- 在项目的顶级目录中,为 AI 软件包创建一个目录。此目录名称将用作 AI 包名称。AI 文件包名称必须以字母开头,并且只能包含字母、数字和下划线。
在 AI 文件包目录中,创建一个
build.gradle
文件并添加以下代码。请务必指定 AI 文件包的名称,并且仅指定一种分发类型:// 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
[可选] 配置设备定位,以向不同设备分发不同的模型。
使用 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 软件包可以在应用启动后立即使用。使用 Java AssetManager API 获取在此模式下提供的 AI 文件包:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
配置快速跟进式分发和按需分发
如需使用快速跟进式分发或按需分发模式下载 AI 文件包,请使用 Play AI 分发库。
声明对 Play AI Delivery 库的依赖项
在应用的 build.gradle
文件中,声明对 Play AI 分发库的依赖项:
dependencies {
...
implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}
查看状态
每个 AI 软件包都存储在应用的内部存储空间内单独的文件夹中。使用 getPackLocation()
方法确定 AI 包的根文件夹。此方法会返回以下值:
返回值 | 状态 |
---|---|
有效的 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 文件包已经在下载,就会返回下载状态,并且不会启动其他下载。
监控下载状态
您应实现 AiPackStateUpdateListener
以跟踪 AI 软件包的安装进度。状态更新按资源包细分,以支持跟踪各 AI 资源包的状态。在请求的其他所有下载完成之前,您就可以开始使用可用的 AI 包。
void registerListener(AiPackStateUpdateListener listener) void unregisterListener(AiPackStateUpdateListener listener)
下载内容较大
如果下载内容超过 200 MB 并且用户未连接到 Wi-Fi,那么在用户明确同意使用移动网络连接继续下载前,下载不会开始。同样,如果下载内容较大并且用户与 WLAN 的连接断开,下载会暂停,需要用户明确同意才能使用移动网络连接继续下载。已暂停的 Asset Pack 状态为 WAITING_FOR_WIFI
。如需触发界面流程以提示用户同意,请使用 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 文件包。使用 getPackLocation()
方法获取 AI 文件包的根文件夹。
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 方法。
取消请求
您可以使用 cancel()
取消有效的 AI 包请求。请注意,系统只能尽量满足您的此项请求。
移除 AI 包
您还可以使用 removePack()
安排移除 AI 包。
获取多个 AI 文件包的位置
使用 getPackLocations()
批量查询多个 AI 文件包的状态,此方法将返回 AI 文件包与其位置的映射。getPackLocations()
返回的映射包含当前已下载且为最新状态的每个资源包的条目。
设备定位
借助设备定位,您可以更精细地控制要将 app bundle 的哪些部分分发到特定设备。例如,您可以确保仅将大型模型分发给 RAM 较大的设备,也可以将不同版本的模型分发给不同设备。
您可以定位设备属性,例如:
- 系统芯片
- 设备型号
- 设备 RAM
- 系统功能
必要步骤概览
如需启用设备定位,必须执行以下步骤:
- 在 XML 文件中定义设备组。
- 指定软件包的哪些部分应分发到哪些设备组。
- [可选] 在本地测试您的配置。
- 将您的软件包(包含 XML 文件)上传到 Google Play。
检查 Android Gradle 插件版本
如需使用设备定位,请确保您的 Android Gradle 插件 (AGP) 版本至少为 8.10.0-alpha01。此模块随 Android Studio Meerkat 2 打包在一起,后者处于 canary 版阶段。
在 Android Gradle 插件中启用此功能
您必须在 gradle.properties
文件中明确启用设备定位:
android.experimental.enableDeviceTargetingConfigApi=true
创建设备定位配置 XML 文件
设备定位配置文件是一个 XML 文件,您可以在其中定义自定义设备组。例如,您可以定义一个名为 qti_v79
的设备组,其中包含搭载 Qualcomm SM8750 系统级芯片的所有设备:
<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 个设备选择器组成。如果设备满足设备组中的任一设备选择器,则会纳入该设备组。
设备选择器可以有一个或多个设备属性。如果设备与选择器的所有设备属性匹配,则会被选择。
如果设备与多个组匹配,系统将向其提供 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 管理中心的设备目录查找设备制造商和型号代码的正确格式:
使用设备目录检查各个设备,在下例中所示的位置找到制造商和型号代码(以 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
子句可确保系统按设备组拆分从 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>
在本地测试
在为新 bundle 创建版本之前,您可以使用内部应用分享或 Bundletool 在本地进行测试。
内部应用分享
借助内部应用分享功能,您可以使用 app bundle 快速生成一个网址,然后在本地设备上点按该网址,以便安装 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)提取,因此您无法测试代码在出现网络连接错误时的行为。
- 本地测试不涵盖 wait-for-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 上对应用进行端到端测试。
完成此操作后,您就可以使用分阶段发布功能,将应用更新逐步发布到生产环境。
使用 Play for On-device AI 的示例应用
如需访问我们的示例应用,请与您的 Google Play 合作伙伴经理联系。
该视频演示了如何使用每种提交模式以及设备定位配置。如需开始使用,请参阅本地测试部分。
提供反馈
抢先体验计划的参与者应报告问题并提供反馈。您可以与您的 Google Play 合作伙伴经理联系,也可以与 Play for On-device AI 团队联系。
相关内容
详细了解 Android App Bundle,并阅读 AI Delivery SDK 的参考文档。