Cómo configurar tu compilación para los APK de configuración

Para reducir el tamaño del APK de tu app en el dispositivo de cada usuario, puedes configurar la compilación en los APK de configuración (o APK de config). De esa forma, se colocan el código DEX de la app y los recursos independientes del dispositivo en un APK, y los recursos y conjuntos de código nativo que dependen del dispositivo en APK separados. Entonces, los dispositivos solo solicitan los APK necesarios para ejecutar tu app, lo que permite reducir su tamaño de descarga mediante la creación de APK que contienen archivos para densidades de pantalla, ABI o idiomas específicos.

Los APK de configuración son similares a la opción de varios APK, con algunas diferencias importantes:

  • Actualmente, la opción de varios APK solo está disponible para las apps instaladas, y los APK de configuración solo para apps instantáneas.
  • Con varios APK, se crea uno para cada combinación de atributos. Con los APK de configuración, hay uno base con un código DEX independiente del dispositivo y un APK para cada valor de cada dimensión diferente (es decir, un APK por idioma, densidad o ABI admitidos). Por ejemplo, piensa en una app que varía según la densidad y el idioma, y que admite cuatro densidades y tres idiomas. Con varios APK, el desarrollador cargaría 3 * 4 = 12 APK. Con los APK de configuración, cargarían 1 (base) + 3 + 4 = 8 APK. Con varios APK, se entrega exactamente un APK por dispositivo. Con los APK de configuración, el dispositivo recibe un APK base y, potencialmente, uno o más APK de recursos en cada una de las dimensiones admitidas (en este caso idioma, densidad y ABI).
  • Con varios APK, se usan los códigos de versión a fin de seleccionar entre varios APK compatibles para un dispositivo determinado. El orden de los APK de configuración no lo determina el desarrollador, sino la orientación de los APK disponibles.
  • Los APK de configuración admiten la nueva dimensión de orientación language. La opción de varios APK no.

Requisitos previos

Antes de configurar tu compilación en los APK de configuración, revisa los siguientes pasos para asegurarte de que tu compilación esté lista y verifica que tienes la configuración de herramientas que necesitas en Android Studio:

  • Establece la versión mínima del SDK del módulo de la app instantánea en 21 o posterior.
  • Usa Android Studio 3.0 o una versión posterior.

Cómo configurar tu compilación para los APK de configuración

Para establecer tu compilación en los APK de configuración basados en idiomas, agrega un bloque de idioma al bloque splits del módulo de funciones y especifica generatePureSplits = true en el bloque android. Para obtener más información sobre cómo configurar el bloque splits, consulta Cómo configurar la compilación para varios APK.

android {
  ...
  generatePureSplits = true
  splits {
    abi {
      enable = true
    }
    density {
      enable = true
    }
    language {
      enable = true
      include "es-rMX", "zh", "en"
    }
  }
}

Los valores de idioma se encuentran en el formato descrito en Cómo proporcionar recursos alternativos.

Cómo publicar APK de configuración

A diferencia del uso de varios APK, los desarrolladores no definen un orden sobre varios APK de configuración equivalentes. Entonces ¿cómo decide Play qué publicar?

Para ABI, Play elige entre los APK compatibles y elige un orden fijo que es igual en todos los dispositivos. El orden es x86_64, x86, mips64, mips, arm64-v8a, armeabi-v7a y armeabi. Por ejemplo, si un dispositivo admite x86 y armeabi-v7a, y los APK están disponibles para ambos, se publica el APK x86 (junto con la base).

En cuanto a la densidad, Google Play elige el APK más cercano a la densidad del dispositivo entre los disponibles.

La selección de APK por idioma es más complicada.

Problemas especiales de la orientación por idioma

Uno podría esperar que Play intente coincidir exactamente con la configuración regional del usuario. Si fuera en-GB, podría entregar un APK orientado a en-GB, si está disponible; de lo contrario, recurre a en. Este enfoque tiene los siguientes dos problemas:

  1. No hay ningún requisito que indique que un archivo APK de configuración deba incluir traducciones de cada string, de la misma manera que no existe un requisito similar para un archivo strings.xml. Es aceptable (y común) agregar un idioma solo para una o algunas strings. Por ejemplo, en/strings.xml podría contener "auto" y "camión", y en-rGB/strings.xml podría contener solo "furgón". Por lo tanto, así como el conjunto de traducciones necesario para cualquier dispositivo puede encontrarse en varios archivos strings.xml, esos archivos pueden estar en varios APK de configuración.
  2. Los dispositivos Android tienen gráficos de resguardo muy variables. Las versiones de Android pueden cambiar el gráfico de resguardo (consulta, por ejemplo, la guía Idioma y configuración regional). Además, los OEM personalizan el orden de resguardo. (Por ejemplo, si “zh” prefiere “zh-TW” o “zh-CN” depende del OEM). Play no siempre sabe qué orden de resguardo usa el dispositivo solicitante.

Play soluciona los problemas mediante la entrega de todos los APK de configuración orientados a idiomas cuya subetiqueta de idioma (la parte anterior al guion) coincide con la de la configuración regional seleccionada por el usuario. Esta acción se basa en la observación de que los algoritmos de resguardo no suelen recurrir a idiomas distintos. Por ejemplo:

La configuración regional del usuario es de-CH.
Los APK disponibles son de, de-CH, de-AT y fr.
Play publica de, de-CH y de-AT, pero no fr.

Play también controla ciertos casos conocidos en los que los idiomas deben agruparse a pesar de tener subetiquetas de idiomas que no coinciden, como fil/tag.

Play realiza la agrupación en el momento de la publicación y no requiere ninguna acción por parte del desarrollador.

Solución de problemas y preguntas frecuentes

  • Gradle no produjo APK de configuración y, en su lugar, mostró el siguiente mensaje:
    Variant ..., MinSdkVersion 18 is too low (<21) to support pure splits,
    reverting to full APKs
    

    Especifica minSdkVersion = 21 en el archivo build.gradle del módulo de tu app instantánea.

  • El complemento Gradle muestra el siguiente mensaje:
    > Configure project :base
    Pure splits are not supported by PlayStore yet.
    

    Este es un problema conocido. Ignora este mensaje.

  • ¿Cómo afectan los APK de configuración el límite de 4 MB?

    El tamaño de las funciones se calcula sumando el tamaño del APK de la función específica, el tamaño del APK de la función base y el conjunto más grande de APK de configuración que se podría entregar a un dispositivo. Por ejemplo, si una función tiene tres APK de idioma en el APK base, dos APK de densidad en la base y dos APK de densidad en el APK de la función, el tamaño final de la función se obtiene sumando el tamaño del APK de la función, el tamaño del APK base, los APK de idioma y de densidad más grandes para la base y el APK de densidad más grande de la función.

Errores conocidos

  • Gradle no puede crear APK de ABI para algunas compilaciones incrementales (https://issuetracker.google.com/69680755). Para resolver el problema, limpia y vuelve a compilar.
  • Actualmente, las herramientas de compilación no pueden crear APK de configuración multidimensionales. Por ejemplo, un proyecto puede contener un recurso en res/drawable-fr-xhdpi para dispositivos xhdpi en francés, pero Gradle no puede poner ese recurso en los APK de configuración. Cualquiera de esos recursos se coloca en el APK base o de la función.