AAPT2

AAPT2 (Android Asset Packaging Tool) es una herramienta de compilación que Android Studio y el complemento de Gradle para Android usan para compilar y empaquetar los recursos de tu app. Esta herramienta analiza, indexa y compila los recursos en un formato binario que está optimizado para la plataforma de Android.

El complemento de Gradle para Android 3.0.0 y versiones posteriores habilita AAPT2 de forma predeterminada. Por lo general, no es necesario que invoques a aapt2. Sin embargo, si prefieres usar tu terminal y tu propio sistema de compilación en lugar de Android Studio, puedes usar AAPT2 desde la línea de comandos. También puedes depurar errores de compilación relacionados con AAPT2 desde la línea de comandos. Para ello, puedes encontrar AAPT2 como una herramienta independiente en las Herramientas de compilación del SDK de Android 26.0.2 y versiones posteriores.

Para descargar las herramientas de compilación del SDK de Android desde la línea de comandos, usa sdkmanager y ejecuta el siguiente comando:

sdkmanager "build-tools;build-tools-version"

Una vez que las hayas descargado, busca AAPT2 en android_sdk/build-tools/version/.

Debido a que las revisiones de estas herramientas no se publican con frecuencia, es posible que la versión de AAPT2 incluida en tus herramientas de compilación del SDK no sea la más reciente. Para obtener la versión más reciente de AAPT2, lee Cómo descargar AAPT2 de Google Maven.

Para usar AAPT2 desde la línea de comandos en Linux o Mac, ejecuta el comando aapt2. En Windows, ejecuta el comando aapt2.exe.

AAPT2 admite una compilación más rápida de recursos debido a que habilita la compilación incremental. Para lograr este tipo de compilación, el procesamiento de recursos se divide en dos pasos:

  • Compilación: Compila archivos de recursos en formatos binarios.
  • Vinculación: Combina todos los archivos compilados y los incluye en un solo paquete.

Esta división ayuda a mejorar el rendimiento de las compilaciones incrementales. Por ejemplo, si se realizan cambios en un solo archivo, solo necesitarás volver a compilar ese archivo.

Cómo descargar AAPT2 de Google Maven

Puedes descargar la versión más reciente de AAPT2 que no está incluida en las herramientas de compilación, del repositorio Maven de Google de la siguiente manera:

  1. En el índice del repositorio, navega a com.android.tools.build > aapt2.
  2. Copia el nombre de la versión más reciente de AAPT2.
  3. Inserta el nombre de la versión que copiaste y especifica el sistema operativo de destino en https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar.

    Por ejemplo, si quieres descargar la versión 3.2.0-alpha18-4804415 para Windows, usa https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar.

  4. Navega a la URL en un navegador. AAPT2 comenzará a descargarse pronto.

  5. Extrae el archivo JAR que acabas de descargar.

    Debe contener un ejecutable aapt2 y algunas bibliotecas de las que este depende.

Compilación

AAPT2 admite la compilación de todos los tipos de recursos de Android, como archivos de elementos de diseño y en formato XML. Cuando invoques AAPT2 para la compilación, pasa un solo archivo de recursos como entrada por invocación. Luego, AAPT2 analizará el archivo y generará un archivo binario intermedio con una extensión .flat.

Es decir, cuando pasas directorios completos, AAPT2 vuelve a compilar todos los archivos en el directorio incluso si solo se modificó un recurso. Si bien puedes usar la marca --dir para pasar directorios de recursos que contengan más de un archivo de recursos a AAPT2, no obtendrás los beneficios de la compilación incremental de recursos si lo haces de esta manera.

Los tipos de archivos de salida pueden diferir según la entrada que proporciones para la compilación, como se muestra en la siguiente tabla:

Tabla 1: Los tipos de archivo de entrada y salida para la compilación

Entrada Salida
Archivos de recursos XML, como String y Style, ubicados en el directorio res/values/. Tabla de recursos con extensión *.arsc.flat.
Todos los demás archivos de recursos.

Todos los otros archivos que no se incluyen en el directorio res/values/ se convierten en archivos XML binarios con extensiones *.flat.

