Los módulos de funciones te permiten separar determinados recursos y funciones del módulo base de tu app y, de esta manera, incluirlos en el paquete de aplicación. Luego, puedes personalizar las opciones de entrega para controlar cuándo y cómo las funciones de tu app descargarán los dispositivos con Android 5.0 (nivel de API 21) o superior.
Ten en cuenta que este tipo de modularización requiere más esfuerzo, y es probable que tengas que 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 pedido.
Si deseas modularizar gradualmente las funciones de la app con el transcurso del tiempo, sin cambiar el comportamiento de la app ni personalizar las opciones de entrega avanzadas, puedes crear módulos de funciones configurados para la entrega en el momento de la instalación. Es decir, puedes modularizar una función como un módulo de funciones, pero no habilitar opciones avanzadas para que esta esté disponible cuando un usuario instale tu app.
Además, puede ser útil crear módulos de funciones que configures para la entrega durante la instalación, ya que tienes la opción de desinstalar esas funciones más tarde si ya no son necesarias. Por ejemplo, a fin de reducir el tamaño de instalación de tu app, puedes modularizar el contenido necesario para el entrenamiento o la integración y, luego, desinstalar el módulo de funciones después de que se haya configurado el usuario para usar tu app.
En esta sección, se describe cómo crear un módulo de funciones para la entrega en el momento de la instalación. Antes de comenzar, asegúrate de estar usando Android Studio 3.5 o una versión posterior y el complemento de Gradle para Android versión 3.5.0 o posterior.
Configura un módulo nuevo para la entrega en el momento de la instalación
La forma más fácil de crear un nuevo módulo de funciones es con Android Studio 3.5 o una versión posterior. Dado que los módulos de funciones 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 a tu proyecto de app con Android Studio, haz lo siguiente:
- Si aún no lo hiciste, abre tu proyecto de app en el IDE.
- Selecciona File > New > New Module en la barra de menú.
- En el cuadro de diálogo Create New Module, elige Dynamic Feature Module y haz clic en Next.
- En la sección Configure your new module, haz lo siguiente:
- En el menú desplegable Base application module, selecciona el módulo base de tu app.
- En Module name, especifica el nombre del módulo. El IDE usa ese nombre para identificar el módulo como un subproyecto de Gradle en tu archivo de configuración de Gradle. Cuando creas tu paquete de aplicación, Gradle usa el último elemento del nombre del subproyecto para ingresar el atributo
<manifest split>
en el manifiesto del módulo de funciones. - En Package name, especifica el nombre de paquete del módulo. De forma 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.
- En Minimum API level, elige el nivel mínimo de API que admitirá el módulo. Este valor debe coincidir con el del módulo base.
- Haz clic en Next.
En la sección Module Download Options, haz lo siguiente:
En Module title, especifica el título del módulo, que puede tener hasta 50 caracteres. El módulo base de la app debe incluir el título del módulo como recurso de strings, que se puede traducir. Cuando se crea el módulo con Android Studio, el IDE agrega el recurso de strings al módulo base y, luego, inserta la siguiente entrada en el manifiesto del módulo de funciones:
<dist:module ... dist:title="@string/feature_title"> </dist:module>
En el menú desplegable, en Install-time inclusion, selecciona Include module at install-time. Android Studio introduce lo siguiente en el manifiesto del módulo para reflejar tu elección:
<dist:module ... > <dist:delivery> <dist:install-time /> </dist:delivery> </dist:module>
Puedes obtener información para crear un módulo de funciones que puedas descargar después de instalar la app en Cómo configurar la entrega a pedido.
Marca la casilla junto a Fusing si deseas que ese módulo esté disponible para los dispositivos que ejecutan Android 4.4 (nivel de API 20) y versiones anteriores, y se lo incluya en APK múltiples. Eso significa que puedes omitir la fusión en dispositivos que no admiten la descarga ni la instalación de APK divididos. Android Studio introduce lo siguiente en el manifiesto del módulo para reflejar tu elección:
<dist:module ...> <dist:fusing dist:include="true | false" /> </dist:module>
Haz clic en Finish.
Cuando Android Studio termine de crear tu módulo, abre el panel Project y revisa el contenido (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 de módulos de funciones
Cuando creas un nuevo módulo de funciones 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 feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your 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 a fin de que puedas utilizarlas en tu módulo de funciones. 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.
Elementos que no debes incluir en la configuración de compilación del módulo de funciones
Debido a que cada módulo de funciones depende del módulo base, también hereda ciertas configuraciones. Por lo tanto, en el archivo build.gradle
del módulo de funciones, debes omitir lo siguiente:
- Configuraciones de firma: los paquetes de aplicación se firman con 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 esa propiedad en los módulos de funciones. No obstante, puedes especificar reglas adicionales de ProGuard para cada módulo de funciones. versionCode
yversionName
: 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 esas propiedades del archivobuild.gradle
de tu módulo de funciones.
Cómo establecer una relación con el módulo base
Cuando Android Studio crea tu módulo de funciones, 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 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, según se muestra a continuación:
// In the 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 a través de la propiedad proguardFiles
, como se muestra a continuación.
android.buildTypes {
release {
// You must use the following property to specify additional ProGuard
// rules for 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) durante la compilación. Por lo tanto, si bien cada módulo de funciones 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 una app compatible con módulos de funciones, puedes implementarla en un dispositivo conectado como lo harías normalmente 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, puedes elegir cuáles funciones incluir cuando implementas la app modificando la configuración de ejecución y depuración existente de la siguiente manera:
- Selecciona Run > Edit configuraciones en la barra de menú.
- En el panel izquierdo del cuadro de diálogo Run/Debug Configurations, elige la configuración de Android App que desees.
- En Dynamic features to deploy, en la pestaña General, marca la casilla junto a cada módulo de funciones dinámicas que desees incluir cuando implementes la app.
- Haz clic en OK.
De forma predeterminada, Android Studio no implementa la app usando paquetes de aplicación. En cambio, el IDE crea y luego instala en tu dispositivo los APK optimizados para la velocidad de implementación, en lugar del tamaño del APK. Si quieres configurar Android Studio para que compile y posteriormente implemente APK y experiencias instantáneas desde un paquete de aplicación, modifica la configuración de ejecución y depuración.
Recursos adicionales
Para obtener más información sobre cómo usar los módulos de funciones, consulta los siguientes recursos.
Entradas de blog
- Nuevas funciones que ayudan a desarrollar, lanzar y expandir tu empresa en Google Play
- Últimas actualizaciones de Android App Bundle, incluida la API de idiomas adicionales (en inglés)
- La reinvención de Plaid: Una historia de modularización (en inglés)