Cómo configurar el módulo base

La mayoría de los proyectos de apps no requieren mucho esfuerzo para admitir Android App Bundles. Eso se debe a que el módulo que incluye código y recursos del APK 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 tu 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 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 de tu paquete de aplicación está determinada por la información que proporcionas para el módulo base, y en el atributo versionCode del manifiesto de tu módulo base se especifican todos los APK de tu app. 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 base de tu app, combina los manifiestos de todos los módulos con ese APK base. Por lo tanto, si estás considerando agregar módulos de funciones al proyecto de tu app, debes tener en cuenta algunos aspectos del manifiesto del APK base:

  • Como el APK base siempre se instala primero, debe proporcionar el punto de entrada principal para tu app. Es decir, debe declarar una actividad con el siguiente filtro de intents:

    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    
  • Deberías incluir en tu manifiesto compatibilidad para la biblioteca SplitCompat a fin de acceder a los recursos y al código del módulo descargado. Para obtener más información, consulta 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 para que la plataforma pueda aplicar nuevas entradas de manifiesto. Por lo tanto, si se exigen ciertos permisos o servicios en cuanto se descarga un módulo de funciones, puedes incluirlos en el manifiesto del módulo base.

  • Los paquetes Android App Bundle son compatibles con bibliotecas nativas sin comprimir. Cuando compilas tu app con el complemento de Gradle para Android 3.6.0 o una versión posterior, a fin de reducir el uso del disco para los usuarios, el complemento establece lo siguiente en el manifiesto del módulo base de forma predeterminada:

    <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 a tu proyecto de app, debes tener en cuenta algunos aspectos de la configuración de compilación del módulo base:

  • Firma de apps: 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 la app (incluidos sus módulos de funciones), 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, pero se omitirá la propiedad minifyEnabled en las configuraciones de compilación de módulos de funciones.
  • Se omite el bloque splits: cuando compilas 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, usa 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 la app. Si deseas obtener más información, consulta la sección Cómo administrar actualizaciones de apps.

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

De forma 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
            // 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 Android App Bundles, ya no es necesario que administres códigos de versión para varios APK que subas a 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 subir 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.

Si deseas actualizar tu app con código o recursos nuevos, deberás 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 subes ese paquete de aplicación a 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, se actualizan todos los APK instalados 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 el caso de las apps instaladas que requieren 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 los 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.