Además, todos los archivos PNG se procesan de manera predeterminada y adoptan extensiones *.png.flat . Si decides no comprimir los PNG, puedes usar la opción --no-crunch durante la compilación.

Los archivos que genera AAPT2 no son ejecutables y, más adelante, deberás incluir estos archivos binarios como entrada en la fase de vinculación para generar un APK. Sin embargo, el archivo APK generado no es un ejecutable que puedas implementar en un dispositivo Android de inmediato, ya que no contiene archivos DEX y no está firmado.

Sintaxis de la compilación

La sintaxis general para usar el comando compile es la siguiente:

aapt2 compile path-to-input-files [options] -o output-directory/

En el siguiente ejemplo, AAPT2 compila los archivos de recursos llamados values.xml y myImage.png de forma individual:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Como se muestra en la tabla 1, el nombre del archivo de salida depende del nombre del archivo de entrada y del nombre de su directorio superior.

En el ejemplo anterior, con el archivo strings.xml como entrada, aapt2 nombra automáticamente el archivo de salida como values-en_strings.arsc.flat. Sin embargo, el archivo de elemento de diseño compilado que se almacena en el directorio se llama drawable_img.png.flat.

Opciones de compilación

Hay varias opciones que puedes usar con el comando compile, como se muestra en la tabla 2:

Tabla 2: Opciones de comandos de compilación

Opción Descripción
-o path

Especifica la ruta de salida para los recursos compilados.

Esta marca es obligatoria porque debes especificar una ruta de acceso a un directorio en el que AAPT2 pueda generar y almacenar los recursos compilados.

--dir directory

Especifica el directorio para buscar recursos.

Si bien puedes usar esta marca para compilar varios archivos de recursos con un solo comando, inhabilita los beneficios de la compilación incremental. Por lo tanto, no es recomendable que uses esta marca para proyectos grandes.

--pseudo-localize Genera versiones pseudolocalizadas de strings predeterminadas, como en-XA y en-XB.
--no-crunch Inhabilita el procesamiento de PNG.

Usa esta opción si ya procesaste los archivos PNG o si estás creando compilaciones de depuración que no requieren que se reduzca el tamaño de archivo. Si habilitas esta opción, lograrás una ejecución más rápida, pero aumentará el tamaño del archivo de salida.

--legacy Trata como alertas los errores que son admisibles cuando se usan versiones anteriores de AAPT.

Este indicador debe usarse para errores inesperados que se producen en el tiempo de compilación. Para resolver los cambios de comportamiento conocidos que pueden ocurrir mientras usas AAPT2, lee Cambios de comportamiento cuando se usa AAPT2.

-zip file file es un archivo ZIP que contiene el directorio res para buscar recursos.
-output-text-symbols file Genera un archivo de texto que contiene los símbolos de recursos en el archivo especificado.
-preserve-visibility-of-styleables Si se especifica, aplica las mismas reglas de visibilidad para los estilos que se usan en todos los demás recursos. De lo contrario, todos los elementos de diseño se hacen públicos.
-visibility [public|private|default|] Configura la visibilidad de los recursos compilados en el nivel especificado.
-trace-folder folder Genera un fragmento de registro JSON systrace en la carpeta especificada.
-source-path path Configura la ruta de origen del archivo de recursos compilado en la ruta de acceso.
-h Muestra la ayuda de las herramientas.
-v Habilita el registro detallado.

En la fase de vinculación, AAPT2 fusiona todos los archivos intermedios que se generan en la fase de compilación, como las tablas de recursos, los archivos XML binarios y los archivos PNG procesados. Luego, los empaqueta en un solo APK. Durante esta fase se pueden generar, además, otros archivos auxiliares, como R.java y archivos de reglas ProGuard. Sin embargo, el APK generado no contiene el código de bytes DEX y no está firmado. No puedes implementar este APK en un dispositivo.

Si no estás usando el complemento de Android para Gradle con el objetivo de compilar tu app desde la línea de comandos, puedes usar otras herramientas de línea de comandos, como d8 para compilar código de bytes Java en código de bytes DEX o apksigner para firmar tu APK.

La sintaxis general para usar el comando link es la siguiente:

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

