Programa de acceso anticipado (PAA) de Play para IA integrada en el dispositivo

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:

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:

  1. Proporciona el ID de tu cuenta de desarrollador de Play a Google Play para unirte al EAP.
  2. Empaqueta tus modelos en paquetes de IA en tu Android App Bundle y especifica cómo se deben entregar los paquetes de IA.
  3. [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.
  4. [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.
  5. 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.

  1. 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.
  2. 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 ]"
        }
    }
    
  3. 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"]
    }
    
  4. 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'
    
  5. Dentro de tu paquete de IA, crea un directorio src/main/assets/.

  6. 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
  7. 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.

  8. [Opcional] Configura la segmentación por dispositivos para publicar diferentes modelos en diferentes dispositivos.

  9. 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:

Descripción general de los pasos obligatorios

Para habilitar la segmentación por dispositivo, sigue estos pasos:

  1. Define tus grupos de dispositivos en un archivo en formato XML.
  2. Especifica qué partes del paquete deben ir a qué grupos de dispositivos.
  3. [Opcional] Prueba la configuración de forma local.
  4. 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.

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").

    Página del Pixel 4a en el catálogo de dispositivos

    Página del Pixel 4a en el catálogo de dispositivos

  • 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:

  1. Compila tu paquete de aplicación con Android Studio o bundletool.

  2. 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
    
  3. 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 paquetes on-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.

Obtén más información sobre los Android App Bundles y lee las referencias del SDK de entrega de IA.