Cómo configurar el módulo base

La mayoría de los proyectos de apps no requieren mucho esfuerzo para admitir Dynamic Delivery. Eso se debe a que el módulo que incluye código y recursos del APK de base de tu app es el estándar, que obtienes de forma predeterminada cuando creas un nuevo proyecto de app en Android Studio. Es decir, el módulo que aplica el complemento de la app indicado a continuación a su archivo build.gradle proporciona el código y los recursos para la funcionalidad básica de la app.

// The standard application plugin creates your app's base module.
    apply plugin: 'com.android.application'
    

Si te interesa reducir el tamaño de descarga inicial de la app, es importante tener en cuenta que todo el código y los recursos incluidos en este módulo se incluyen en el APK de base de la app.

Además de proporcionar la funcionalidad principal de tu app, el módulo base también incluye muchas de las configuraciones de compilación y entradas del manifiesto que afectan todo el proyecto de la app. Por ejemplo, la firma del paquete de aplicación está determinada por la información que se proporciona para el módulo base, y las versiones de todos los APK de tu app se especifican en el atributo versionCode en el manifiesto del módulo base. A continuación, se describen otros aspectos importantes del módulo base.

El manifiesto del módulo base

El manifiesto del módulo base de tu app es similar al de cualquier otro módulo de app. Ten en cuenta que, cuando Google Play genera el APK de base de la app, combina los manifiestos de todos los módulos en ese APK de base. Por lo tanto, si piensas agregar módulos de funciones dinámicas al proyecto de app, debes tener en cuenta algunos aspectos del manifiesto del APK de base:

  • Dado que el APK de base siempre se instala primero, debe proporcionar el punto de entrada principal para la app. Es decir, debe declarar una actividad con el siguiente filtro de intent:

    <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        
  • Al descargar módulos de funciones dinámicas on demand, los dispositivos que ejecutan Android 6.0 (nivel de API 23) y versiones anteriores requieren que la app se reinicie para poder completar la instalación de los nuevos módulos. Sin embargo, si deseas tener la posibilidad de acceder al código y los recursos del módulo descargado inmediatamente después de la descarga, debes incluir compatibilidad con la biblioteca SplitCompat en el manifiesto. Para obtener más información, lee Código de acceso y recursos de los módulos descargados.

  • Del mismo modo, en dispositivos con Android 6.0 (nivel de API 23) y versiones anteriores, las apps deben reiniciarse antes de que la plataforma pueda aplicar nuevas entradas de manifiesto. Por lo tanto, si se exigen ciertos permisos o servicios tan pronto como se descarga un módulo de funciones dinámicas, puedes incluirlos en el manifiesto del módulo base.

  • Los paquetes Android App Bundle son compatibles con bibliotecas nativas sin comprimir. Entonces, si incluyes bibliotecas nativas en la app y deseas reducir el uso del disco, incorpora lo siguiente en el manifiesto del módulo base:

    <application
            android:extractNativeLibs="false"
            ... >
        

Configuración de compilación del módulo base

Para la mayoría de los proyectos de apps existentes, no es necesario cambiar nada en la configuración de compilación del módulo base. Sin embargo, si piensas agregar módulos de funciones dinámicas a tu proyecto de app, debes tener en cuenta algunos aspectos de la configuración de compilación del módulo base:

  • Firma de app: no necesitas incluir información de firma en el archivo de configuración de compilación a menos que desees compilar el paquete de aplicación desde la línea de comandos. Sin embargo, si incluyes información de firma, debes incluirla solo en el archivo de configuración de compilación del módulo base. Para obtener más información, consulta Cómo configurar Gradle para firmar tu app.
  • Reducción de código: si deseas habilitar la reducción de código para todo el proyecto de app (incluidos los módulos de funciones dinámicas), debes hacerlo desde el archivo build.gradle del módulo base. Es decir, puedes incluir reglas personalizadas de ProGuard en un módulo de funciones dinámicas, pero se omite la propiedad minifyEnabled en las configuraciones de compilación de módulos de funciones dinámicas.
  • El bloque splits se ignora: al compilar un paquete de aplicación, Gradle omite las propiedades del bloque android.splits. Si deseas controlar qué tipos de APK de configuración admite tu paquete de aplicación, use android.bundle para inhabilitar tipos de APK de configuración.
  • Control de versiones de la app: el módulo base determina el código y el nombre de la versión para todo el proyecto de app. Para obtener más información, consulta la sección sobre cómo administrar las actualizaciones de la app.

Cómo habilitar o inhabilitar tipos de APK de configuración

De manera predeterminada, cuando se compila un paquete de aplicación, es posible generar APK de configuración para cada conjunto de recursos de idioma, recursos de densidad de pantalla y bibliotecas ABI. Con el bloque android.bundle en el archivo build.gradle del módulo base, como se muestra a continuación, puedes inhabilitar la compatibilidad con uno o más tipos de APK de configuración:

android {
        // When building Android App Bundles, the splits block is ignored.
        splits {...}

        // Instead, use the bundle block to control which types of configuration APKs
        // you want your app bundle to support.
        bundle {
            language {
                // Specifies that the app bundle should not support
                // configuration APKs for language resources. These
                // resources are instead packaged with each base and
                // dynamic feature APK.
                enableSplit = false
            }
            density {
                // This property is set to true by default.
                enableSplit = true
            }
            abi {
                // This property is set to true by default.
                enableSplit = true
            }
        }
    }
    

Cómo administrar actualizaciones de apps

Con los paquetes Android App Bundle y Dynamic Delivery, ya no es necesario administrar códigos de versión para varios APK que se cargan en Google Play. En cambio, solo debes administrar un código de versión en el módulo base de la app, tal como se muestra a continuación:

// In your base module build.gradle file
    android {
        defaultConfig {
            …
            // You specify your app’s version code only in the base module.
            versionCode 5
            versionName "1.0"
        }
    }
    

Después de cargar el paquete de aplicación, Google Play usa el código de versión del módulo base para asignar el mismo código de versión a todos los APK que genera a partir de ese paquete. Es decir, cuando un dispositivo descarga e instala tu app, todos los APK divididos para esa app comparten el mismo código de versión.

Cuando desees actualizar tu app con nuevo código o recursos, debes actualizar el código de versión en el módulo base de la app y compilar un nuevo paquete de aplicación completo. Cuando cargas ese paquete de aplicación en Google Play, se genera un nuevo conjunto de APK en función del código de versión especificado en el módulo base. Posteriormente, cuando los usuarios actualizan la app, Google Play entrega versiones actualizadas de todos los APK instalados en el dispositivo. Es decir, todos los APK instalados se actualizan al nuevo código de versión.

Cómo descargar APK de configuración adicionales

Una excepción al proceso de actualización descrito anteriormente es cuando una app instalada requiere APK de configuración adicionales. Por ejemplo, piensa en un usuario que cambia el idioma predeterminado del sistema después de descargar tu app. Si la app admite ese idioma, el dispositivo solicita y descarga APK de configuración adicionales para esos recursos de idioma de Google Play. Sin embargo, este tipo de actualización de la app no cambia el código de versión, por lo que el dispositivo descarga e instala solo los APK de configuración que requiere.