Cómo configurar la entrega durante la instalación

Los módulos de funciones dinámicas te permiten separar determinadas funciones y recursos del módulo base de tu app, pero los incluyen en el paquete de aplicación. Con Dynamic Delivery, puedes personalizar las opciones de entrega para controlar cuándo y de qué manera los dispositivos con Android 5.0 (nivel de API 21) o superior descargan las funciones de tu app.

Ten en cuenta que este tipo de modularización requiere más esfuerzo y, posiblemente, refactorizar el código existente de tu app, de modo que deberás considerar con cuidado cuáles de las funciones de la app sería mejor ofrecer a los usuarios on demand.

Si deseas modularizar de manera gradual las funciones de la app con el tiempo, sin cambiar el comportamiento ni personalizar las opciones de entrega avanzadas, puedes hacerlo creando módulos de funciones dinámicas que estén configurados para la entrega durante la instalación. Es decir, puedes modularizar una función como función dinámica, pero no habilitar las opciones avanzadas para que la función esté disponible cuando un usuario instala tu app.

Además, puede ser útil crear funciones dinámicas que puedas configurar para la entrega durante la instalación porque tienes la opción de desinstalarlas más tarde si ya no son necesarias. Por ejemplo, para reducir el tamaño de instalación de tu app, puedes modularizar el contenido que se requiere para entrenamiento o integración, y luego, desinstalar el módulo de funciones dinámicas después de que el usuario esté configurado para usar la app.

En esta sección, se describe cómo crear un módulo de funciones dinámicas para la entrega durante la instalación. Antes de comenzar, asegúrate de estar usando Android Studio 3.3 o superior y el complemento Gradle para Android 3.3.0 o superior.

Cómo configurar un nuevo módulo para la entrega durante la instalación

La forma más fácil de crear un nuevo módulo de funciones dinámicas es con Android Studio 3.3 o superior. Debido a que los módulos de funciones dinámicas tienen una dependencia inherente del módulo de la app de base, solo puedes agregarlos a proyectos de apps existentes.

Para agregar un módulo de funciones dinámicas al proyecto de tu app con Android Studio, sigue estos pasos:

  1. Si aún no lo hiciste, abre el proyecto de tu app en el IDE.
  2. Selecciona File > New > New Module en la barra de menú.
  3. En el diálogo Create New Module, selecciona Dynamic Feature Module y haz clic en Next.
  4. En la sección Configure your new module, completa lo siguiente:
    1. En el menú desplegable Base application module, selecciona el módulo base de tu app.
    2. En Module name, especifica el nombre del módulo. El IDE usa este nombre para identificar el módulo como un subproyecto de Gradle en tu archivo de configuración de Gradle. Cuando compilas tu paquete de aplicación, Gradle usa el último elemento del nombre del subproyecto para insertar el atributo <manifest split> en el manifiesto del módulo de funciones dinámicas.
    3. Especifica el nombre del paquete del módulo. De manera predeterminada, Android Studio sugiere un nombre de paquete que combina el nombre del paquete raíz del módulo base y el nombre del módulo que especificaste en el paso anterior.
    4. Selecciona el nivel de API mínimo que deseas que admita el módulo. Este valor debe coincidir con el del módulo base.
  5. Haz clic en Next.
  6. En la sección Configure On-Demand Options, desmarca la casilla que aparece junto a Enable on-demand. Si deseas aprender a crear una función dinámica que puedas descargar después de instalar la app, lee Cómo configurar la entrega on demand.
  7. Haz clic en Finish.

Después de que Android Studio termine de crear tu módulo, inspecciona el contenido tú mismo desde el panel Project (selecciona View > Tool Windows > Project en la barra de menú). El código, los recursos y la organización predeterminados deben ser similares a los del módulo de app estándar.

Configuración de compilación del módulo de funciones dinámicas

Cuando creas un nuevo módulo de funciones dinámicas con Android Studio, el IDE aplica el siguiente complemento de Gradle al archivo build.gradle del módulo.

// The following applies the dynamic-feature plugin to your dynamic feature module.
    // The plugin includes the Gradle tasks and properties required to configure and build
    // an app bundle that includes your dynamic feature module.

    apply plugin: 'com.android.dynamic-feature'
    