En el siguiente ejemplo, AAPT2 combina los dos archivos intermedios, drawable_Image.flat y values_values.arsc.flat con el archivo AndroidManifest.xml. AAPT2 vincula el resultado con el archivo android.jar, que contiene los recursos definidos en el paquete android:

 aapt2 link -o output.apk
 -I android_sdk/platforms/android_version/android.jar
    compiled/res/values_values.arsc.flat
    compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

Puedes usar las siguientes opciones con el comando link:

Tabla 3: Opciones de comando para vincular

Opción Descripción
-o path

Especifica la ruta de salida para el APK del recurso vinculado.

Esta marca es obligatoria porque debes especificar una ruta de acceso para el APK de salida que pueda contener los recursos vinculados.

--manifest file

Especifica la ruta de acceso al archivo de manifiesto de Android que se compilará.

Esta marca es obligatoria porque el archivo de manifiesto contiene información esencial sobre tu app, como el nombre del paquete y el ID de la aplicación.

-I

Proporciona la ruta de acceso del android.jar u otros APK de la plataforma, como framework-res.apk, que pueden ser útiles cuando compilas funciones.

Esta marca es obligatoria si usas atributos con el espacio de nombres android en tus archivos de recursos.
-A directory Especifica un directorio de recursos que se incluirá en el APK.

Puedes usar este directorio para almacenar archivos originales sin procesar. Para obtener más información, lee Cómo acceder a archivos originales.

-R file Pasa un archivo .flat individual a link mediante la semántica de overlay sin usar la etiqueta <add-resource>.

Cuando proporcionas un archivo de recursos que se superpone con un archivo existente, se usa el último recurso dado en conflicto.

--package-id package-id Especifica el ID del paquete que se usará para tu app.

El ID de paquete que especifiques debe ser mayor o igual que 0x7f, a menos que se use en combinación con --allow-reserved-package-id.

--allow-reserved-package-id

Permite el uso de un ID de paquete reservado.

Los IDs de paquetes reservados son ID que normalmente se asignan a bibliotecas compartidas y pueden estar dentro del rango de 0x02 y 0x7e inclusive. Mediante el uso de --allow-reserved-package-id, puedes asignar los IDs que se encuentren dentro del rango de IDs de paquetes reservados.

Esta opción solo debe usarse para paquetes con una versión de min-sdk 26 o anterior.

--java directory Especifica el directorio en el que se generará R.java.
--proguard proguard_options Genera un archivo de salida de las reglas ProGuard.
--proguard-conditional-keep-rules Genera un archivo de salida de las reglas ProGuard para el DEX principal.
--no-auto-version Inhabilita control automático de versiones del SDK de diseño y estilo.
--no-version-vectors Inhabilita el control automático de versiones de elementos de diseño vectoriales. Solo debes usarlo cuando compiles tu APK con la Biblioteca de elementos de diseño vectoriales.
--no-version-transitions Inhabilita el control automático de versiones de los recursos de transición. Usa esta marca solo cuando compiles tu APK con la biblioteca de compatibilidad de transición.
--no-resource-deduping Inhabilita la eliminación automática de recursos duplicados con valores idénticos en configuraciones compatibles.
--enable-sparse-encoding Habilita la codificación de entradas dispersas por medio de un árbol binario de búsqueda, lo que resulta útil para la optimización del tamaño de APK, pero a costa del rendimiento de la recuperación de recursos.
-z Requiere la localización de las strings marcadas como "sugeridas".
-c config Proporciona una lista de configuraciones separadas por comas.

Por ejemplo, si tienes dependencias en la biblioteca de compatibilidad (que contiene traducciones para varios idiomas), puedes filtrar recursos solo para la configuración de idioma especificada, como inglés o español.

Debes definir la configuración de idioma con un código de idioma ISO 639-1 de dos letras y, de manera opcional, seguido de un código de región ISO 3166-1-alfa-2 de dos letras precedido por una "r" en minúscula. Por ejemplo, en-rUS.

--preferred-density density Permite que AAPT2 seleccione la densidad que mejor coincida y quite todas las demás.

Hay varios calificadores de densidad de píxeles disponibles para usar en tu app, como ldpi, hdpi y xhdpi. Cuando especifiques una densidad preferida, AAPT2 seleccionará y almacenará la densidad que mejor coincida en la tabla de recursos y quitará todas las demás.

