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 IA personalizados para que puedas mejorar el rendimiento de los modelos con menos complejidad del ecosistema y sin costo adicional. Te permite publicar un solo artefacto en Play que contenga tu código, tus recursos y tus modelos de AA, y elegir entre una serie de modos de publicación 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 a Play sin costo adicional.
- Publica tus modelos de AA en el tiempo de instalación, en el seguimiento rápido o a pedido.
- La entrega durante el tiempo de instalación puede garantizar que haya un modelo muy grande cuando se abre la app. Tu modelo se instalará como un APK.
- La entrega posterior rápida se realiza 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 tu app.
- La entrega a pedido te permite solicitar el modelo durante el tiempo de ejecución, lo que es útil si el modelo solo se requiere para ciertos flujos de usuarios. Tu modelo se descargará en el espacio de almacenamiento interno de tu app.
- Publica variantes de tus modelos de AA segmentadas para dispositivos específicos según el modelo del dispositivo, 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 IA integrada 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.
- Se espera que los desarrolladores que participan en el programa de acceso anticipado evalúen Play para IA integrada en el dispositivo y proporcionen comentarios a Google Play.
- Solo la app que descargó el modelo puede usar los modelos que descargó Play para la IA integrada en el dispositivo. Los modelos no se deben ofrecer a otras apps, por ejemplo, a través de una conexión de servicio.
- Los paquetes de IA individuales pueden tener hasta 1.5 GB, según sus tamaños de descarga comprimidos. El tamaño máximo acumulativo 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 de tamaño deben establecer el nivel de SDK mínimo en 21 o una versión posterior.
- Durante el programa de acceso anticipado, Play para IA integrada en el dispositivo está sujeto a cambios.
Cómo usar Play para la IA integrada en el dispositivo
Play para la IA integrada en el dispositivo usa paquetes de IA. Empaquetas modelos personalizados que están listos para su distribución en paquetes de IA en tu paquete de aplicación. Puedes elegir si el paquete de IA se debe entregar en el momento de la instalación, en el seguimiento rápido o a pedido.
Si empaquetas 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 garantiza 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/Kotlin. Si necesitas enviar bibliotecas o código para ejecutar tu modelo de AA, muévelo al módulo base 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:
- Cómo comenzar a usar LiteRT
- En la app de ejemplo, se muestra cómo puedes empaquetar un modelo de LiteRT en un paquete de IA y cargarlo durante el tiempo de ejecución.
- Existen muchos modelos LiteRT previamente entrenados que puedes usar en 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.,
.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.,
Comienza a usar los paquetes de IA
A grandes rasgos, puedes comenzar a usar Play para la IA integrada en el dispositivo de la siguiente manera:
- Proporciona el ID de tu cuenta de desarrollador de Play a Google Play para unirte al EAP.
- 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 modelos diferentes para diferentes dispositivos, puedes configurar la segmentación por dispositivos para tus paquetes de IA. Por ejemplo, puedes 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 no podrían 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 tus paquetes de IA según sea necesario.
- Prueba y lanza tu paquete de aplicación en Google Play.
Proporciona el ID de tu cuenta de desarrollador de Play
Como esta función está en acceso anticipado, tu cuenta de desarrollador debe estar en la lista de entidades permitidas para tener acceso a Play para IA integrada en el dispositivo. Confirma los IDs de cuenta de desarrollador de Play y los nombres de los paquetes de la app a tu administrador de socios de Google Play o a un miembro del equipo de Play for On-device AI. Especifica si segmentarás tus modelos para dispositivos específicos (este es el paso 3 de la sección anterior). Por el momento, estamos invitando a socios seleccionados de Play a probar esta función.
Cómo verificar la versión del complemento de Android para Gradle
Para usar paquetes de IA, asegúrate de que la versión del complemento de Android para Gradle (AGP) sea de al menos 8.8. Esta versión se empaqueta con 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 publicación de tus paquetes de IA. Consulta las instrucciones para install-time y fast-follow/on-demand 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 tiempo de instalación están disponibles de inmediato cuando se inicia la app. Usa la API de Java AssetManager 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.
Cómo declarar la dependencia de la biblioteca de Play AI Delivery
En el archivo build.gradle
de tu app, declara una dependencia en la biblioteca de entrega de IA de Play:
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 |
Los paquetes de IA desconocidos o los paquetes de IA no están disponibles |
Obtén información de descarga sobre los 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 muestra 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:
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 muestra el estado de descarga y no se inicia 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 mediante 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 obligatoria del usuario
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ó a través de una transferencia lateral. Ten en cuenta que llamar a showConfirmationDialog()
en este caso 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 mediante 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 control más detallado sobre qué partes del paquete de aplicación se entregan a dispositivos específicos. Por ejemplo, puedes asegurarte de que un modelo grande solo se publique en dispositivos con mucha RAM o puedes publicar diferentes versiones de un modelo en diferentes dispositivos.
Puedes segmentar tus anuncios para propiedades de dispositivos, como las siguientes:
- Sistema en chip
- Modelo del dispositivo
- RAM del dispositivo
- Funciones del sistema
Descripción general de los pasos obligatorios
Para habilitar la segmentación por dispositivo, sigue estos pasos:
- Define tus grupos de dispositivos en un archivo en formato XML.
- Especifica qué partes del paquete deben ir a qué grupos de dispositivos.
- [Opcional] Prueba la configuración de forma local.
- Sube tu paquete (que contiene el archivo en formato XML) a Google Play.
Cómo verificar la versión del complemento de Android para Gradle
Para usar la segmentación de dispositivos, asegúrate de que la versión del complemento de Android para Gradle (AGP) sea de al menos 8.10.0-alpha01. Se empaqueta con Android Studio Meerkat 2, que está en Canary.
Habilita esta función en el complemento de Android para Gradle
La segmentación por dispositivo debe estar habilitada de forma explícita en tu archivo gradle.properties
:
android.experimental.enableDeviceTargetingConfigApi=true
Crea un archivo en formato XML de configuración de segmentación por dispositivo
El archivo de configuración de segmentación de dispositivos es un archivo en formato XML en el que defines tus grupos de dispositivos personalizados. Por ejemplo, puedes 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 alguno de sus selectores de dispositivos.
Un selector de dispositivos puede tener una o más propiedades de dispositivo. Se selecciona un dispositivo 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 define primero en el archivo en formato XML. El orden en el que defines los grupos en el archivo XML es el 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 cualquier device_id de la lista.
- build_brand: Es el 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: Es el fabricante del dispositivo.
- build_device: Código del modelo del dispositivo
required_system_features: Funciones que un dispositivo debe tener para que se 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 funciones del sistema
- name: Es una función del sistema.
forbidden_system_features: 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 funciones del sistema
- name: Es una función del sistema.
system-on-chip: Es el sistema en chip que se incluirá 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 de todas las propiedades de dispositivos posibles:
<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 de fabricante y modelo de dispositivos
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 mediante 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.
Cómo incluir 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 tu archivo de configuración se empaquete con el paquete de la app.
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
Para mantener el tamaño optimizado en los dispositivos, solo debes enviar tus modelos grandes 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 aplica el postfijo a las carpetas adecuadas (como se describe a continuación) con #group_myCustomGroup1, #group_myCustomGroup2, etc. Cuando uses los paquetes de IA en tu app, no necesitarás dirigirte a las carpetas por postfijo (en otras palabras, el postfijo 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 de image-classifier#group_myCustomGroup1/
, mientras que los dispositivos en myCustomGroup2
recibirán todos los recursos de 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 paquetes de tiempo de instalación o AiPackManager para paquetes de seguimiento rápido y a pedido. Se muestran ejemplos para hacerlo en todos los modos de publicación en la app de ejemplo.
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, especificas si se debe entregar todo el módulo según la pertenencia al grupo de dispositivos.
Para entregar un módulo de funciones a 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>
Cómo realizar pruebas locales
Antes de crear una versión para tu nuevo paquete, puedes realizar pruebas de forma local 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 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 una versión de prueba o de producción.
Consulta las instrucciones para usar el uso compartido interno de apps.
Bundletool
Como alternativa, puedes generar APKs con bundletool
(1.18.0 o versiones posteriores) y transferirlos 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 inicia la app; esto no requiere cambios de código en la app. - Los paquetes se recuperan de 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 APKs en esta lista, que están hechos 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 APK.
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 la actualización de tu app de forma incremental a producción con lanzamientos en etapas.
App de ejemplo que usa Play para la IA integrada en el dispositivo
Comunícate con tu administrador de socios de Google Play para obtener acceso a nuestra app de ejemplo.
En él, se muestra cómo usar cada uno de los modos de publicación, así como la configuración de segmentación por dispositivo. Consulta la sección Pruebas locales para comenzar.
Envía comentarios
Los participantes del programa de acceso anticipado deben informar problemas y proporcionar comentarios. Puedes comunicarte con tu administrador de socios de Google Play o con el equipo de Play para IA integrada en el dispositivo.
Contenido relacionado
Obtén más información sobre los Android App Bundles y lee las referencias del SDK de entrega de IA.