Muchas de las propiedades disponibles para el complemento de app estándar también están disponibles para tu módulo de funciones dinámicas. En las siguientes secciones, se describen las propiedades que deberías y las que no deberías incluir en la configuración de compilación de tu módulo de funciones dinámicas.

Elementos que no debes incluir en la configuración de compilación del módulo de funciones dinámicas

Debido a que cada módulo de funciones dinámicas depende del módulo base, también hereda ciertas configuraciones. Por lo tanto, debes omitir lo siguiente en el archivo build.gradle del módulo de funciones dinámicas:

  • Configuraciones de firma: los paquetes de aplicación se firman utilizando las configuraciones de firma que especificas en el módulo base.
  • La propiedad minifyEnabled: puedes habilitar la reducción de código para todo el proyecto de la app solo desde la configuración de compilación del módulo base. Por lo tanto, debes omitir esta propiedad de los módulos de funciones dinámicas. No obstante, puedes especificar reglas adicionales de ProGuard para cada módulo de funciones dinámicas.
  • versionCode y versionName: cuando se compila el paquete de aplicación, Gradle utiliza la información de versión de la app que proporciona el módulo base. Debes omitir estas propiedades del archivo build.gradle de tu módulo dinámico.

Cómo establecer una relación con el módulo base

Cuando Android Studio crea tu módulo de funciones dinámicas, lo hace visible para el módulo base agregando la propiedad android.dynamicFeatures al archivo build.gradle del módulo base, como se muestra a continuación:

// In the base module’s build.gradle file.
    android {
        ...
        // Specifies dynamic feature modules that have a dependency on
        // this base module.
        dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
    }
    

Además, Android Studio incluye el módulo base como una dependencia del módulo de funciones dinámicas, como se muestra a continuación:

// In the dynamic feature module’s build.gradle file:
    ...
    dependencies {
        ...
        // Declares a dependency on the base module, ':app'.
        implementation project(':app')
    }
    

Cómo especificar reglas adicionales de ProGuard

Aunque solo la configuración de compilación del módulo base puede habilitar la reducción del código para el proyecto de tu app, puedes proporcionar reglas de ProGuard personalizadas con cada módulo de funciones dinámicas utilizando la propiedad proguardFiles, como se muestra a continuación.

android.buildTypes {
         release {
             // You must use the following property to specify additional ProGuard
             // rules for dynamic feature modules.
             proguardFiles 'proguard-rules-dynamic-features.pro'
         }
    }
    

Ten en cuenta que estas reglas de ProGuard se fusionan con las de otros módulos (incluido el módulo base) en el momento de la compilación. Por lo tanto, si bien cada módulo de funciones dinámicas puede especificar un nuevo conjunto de reglas, esas reglas se aplican a todos los módulos del proyecto de la app.

Cómo implementar la app

Mientras desarrollas tu app con compatibilidad con Dynamic Delivery, puedes implementarla en un dispositivo conectado como lo harías normalmente, es decir, seleccionando Run > Run en la barra de menú (o haciendo clic en Run en la barra de herramientas).

Si el proyecto de tu app incluye uno o más módulos de funciones dinámicas, puedes elegir qué funciones dinámicas incluir cuando implementas la app modificando la configuración de ejecución/depuración existente de la siguiente manera:

  1. Selecciona Run > Edit Configurations en la barra de menú.
  2. En el panel izquierdo del diálogo Run/Debug Configurations, selecciona la configuración de la app para Android que desees.
  3. En Dynamic features to deploy, en la pestaña General, marca la casilla junto a cada módulo de funciones dinámicas que deseas incluir en la implementación de la app.
  4. Haz clic en OK.

De manera predeterminada, Android Studio no implementa la app usando paquetes de aplicación para implementar tu app. En cambio, el IDE crea e instala en tu dispositivo los APK optimizados para la velocidad de implementación, en lugar del tamaño del APK. Para configurar Android Studio para que compile e implemente APK y experiencias instantáneas desde un paquete de aplicación, modifica la configuración de ejecución/depuración.

Recursos adicionales

Para obtener más información sobre la compatibilidad con Dynamic Delivery, consulta el siguiente recurso.

Entradas de blog (en inglés)

Videos (en inglés)