--output-to-dir Envía el contenido del APK a un directorio especificado por -o.

Si encuentras algún error con esta marca, puedes corregirlo mediante la actualización de las herramientas de compilación del SDK de Android 28.0.0 o versiones posteriores.

--min-sdk-version min-sdk-version Configura la versión de SDK mínima predeterminada que se usará en AndroidManifest.xml.
--target-sdk-version target-sdk-version Configura la versión de SDK de destino predeterminada que se usará en AndroidManifest.xml.
--version-code version-code Especifica el código de versión que se insertará en AndroidManifest.xml si no se especificó ninguno.
--version-name version-name Especifica el nombre de la versión que se insertará en AndroidManifest.xml si no se especificó ninguno.
--revision-code revision-code Especifica el código de revisión que se insertará en el archivo AndroidManifest.xml si no se especificó ninguno.
--replace-version Si se especifican --version-code, --version-name o --revision-code, se reemplazará cualquier valor que ya se encuentre en el manifiesto. De forma predeterminada, no hay cambios si el manifiesto ya define estos atributos.
--compile-sdk-version-nacodeme compile-sdk-version-name Especifica el código de versión que se insertará en el archivo AndroidManifest.xml si no se especificó ninguno.
--compile-sdk-version-name compile-sdk-version-name Especifica el nombre de la versión que se insertará en el archivo AndroidManifest.xml si no se especificó ninguno.
--proto-format Genera recursos compilados en formato Protobuf.

Puede usarse como entrada en bundletool para generar un Android App Bundle.

--non-final-ids Genera R.java con los IDs de recursos no finales. Las referencias a los IDs del código de la app no se intercalan durante la compilación de kotlinc o javac.
--emit-ids path Emite un archivo en una ruta de acceso específica con una lista de nombres de tipos de recursos y sus mapeos de ID. Es adecuado para usar con --stable-ids.
--stable-ids outputfilename.ext Consume el archivo generado con --emit-ids que contiene la lista de nombres de tipos de recursos y sus ID asignados.

Esta opción permite que los ID asignados permanezcan estables incluso cuando borras o agregas nuevos recursos durante la vinculación.

--custom-package package_name Especifica el paquete Java personalizado en el cual se generará R.java.
--extra-packages package_name Genera el mismo archivo R.java, pero con diferentes nombres de paquetes.
--add-javadoc-annotation annotation Agrega una anotación JavaDoc a todas las clases de Java generadas.
--output-text-symbols path Genera un archivo de texto que contiene los símbolos de recursos de la clase R en el archivo especificado.

Debes especificar la ruta de acceso al archivo de salida.

--auto-add-overlay Permite la inclusión de nuevos recursos en superposiciones sin usar la etiqueta <add-resource>.
--rename-manifest-package manifest-package Cambia el nombre del paquete en el archivo AndroidManifest.xml.
--rename-instrumentation-target-package instrumentation- target-package Cambia el nombre del paquete de destino para instrumentation.

Esta opción se debe usar junto con --rename-manifest-package.

-0 extension

Especifica las extensiones de archivos que no quieres comprimir.

--split path:config[,config[..]] Divide los recursos en función de un conjunto de opciones de configuración para generar una versión diferente del APK.

Debes especificar la ruta de acceso al APK de salida junto con el conjunto de opciones de configuración.

