Introducción
Play for On-device AI ofrece los beneficios de los Android App Bundles y la publicación de Google Play a la distribución de modelos de AA personalizados para que puedas mejorar el rendimiento del modelo con menos complejidad en el ecosistema de dispositivos sin costo adicional. Te permite publicar un solo artefacto en Play que contenga tu código, recursos y modelos de AA, y elegir entre varios modos de entrega y opciones de segmentación.
Beneficios
- Sube un solo artefacto de publicación a Google Play y delega el alojamiento, la entrega, las actualizaciones y la segmentación en Play sin costo adicional.
- Entrega tus modelos de AA en el momento de la instalación, con seguimiento rápido o a pedido.
- La entrega durante la instalación puede garantizar que un modelo muy grande esté presente cuando se abra tu app. Tu modelo se instalará como un APK.
- La entrega posterior rápida se produce automáticamente en segundo plano después de que se instala la app. Es posible que los usuarios abran tu app antes de que se descargue por completo el modelo. El modelo se descargará en el espacio de almacenamiento interno de la app.
- La entrega a pedido te permite solicitar el modelo en el tiempo de ejecución, lo que resulta útil si el modelo solo se requiere para ciertos flujos de usuarios. El modelo se descargará en el espacio de almacenamiento interno de la app.
- Publica variantes de tus modelos de AA segmentadas para dispositivos específicos según el modelo, las propiedades del sistema o la RAM.
- Mantén las actualizaciones de la app pequeñas y optimizadas con los parches automáticos de Play, lo que significa que solo se deben descargar las diferencias en los archivos.
Consideraciones
- Si usas Play para la IA en el dispositivo, aceptas las condiciones del Acuerdo de Distribución para Desarrolladores de Google Play y las Condiciones del Servicio del kit de desarrollo de software de Play Core.
- Los modelos que descarga Play para la IA en el dispositivo solo deben usarse en tus apps. Los modelos no deben ofrecerse a otras apps.
- Los paquetes de IA individuales pueden tener un tamaño de hasta 1.5 GB, según sus tamaños de descarga comprimidos. El tamaño acumulativo máximo de la app de cualquier versión de tu app generada a partir de tu paquete de aplicación es de 4 GB.
- Las apps de más de 1 GB deben establecer el nivel de SDK mínimo en 21 o superior.
Cómo usar Play para la IA integrada en el dispositivo
Play para la IA integrada en el dispositivo usa paquetes de IA. Empaqueta en paquetes de IA los modelos personalizados que están listos para la distribución en tu paquete de aplicación. Puedes elegir si el paquete de IA se debe entregar en el momento de la instalación, con seguimiento rápido o a pedido.
Si empaquetas los paquetes de IA con tu paquete de aplicación, puedes usar todas las herramientas de prueba y lanzamiento existentes de Play, como los segmentos de prueba y los lanzamientos por etapas, para administrar la distribución de tu app con tus modelos personalizados.
Los paquetes de IA se actualizan junto con el objeto binario de la app. Si la nueva versión de tu app no realiza cambios en un paquete de IA, el proceso de aplicación de parches automático de Play garantizará que el usuario no tenga que volver a descargarlo. Play solo descargará lo que cambió cuando actualice la app.
Los paquetes de IA solo contienen modelos. No se permiten bibliotecas nativas ni de Java o Kotlin. Si necesitas enviar bibliotecas o código para ejecutar tu modelo de AA, muévelo al módulo básico o a un módulo de funciones. Puedes configurar tu módulo de funciones para que tenga la misma configuración de descarga y segmentación que el paquete de IA.
Usa LiteRT y MediaPipe con paquetes de IA
Puedes usar LiteRT y MediaPipe con paquetes de IA. Empaqueta tu modelo en un paquete de IA y, luego, accede a él con las instrucciones para los paquetes de tiempo de instalación o para los paquetes de seguimiento rápido y a pedido.
Lecturas adicionales:
- Comienza a usar LiteRT
- La app de ejemplo muestra cómo puedes empaquetar un modelo de LiteRT en un paquete de IA y cargarlo en el tiempo de ejecución.
- Existen muchos modelos LiteRT previamente entrenados que puedes usar en los paquetes de IA para comenzar.
- Comienza a usar MediaPipe
- Para los paquetes de seguimiento rápido y a pedido, puedes usar AssetCache.java para cargar tus recursos (p. ej., archivos
.binarypb
) por sus rutas de acceso. - Para los paquetes de tiempo de instalación, puedes usar AndroidAssetUtil.java.
- Para los paquetes de seguimiento rápido y a pedido, puedes usar AssetCache.java para cargar tus recursos (p. ej., archivos
Comienza a usar los paquetes de IA
A nivel general, así puedes comenzar a usar Play para la IA integrada en el dispositivo:
- Empaqueta tus modelos en paquetes de IA en tu Android App Bundle y especifica cómo se deben entregar los paquetes de IA.
- [Opcional] Si deseas publicar diferentes modelos en diferentes dispositivos, puedes configurar la segmentación por dispositivos para tus paquetes de IA. Por ejemplo, podrías entregar el paquete de IA A a un modelo de dispositivo específico, el paquete de IA B a dispositivos con al menos 6 GB de RAM y todos los demás dispositivos podrían no recibir ningún modelo.
- [Opcional] Si usas la entrega on demand o de seguimiento rápido, integra la biblioteca de Play AI Delivery en tu app para descargar los paquetes de IA según sea necesario.
- Prueba y lanza tu paquete de aplicación en Google Play.
Cómo verificar la versión del complemento de Android para Gradle
Para usar los paquetes de IA, asegúrate de que la versión del complemento de Gradle para Android (AGP) sea al menos la 8.8. Esta versión se incluye en Android Studio Ladybug 2.
Extrae tu modelo en un paquete de IA
No se requiere Android Studio para los siguientes pasos.
- En el directorio de nivel superior de tu proyecto, crea un directorio para el paquete de IA. Se usa el nombre de ese directorio como el nombre del paquete de IA. Los nombres de los paquetes de IA deben comenzar con una letra y solo pueden contener letras, números y guiones bajos.
En el directorio del paquete de IA, crea un archivo
build.gradle
y agrega el siguiente código. Asegúrate de especificar el nombre del paquete de IA y solo un tipo de entrega:// 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 ]" } }
En el archivo
build.gradle
de la app del proyecto, agrega el nombre de cada paquete de IA de tu proyecto, como se muestra a continuación:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
En el archivo
settings.gradle
del proyecto, incluye todos los paquetes de IA de tu proyecto, como se muestra a continuación:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
Dentro de tu paquete de IA, crea un directorio
src/main/assets/
.Coloca tus modelos en el directorio
src/main/assets
. Aquí también puedes crear subdirectorios. Ahora la estructura del directorio de tu app debería verse de la siguiente manera:build.gradle
settings.gradle
app/
ai-pack-name/build.gradle
ai-pack-name/src/main/assets/your-model-directories
Agrega código para cargar y ejecutar tus modelos. La forma de hacerlo dependerá del modo de entrega de tus paquetes de IA. Consulta las instrucciones para el tiempo de instalación y el seguimiento rápido o a pedido a continuación.
[Opcional] Configura la segmentación por dispositivos para publicar diferentes modelos en diferentes dispositivos.
Compila el Android App Bundle con Gradle. En el paquete de aplicación que se generó, el directorio raíz ahora incluye lo siguiente:
ai-pack-name/manifest/AndroidManifest.xml
: Configura el identificador y el modo de entrega del paquete de IA.ai-pack-name/assets/your-model-directories
: Es el directorio que contiene todos los recursos entregados como parte del paquete de IA.
Gradle genera el manifiesto para cada paquete de IA y genera el directorio
assets/
por ti.
Cómo configurar la entrega durante la instalación
Los paquetes de IA configurados como de instalación están disponibles inmediatamente en el lanzamiento de la app. Usa la API de AssetManager de Java para acceder a los paquetes de IA que se entregan en este modo:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
Cómo configurar la entrega rápida y a pedido
Para descargar paquetes de IA con entrega de seguimiento rápido o a pedido, usa la biblioteca de Play AI Delivery.
Declara la dependencia de la biblioteca de Play AI Delivery
En el archivo build.gradle
de tu app, declara una dependencia en la biblioteca de Play AI Delivery:
dependencies {
...
implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}
Comprueba el estado
Cada paquete de IA se almacena en una carpeta independiente del almacenamiento interno de la app. Usa el método getPackLocation()
para determinar la carpeta raíz de un paquete de IA. Este método devuelve los siguientes valores:
Valor que se devuelve | Estado |
---|---|
Un objeto AiPackLocation válido |
La carpeta raíz del paquete de IA está lista para acceder de inmediato a assetsPath() |
null |
No se conoce el paquete de IA o los paquetes de IA no están disponibles |
Obtén información de descarga sobre paquetes de IA
Usa el método
getPackStates()
para determinar el tamaño de la descarga y si ya se está descargando el paquete.
Task<AiPackStates> getPackStates(List<String> packNames)
getPackStates()
es un método asíncrono que devuelve un Task<AiPackStates>
.
El método packStates()
de un objeto AiPackStates
devuelve un elemento Map<String, AiPackState>
. Este mapa contiene el estado de cada paquete de IA solicitado, codificado por su nombre:
Map<String, AiPackState> AiPackStates#packStates()
La solicitud final se muestra mediante lo siguiente:
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; });
Los siguientes métodos AiPackState
proporcionan el tamaño del paquete de IA, la cantidad descargada hasta el momento (si se solicita) y la cantidad que ya se transfirió a la app:
Para obtener el estado de un paquete de IA, usa el método status()
, que devuelve el estado como un número entero que corresponde a un campo constante en la clase AiPackStatus
. Un paquete de IA que aún no está instalado tiene el estado AiPackStatus.NOT_INSTALLED
.
Si falla una solicitud, usa el método errorCode()
, cuyo valor que se devuelve corresponde a un campo constante en la clase AiPackErrorCode
.
Instalar
Usa el método fetch()
para descargar un paquete de IA por primera vez o llama a fin de que se complete la actualización de un paquete de IA:
Task<AiPackStates> fetch(List<String> packNames)
Este método devuelve un objeto AiPackStates
que contiene una lista de paquetes y sus estados y tamaños de descarga iniciales.
Si ya se está descargando un paquete de IA solicitado a través de fetch()
, se devolverá el estado de descarga y no se iniciará ninguna descarga adicional.
Supervisa los estados de descarga
Debes implementar un objeto AiPackStateUpdateListener
para realizar un seguimiento del progreso de la instalación de paquetes de IA. Las actualizaciones de estado se desglosan por paquete para admitir el seguimiento del estado de paquetes de IA individuales. Puedes comenzar a usar los paquetes de IA disponibles antes de que se completen todas las demás descargas de la solicitud.
void registerListener(AiPackStateUpdateListener listener) void unregisterListener(AiPackStateUpdateListener listener)
Descargas grandes
Si la descarga supera los 200 MB y el usuario no está conectado a una red Wi-Fi, no se iniciará la descarga hasta que el usuario otorgue explícitamente su consentimiento para continuar con la descarga a través de una conexión de datos móviles. Del mismo modo, si la descarga es grande y el usuario pierde la conexión Wi-Fi, esta se detiene y se necesita el consentimiento explícito para continuar usando una conexión de datos móviles. Un paquete detenido tiene el estado WAITING_FOR_WIFI
. Para activar el flujo de la IU a fin de solicitar el consentimiento del usuario, usa el método showConfirmationDialog()
.
Ten en cuenta que si la app no llama a este método, la descarga se detiene y se reanudará automáticamente cuando el usuario vuelva a una conexión Wi-Fi.
Confirmación del usuario obligatoria
Si un paquete tiene el estado REQUIRES_USER_CONFIRMATION
, la descarga no continuará hasta que el usuario acepte el diálogo que se muestra con showConfirmationDialog()
.
Este estado puede ocurrir cuando Play no reconoce la app, por ejemplo, si se transfirió de forma local. Ten en cuenta que, en este caso, llamar a showConfirmationDialog()
hará que se actualice la app. Después de la actualización, deberás volver a solicitar los paquetes de IA.
A continuación, se muestra un ejemplo de implementación de un objeto de escucha:
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; } } }
También puedes usar el método getPackStates()
para obtener el estado de las descargas actuales.
AiPackStates
contiene el progreso de descarga, el estado de descarga y los códigos de error con fallas.
Accede a los paquetes de IA
Puedes acceder a un paquete de IA a través de llamadas al sistema de archivos después de que la solicitud de descarga alcance el estado COMPLETED
. Usa el método getPackLocation()
para obtener la carpeta raíz del paquete de IA.
Los paquetes de IA se almacenan en el directorio assets
dentro del directorio raíz del paquete de IA.
Puedes obtener la ruta al directorio assets
con el método útil assetsPath()
.
Usa el siguiente método para obtener la ruta a un recurso específico:
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; }
Cómo configurar la segmentación por dispositivo
Puedes seguir las instrucciones de segmentación por dispositivo para especificar los dispositivos o grupos de dispositivos que deben recibir tus paquetes de IA.
Otros métodos de la API de Play AI Delivery
Estos son algunos métodos de API adicionales que te recomendamos usar en tu app.
Cancelar solicitud
Usa cancel()
para cancelar una solicitud activa de paquete de IA. Ten en cuenta que esta solicitud es una operación de mejor esfuerzo.
Cómo quitar un paquete de IA
Usa removePack()
para programar la eliminación de un paquete de IA.
Obtén las ubicaciones de varios paquetes de IA
Usa getPackLocations()
para consultar el estado de varios paquetes de IA de forma masiva, lo que devuelve un mapa de los paquetes de IA y sus ubicaciones. El mapa que devuelve getPackLocations()
contiene una entrada para cada paquete que se descarga y está actualizado.
Segmentación por dispositivo
La segmentación por dispositivo te brinda un mayor control sobre qué partes de tu paquete de aplicación se entregan a dispositivos específicos. Por ejemplo, podrías asegurarte de que un modelo grande solo se publique en dispositivos con RAM alta o podrías publicar diferentes versiones de un modelo en diferentes dispositivos.
Puedes segmentar tus anuncios según las propiedades del dispositivo, como las siguientes:
- Sistema en chip
- Modelo del dispositivo
- RAM del dispositivo
- Funciones del sistema
Descripción general de los pasos requeridos
Sigue estos pasos para habilitar la segmentación por dispositivo:
- Define tus grupos de dispositivos en un archivo XML.
- Especifica qué partes de tu paquete deben ir a qué grupos de dispositivos.
- [Opcional] Prueba tu configuración de forma local.
- Sube tu paquete (que contiene el archivo XML) a Google Play.
Cómo verificar la versión del complemento de Android para Gradle
Para usar la segmentación por dispositivo, asegúrate de que tu versión del complemento de Android para Gradle (AGP) sea al menos la 8.10.0. Se incluye en Android Studio (Meerkat 2 y versiones posteriores). Descarga la versión estable más reciente de Android Studio.
Cómo habilitar esta función en el complemento de Android para Gradle
La segmentación por dispositivo debe habilitarse de forma explícita en tu archivo gradle.properties
:
android.experimental.enableDeviceTargetingConfigApi=true
Crea un archivo XML de configuración de segmentación por dispositivo
El archivo de configuración de segmentación por dispositivo es un archivo XML en el que defines tus grupos de dispositivos personalizados. Por ejemplo, podrías definir un grupo de dispositivos llamado qti_v79
que contenga todos los dispositivos con el sistema en chip 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>
Un grupo de dispositivos se compone de hasta 5 selectores de dispositivos. Un dispositivo se incluye en un grupo de dispositivos si satisface cualquiera de sus selectores de dispositivos.
Un selector de dispositivos puede tener una o más propiedades de dispositivos. Un dispositivo se selecciona si coincide con todas las propiedades del dispositivo del selector.
Si un dispositivo coincide con varios grupos, se entregará el contenido del grupo que se defina primero en el archivo XML. El orden en el que defines los grupos en el archivo XML es tu orden de prioridad.
Si un dispositivo no coincide con ningún grupo, recibirá el grupo predeterminado "otro". Este grupo se genera automáticamente y no debe definirse de forma explícita.
Propiedades de dispositivos disponibles
- device_ram: Requisitos de RAM del dispositivo
- min_bytes (inclusive): RAM mínima requerida (en bytes)
- max_bytes (exclusive): RAM máxima requerida (en bytes)
- included_device_ids: Modelos de dispositivos que se incluirán en este selector (10,000 device_ids por grupo como máximo). Esta propiedad se cumple si el dispositivo coincide con algún device_id de la lista.
- build_brand: Fabricante del dispositivo
- build_device: Código del modelo del dispositivo
- excluded_device_ids: Modelos de dispositivos que se excluirán en este selector (10,000 device_ids por grupo como máximo). Esta propiedad se cumple si el dispositivo no coincide con ningún device_id de la lista.
- build_brand: Fabricante del dispositivo
- build_device: Código del modelo del dispositivo
required_system_features: Son las funciones que un dispositivo debe tener para que se lo incluya en este selector (100 funciones por grupo como máximo). Un dispositivo debe tener todas las funciones del sistema de esta lista para satisfacer esta propiedad.
Referencia de las funciones del sistema
- name: Una función del sistema
forbidden_system_features: Son las funciones que un dispositivo no debe tener para que se incluya en este selector (100 funciones por grupo como máximo). Si un dispositivo tiene alguna de las funciones del sistema que se detallan en esta lista, no satisface esta propiedad.
Referencia de las funciones del sistema
- name: Una función del sistema
system-on-chip: Sistemas en chip que se incluirán en este selector. Un dispositivo debe tener cualquier chip de esta lista para satisfacer esta propiedad.
- manufacturer: Fabricante del sistema en chip
- model: Modelo de sistema en chip
A continuación, se muestra un ejemplo con todas las propiedades posibles del dispositivo:
<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>
Códigos oficiales del fabricante y el modelo del dispositivo
Puedes encontrar el formato correcto para el fabricante y el código del modelo del dispositivo en el catálogo de dispositivos de Google Play Console optando por una de las siguientes maneras:
Inspecciona los dispositivos individuales con el catálogo de dispositivos y encuentra el fabricante y el código del modelo en las ubicaciones como se muestra en el siguiente ejemplo (para un Google Pixel 4a, el fabricante es "Google" y el código del modelo es "sunfish").
Descarga un archivo CSV de dispositivos compatibles y usa el Fabricante y el Código del modelo para los campos build_brand y build_device, respectivamente.
Incluye el archivo de configuración de segmentación por dispositivo en tu paquete de aplicación
Agrega lo siguiente al archivo build.gradle
de tu módulo principal:
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
es la ruta de acceso de tu archivo de configuración en relación con el módulo principal. Esto garantiza que el archivo de configuración se empaquete con tu paquete de aplicación.
La cláusula deviceGroup
garantiza que los APKs generados a partir de tu paquete se dividan por grupos de dispositivos.
Usa la segmentación por dispositivo para tus paquetes de IA
Puedes mantener la optimización del tamaño en los dispositivos entregando tus modelos grandes solo a los dispositivos que puedan ejecutarlos.
Para subdividir tus paquetes de IA por grupos de dispositivos, toma los directorios de paquetes de IA existentes que creaste en el último paso y agrega el sufijo correspondiente a las carpetas (como se describe a continuación) con #group_myCustomGroup1, #group_myCustomGroup2, etcétera. Cuando uses los paquetes de IA en tu app, no necesitarás agregar el sufijo a las carpetas (en otras palabras, el sufijo se quita automáticamente durante el proceso de compilación).
Después del paso anterior, podría verse así:
...
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup1/
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup2/
...
En este ejemplo, harías referencia a ai-pack-name/assets/image-classifier/
sin ningún sufijo.
Los dispositivos en myCustomGroup1
recibirán todos los recursos en image-classifier#group_myCustomGroup1/
, mientras que los dispositivos en myCustomGroup2
recibirán todos los recursos en image-classifier#group_myCustomGroup2/
.
Los dispositivos que no pertenezcan a myCustomGroup1
ni a myCustomGroup2
recibirán un paquete ai-pack-name
vacío.
Esto se debe a que los dispositivos que no coincidan con ningún grupo de dispositivos recibirán la variante predeterminada de tu paquete de IA. Esto incluye todo lo que no esté dentro de un directorio con un #group_suffix
.
Una vez que hayas descargado el paquete de IA, puedes verificar si tu modelo está presente con AssetManager para los paquetes de instalación o AiPackManager para los paquetes de seguimiento rápido y a pedido. En la app de ejemplo, se muestran ejemplos para realizar esta acción en todos los modos de entrega.
Usa la segmentación por dispositivo para tus módulos de funciones
También puedes usar la segmentación por dispositivo para los módulos de funciones. En lugar de subdividir los módulos de funciones por grupo de dispositivos, debes especificar si se debe entregar el módulo completo según la pertenencia al grupo de dispositivos.
Para entregar un módulo de funciones a los dispositivos que pertenecen a myCustomGroup1
o myCustomGroup2
, modifica su 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>
Realiza pruebas locales
Antes de crear una versión para tu nuevo paquete, puedes realizar pruebas locales con el uso compartido interno de apps o Bundletool.
Uso compartido de apps a nivel interno
El uso compartido interno de apps te permite usar un paquete de aplicación para generar rápidamente una URL en la que puedes presionar en un dispositivo local para instalar exactamente lo que Google Play instalaría para ese dispositivo si esa versión de la app estuviera publicada en un segmento de prueba o de producción.
Consulta las instrucciones para compartir apps a nivel interno.
Bundletool
Como alternativa, puedes generar APKs con bundletool
(1.18.0 o versiones posteriores) y transferirlos de forma local a tu dispositivo. Sigue estos pasos para probar tu app de forma local con bundletool:
Compila tu paquete de aplicación con Android Studio o bundletool.
Genera APK con la marca
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
Conecta un dispositivo y ejecuta
bundletool
para transferir los 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
Limitaciones de las pruebas locales con bundletool
Las siguientes son limitaciones de las pruebas locales con bundletool:
- Los paquetes
fast-follow
se comportan como paqueteson-demand
. Es decir, no se recuperarán automáticamente cuando se transfiera la app. Los desarrolladores deben solicitarlos de forma manual cuando se inicie la app; esto no requiere cambios de código en la app. - Los paquetes se recuperan del almacenamiento externo en lugar de Play, por lo que no puedes probar cómo se comporta tu código en caso de errores de red.
- Las pruebas locales no abarcan la situación de espera de Wi-Fi.
- No se admiten actualizaciones. Antes de instalar una versión nueva de tu compilación, desinstala la versión anterior de forma manual.
Verifica que se instalen los APKs correctos
Usa el siguiente método para asegurarte de que solo se instalen los APKs correctos en el dispositivo.
adb shell pm path {packageName}
Deberías ver algo como lo siguiente:
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
Ten en cuenta que solo verás los APKs en esta lista, que se crean a partir de módulos de funciones y paquetes de IA en el momento de la instalación. Los paquetes de IA a pedido y de seguimiento rápido no se instalan como APKs.
Prueba y lanza en Google Play
Te recomendamos que pruebes tu app de extremo a extremo en Google Play con un segmento de pruebas internas.
Una vez que lo hagas, podrás lanzar de forma incremental la actualización de tu app para producción con lanzamientos en etapas.
App de ejemplo que usa Play para la IA integrada en el dispositivo
Descarga la app de ejemplo.
En él, se muestra cómo usar cada uno de los modos de entrega, así como la configuración de segmentación por dispositivo. Consulta la sección Pruebas locales para comenzar.
Contenido relacionado
Obtén más información sobre los Android App Bundles y consulta las referencias del SDK de AI Delivery.