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:
- En el índice del repositorio, navega a com.android.tools.build > aapt2.
- Copia el nombre de la versión más reciente de AAPT2.
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.
Desde un navegador, accede a la URL; AAPT2 debería comenzar a descargarse rápidamente.
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 extensiones *.arsc.flat . |
Todos los demás archivos de recursos. |
Todos los otros archivos que no se incluyen en el directorio
Además, todos los archivos PNG se procesan de manera predeterminada y adoptan extensiones |
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 se pueda 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 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 en el que se buscarán 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 |
-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 |
-source-path path
|
Configura la ruta de origen del archivo de recursos compilado en la |
-h
|
Muestra la ayuda de las herramientas. |
-v
|
Habilita el registro detallado. |
Vínculación
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.
Sintaxis de la vinculación
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
Opciones para vincular
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 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
|
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 Esta opción solo debe usarse para paquetes con una versión de |
--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 el 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-alpha-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 hay 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 AndroidManifest.xml si no se especificó ninguno. |
--proto-format
|
Genera recursos compilados en formato Protobuf. Puede usarse como entrada en |
--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 |
-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
Subcomando | Descripció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ón | Descripció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ó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. |
-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 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ó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. |
--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.