--proguard-main-dex file Archivo de salida de las reglas ProGuard generadas para el DEX principal.
--proguard-minimal-keep-rules Genera un conjunto mínimo de reglas ProGuard de conservación.
--no-resource-removal Inhabilita la eliminación automática de recursos sin valores predeterminados. Usa esta opción solo cuando compiles paquetes de superposición de recursos en tiempo de ejecución.
-x Marca heredada que especifica el uso del identificador de paquete 0x01.
--product products-list Especifica una lista de los nombres de los productos que se conservarán separada por comas.
--no-xml-namespaces Quita el prefijo del espacio de nombres XML y la información del URI del archivo AndroidManifest.xml y los objetos XML binarios en res/*.
--shared-lib Genera una biblioteca compartida de Android Runtime.
--static-lib Genera una biblioteca estática de Android.
--no-static-lib-packages Combina todos los recursos de la biblioteca del paquete de la app.
--no-proguard-location-reference Evita que los archivos de reglas ProGuard tengan una referencia al archivo de origen.
--private-symbols package-name package-name especifica el nombre del paquete que se usará cuando se genere R.java para símbolos privados. Si no se especifica un nombre, los símbolos públicos y privados usarán el del paquete de la app.
--override-styles-instead-of-overlaying Hace que los estilos definidos en los recursos -R reemplacen las definiciones anteriores en lugar de combinarse.
--rename-resources-package package-name Cambia el nombre del paquete en la tabla de recursos a package-name.
--no-compress No comprime ningún recurso.
--keep-raw-values Conserva los valores de atributos sin procesar en los archivos en formato XML.
--no-compress-regex regular-expression No comprime las extensiones que coinciden con regular-expression. Usa el símbolo $ para el final de la línea. Usa una gramática de expresión regular ECMAScript que distingue mayúsculas de minúsculas.
--warn-manifest-validation Trata los errores de validación del manifiesto como advertencias.
--exclude-configs qualifier[,qualifier[..]] Excluye los valores de los recursos cuyos archivos de configuración contienen los calificadores especificados.
--debug-mode Inserta android:debuggable="true" en el nodo de la aplicación del manifiesto, lo que hace que la aplicación sea depurable incluso en dispositivos de producción.
--strict-visibility No permite superposiciones con diferentes niveles de visibilidad.
--exclude-sources No serializa la información del archivo de origen cuando se generan recursos en formato Protobuf.
--trace-folder folder Genera el fragmento de registro JSON systrace en la folder especificada.
--merge-only Solo combina los recursos sin verificar las referencias. Esta marca solo debe usarse con --static-lib.
-h Muestra el menú de ayuda.
-v Habilita una salida más detallada.

Volcado

dump se usa para imprimir información sobre el APK que generaste con el comando link.

Sintaxis de volcado

La sintaxis general para usar el comando dump es la siguiente:

aapt2 dump sub-command filename.apk [options]

En el siguiente ejemplo, se imprime contenido de la tabla de recursos del APK especificado:

aapt2 dump resources output.apk

Subcomandos de volcado

Especifica uno de los siguientes subcomandos con el comando dump:

Tabla 4: Subcomandos de volcado

SubcomandoDescripción
apc Imprime el contenido del contenedor AAPT2 (APC) generado durante la compilación.
badging Imprime la información extraída del manifiesto del APK.
configurations Imprime cada configuración utilizada por un recurso en el APK.
overlayable Imprime los recursos superpuestos del APK.
packagename Imprime el nombre del paquete del APK.
permissions Imprime los permisos extraídos del manifiesto del APK.
strings Imprime el contenido del grupo de strings de la tabla de recursos del APK.
styleparents Imprime los elementos principales de los estilos que se usan en el APK.
resources Imprime el contenido de la tabla de recursos del APK.
xmlstrings Imprime strings desde el archivo XML compilado del APK.
xmltree Imprime un árbol del archivo XML compilado del APK.

Opciones de volcado

Usa las siguientes opciones con dump:

Tabla 5: Opciones de volcado

OpciónDescripción
--no-values Suprime la salida de valores al mostrar el recurso.
--file file Especifica un archivo como argumento para que se vuelque del APK.
-v Aumenta el nivel de detalle de la salida.

Diferencia

Usa diff para comparar dos APKs e identificar las diferencias entre ellos.

Sintaxis de diferencia

La sintaxis general para usar el comando diff es la siguiente:

aapt2 diff first.apk second.apk

No hay opciones para el comando diff.

Optimización

optimize se usa para ejecutar optimizaciones en los recursos combinados y resources.arsc antes de que se empaqueten en el APK. Esta optimización puede reducir el tamaño del APK entre un 1% y un 3%, según el tamaño y la cantidad de recursos que se usen.

Cómo optimizar la sintaxis

La sintaxis general para usar el comando optimize es la siguiente:

aapt2 optimize options file[,file[..]]

En el siguiente ejemplo, se optimizan los recursos en input.apk y se crea un nuevo APK optimizado en output.apk. Reemplaza la representación de tabla plana habitual con un árbol de búsqueda binario más compacto, lo que da como resultado un APK más pequeño a costa del rendimiento de la recuperación:

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

Opciones de optimización

Puedes usar las siguientes opciones con optimize:

Tabla 6: Opciones de optimización

OpciónDescripción
-o path Especifica la ruta de salida para el APK del recurso vinculado.

Esta marca es obligatoria porque debes especificar una ruta de acceso para el APK de salida que pueda contener los recursos vinculados.

-d directory Especifica la ruta de acceso al directorio de salida para las divisiones.
-x path Especifica la ruta de acceso al archivo de configuración XML.
-p Imprime los artefactos de varios APKs y finaliza.
--target-densities density[,density[..]] Especifica la lista de densidades de pantalla, separadas por comas, para las que se optimizó el APK. Se quitan del APK todos los recursos que no se usarían en dispositivos con las densidades especificadas.
--resources-config-path path

Especifica la ruta al archivo resources.cfg que contiene la lista de recursos y directivas para cada recurso.

Formato: type/resource_name#[directive][,directive]

-c config[,config[..]] Especifica la lista de configuraciones que se incluirán, separadas por comas. El valor predeterminado es todas las opciones de configuración.
--split path:config[,config[..]] Divide los recursos en función de un conjunto de opciones de configuración para generar una versión diferente del APK.

Debes especificar la ruta de acceso al APK de salida junto con el conjunto de opciones de configuración.

--keep-artifacts artifact[,artifact[..]] Especifica la lista de los artefactos que se conservarán separados por comas. Si no se especifica ninguno, se conservan todos los artefactos.
--enable-sparse-encoding Habilita la codificación de entradas dispersas por medio de un árbol binario de búsqueda, lo que resulta útil para la optimización del tamaño de APK, pero a costa del rendimiento de la recuperación de recursos.
--collapse-resource-names Contrae los nombres de recursos a un solo valor en el grupo de strings de claves. Si utilizas la directiva no_collapse en un archivo especificado por --resources-config-path, se eximirán los recursos.
--shorten-resource-paths Acorta las rutas de los recursos dentro del APK.
--resource-path-shortening-map path Especifica la ruta de salida del mapa de rutas de recursos anteriores en rutas de acceso más cortas.
-v Aumenta el nivel de detalle de la salida.
-h Muestra la ayuda de la herramienta.

Conversión

De forma predeterminada, el comando compile de AAPT compila recursos en un formato binario compatible con los APKs. También puedes especificar --proto-format y, de esta forma, especificar el formato Protobuf adecuado para los AAB. El comando convert convierte los APKs de un formato a otro.

Cómo convertir la sintaxis

La sintaxis general de convert es la siguiente:

aapt2 convert -o output-file options file[,file[..]]

En el siguiente ejemplo, se convierten los recursos de input.apk y se crea un nuevo APK con los recursos del formato Protobuf en output.apk. Reemplaza la representación de tabla plana habitual con un árbol de búsqueda binario más compacto, lo que da como resultado un APK más pequeño a costa del rendimiento de la recuperación:

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

Opciones de conversión

Usa las siguientes opciones con convert:

Tabla 7: Opciones de conversión

OpciónDescripción
-o path

Especifica la ruta de salida para el APK del recurso vinculado.

Esta marca es obligatoria porque debes especificar una ruta de acceso para el APK de salida que pueda contener los recursos vinculados.

--output-format [proto|binary] Formato de salida. Los valores aceptados son proto y binary. Si no se establece un valor, la opción predeterminada será binary.
--enable-sparse-encoding Habilita la codificación de entradas dispersas por medio de un árbol binario de búsqueda, lo que resulta útil para la optimización del tamaño de APK, pero a costa del rendimiento de la recuperación de recursos.
--keep-raw-values Conserva los valores de atributos sin procesar en los archivos en formato XML.
-v Aumenta el nivel de detalle de la salida.
-h Muestra la ayuda de la herramienta.

Modo daemon

La versión 2.19 de AAPT introdujo el modo daemon para emitir comandos. El modo daemon te permite ingresar varios comandos en una sola sesión de AAPT.

Sintaxis de daemon

Utiliza el siguiente comando para iniciar el modo daemon:

aapt2 daemon

Podrás comenzar a ingresar comandos una vez que se esté ejecutando este modo. Cada argumento debe estar en una línea separada, con una línea en blanco al final del comando. Para salir del modo daemon, presiona Control + D.

Ten en cuenta los siguientes comandos compile individuales:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Estos comandos se pueden ingresar en modo daemon de la siguiente manera:

aapt2 daemon
Ready
compile
project_root/module_root/src/main/res/values-en/strings.xml
-o
compiled/

Done
compile
project_root/module_root/src/main/res/drawable/myImage.png
-o
compiled/

Done
^D
Exiting daemon

Opciones del modo daemon

La única opción para el modo daemon es --trace-folder folder, que genera un fragmento de registro JSON systrace con el valor folder especificado.

Versión

Determina la versión de AAPT2 que usas con el comando version:

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

Cambios de comportamiento cuando usas AAPT2

Antes de AAPT2, AAPT era la versión predeterminada de Android Asset Packaging Tool, que ahora dejó de estar disponible. Si bien AAPT2 debería funcionar de inmediato con proyectos antiguos, en esta sección se describen algunos cambios de comportamiento que deberías tener en cuenta.

Jerarquías de elementos en el manifiesto de Android

En las versiones anteriores de AAPT, los elementos anidados en nodos incorrectos del archivo AndroidManifest.xml se ignoraban o generaban una alerta. Por ejemplo, considera el siguiente ejemplo:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myname.myapplication">
   <application
       ...
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <action android:name="android.intent.action.CUSTOM" />
       </activity>
   </application>
</manifest>

Las versiones anteriores de AAPT simplemente ignoraban la etiqueta <action> mal ubicada.

Con AAPT2, recibirás el siguiente error:

AndroidManifest.xml:15: error: unknown element <action> found.

Para solucionar el problema, asegúrate de que tus elementos de manifiestos estén anidados correctamente. Para obtener más información, lee la descripción general del manifiesto de la app.

Declaración de recursos

Ya no puedes indicar el tipo de un recurso desde el atributo name. En el siguiente ejemplo, se declara un elemento de recurso attr de manera incorrecta:

<style name="childStyle" parent="parentStyle">
    <item name="attr/my_attr">@color/pink</item>
</style>

Declarar un tipo de recurso de esta manera da como resultado el siguiente error de compilación:

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

Para solucionar el problema, usa type="attr" para declarar explícitamente el tipo de recurso:

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

Además, cuando se declara un elemento <style>, su elemento principal también debe ser un tipo de recurso de estilo. De lo contrario, verás un error similar al siguiente:

Error: (...) invalid resource type 'attr' for parent of style

Uso incorrecto de símbolos de referencia del recurso @

AAPT2 muestra errores de compilación cuando omites o incluyes de manera incorrecta los símbolos de referencia del recurso (@). Por ejemplo, si omites el símbolo cuando especificas un atributo de estilo:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

Cuando se compila el módulo, AAPT2 muestra el siguiente error de compilación:

ERROR: expected color but got (raw string) color/colorPrimary

Además, si incluyes el símbolo de forma incorrecta cuando accedes a un recurso desde el espacio de nombres android, sucederá lo siguiente:

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

Cuando se compila el módulo, AAPT2 muestra el siguiente error de compilación:

Error: style attribute '@android:attr/windowEnterAnimation' not found

Configuración incorrecta de bibliotecas

Si tu app depende de una biblioteca de terceros que se compiló con versiones anteriores de las herramientas de compilación del SDK de Android, podría fallar durante el tiempo de ejecución sin mostrar ningún error o alerta. Esta falla podría producirse porque, durante la creación de la biblioteca, los campos de R.java se declaran como final. Como resultado, todos los IDs de recursos se intercalan en las clases de la biblioteca.

AAPT2 se basa en la capacidad de volver a asignar los IDs a los recursos de biblioteca cuando compilas tu app. Si la biblioteca asume que los IDs son final y los intercala en el DEX de la biblioteca, habrá una discrepancia de tiempo de ejecución.

Para corregir este error, comunícate con el autor de la biblioteca a fin de volver a compilarla con la versión más reciente de las herramientas de compilación del SDK de Android y publícala nuevamente.