La compilación de AAPT2 falló: dimen inválido en Android 3.0 Canary 1

88

Estoy jugando con Instant Apps para Android. Instalé todos los paquetes correctos y me cansé de crear una nueva aplicación con soporte de Instant App (marqué la casilla de Instant App al crear una nueva aplicación). El problema es que siempre tengo problemas con las herramientas de compilación. ¿Alguien más tiene este problema y pudo encontrar alguna solución?

Mi entorno:

  • Android Studio 3.0 Canary 1
  • Compilar SDK: 25
  • Herramientas de compilación: "26.0.0 rc2"
  • Complemento de Gradle: 3.0.0-alpha1
  • Gradle: probé gradle-4.0-milestone1 y 2
  • Java 1.8 / 1.7
  • SO: probé tanto Windows 10 como Linux Ubuntu 16.4 LTS

El error:

Error: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.internal.aapt.AaptException: AAPT2 compile failed:
aapt2 compile -o /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/res/merged/androidTest/debug /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml
Issues:
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:520 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:521 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:568 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:594 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:595 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:597 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:598 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:599 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:600 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:601 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:602 invalid dimen
 - ERROR: /home/simonp/Work/201705_InstantApp/InstantAppTest/feature/build/intermediates/incremental/mergeDebugAndroidTestResources/merged.dir/values/values.xml:603 invalid dimen
:feature:mergeDebugAndroidTestResources FAILED

La línea en cuestión contiene (520):

<item format="float" name="abc_disabled_alpha_material_dark" type="dimen">0.30</item>

Espero haberle proporcionado suficiente información para resolver el problema. Gracias.

sposnjak
fuente
4
Como solución para que la compilación funcione, actualmente desactivé el aapt2 y funciona para probar la compilación ... puedes hacerlo configurando android.enableAapt2 = false en tu archivo gradle.properties. Creo que podría ser un error de estudio, no estoy seguro ...
BruceWayne
Otra solución es stackoverflow.com/a/33943562/5125608 Me funciona.
anlijudavid
5
Para su información, se lanza la última compilación de Canary, 5, y Google mencionó a continuación que todavía tienen problemas con este AAPT2 de la siguiente manera, AAPT2. Seguimos estabilizando AAPT2, lo que permite el procesamiento incremental de recursos. Si su compilación falla debido a un problema de procesamiento de recursos, envíenos un informe de error. Para deshabilitar temporalmente AAPT, configure android.enableAapt2 = false en su archivo gradle.properties. Roboelectric actualmente no es compatible con AAPT2
Infinite Loops

Respuestas:

57

La solución es cambiar su máquina de desarrollo a una configuración regional que use "." como una marca decimal.

Se puede cambiar de la siguiente manera:

ingrese la descripción de la imagen aquí

saturov
fuente
6
Esto funcionó para mí. Aplicar en todo el sistema no era necesario. Pero reiniciar Android-Studio no es suficiente. Debe cerrar la sesión y volver a iniciarla (o reiniciar su sistema) para que los cambios estén activos para la compilación de Gradle.
Salim
14
¡Funciona! Para Linux, debe hacer: exportar LC_NUMERIC = "en_US.UTF-8" y luego iniciar Android Studio en el mismo mensaje
sposnjak
17
Agregué export LC_NUMERIC = "en_US.UTF-8" al comienzo de mi studio.sh y funciona bien. Ciertamente no cambiaría la configuración regional de mi sistema solo para solucionar algún error.
rzehan
7
... wat? Recomendar a alguien que cambie la configuración regional de todo el sistema solo por un error en una aplicación es una locura. Afectará el formato de su fecha, por ejemplo, en los clientes de correo electrónico, incluso el idioma y prácticamente todo lo demás.
Stephan Henningsen
2
Bueno, estoy en Windows. ¿Alguna sugerencia?
user2520215
106

A continuación se mencionan cuatro soluciones diferentes: A, B, C y D; elija uno que se adapte a usted:

A) Arreglar Android Studio a través del archivo de inicio de Ubuntu .desktop

Esta es una alternativa exclusiva de Ubuntu al enfoque general sobre la reparación de Android Studio (ver más abajo). Tenga en cuenta que es posible que aún desee implementar la parte sobre Arreglar el shell , y quizás incluso revertir cualquier modificación para studio.shconfirmar completamente esta corrección.

Me cansé de parchearme studio.shpara cada actualización de Canary, así que se me ocurrió una solución mejor que elimina este paso. Funciona en Ubuntu y simplemente implica la creación de un lanzador .desktop que establece la variable de entorno enferma en cuestión.

  1. Tome nota de dónde está instalado Android Studio 3, por ejemplo ~/opt/android-studio-3.

  2. Prepare su ícono local y el directorio de aplicaciones, en caso de que aún no exista:

    mkdir -vp ~/.local/share/icons ~/.local/share/applications
    
  3. Cree un ícono de Android Studio 3 que hará que su lanzador se destaque del ícono predeterminado y guárdelo en ~/.local/share/icons/android-studio-3.png. O puedes usar el que hice frotando un trozo de queso sobre el original ( ~/opt/android-studio-3/bin/studio.png):

    android-studio-3.png

  4. Cree un archivo de inicio de Android Studio 3 copiando y pegándolo en un shell:

    cat <<-EOF > ~/.local/share/applications/android-studio-3.desktop
    [Desktop Entry]
    Version=1.0
    Type=Application
    Name=Android Studio 3
    Icon=android-studio-3
    Exec=env LC_NUMERIC="en_US.UTF-8" opt/android-studio-3/bin/studio.sh "%f"
    Categories=Development;IDE;
    Terminal=false
    StartupWMClass=jetbrains-studio
    EOF
    
  5. Hazlo ejecutable:

    chmod +x ~/.local/share/applications/android-studio-3.desktop
    
  6. Ahora la parte complicada. Idealmente, debería poder buscar, iniciar y crear cortos para Android Studio 3 desde el tablero:

Para tu placer

Pero personalmente, casi siempre tengo problemas para que Ubuntu detecte mis archivos .desktop nuevos o modificados. Una solución es cerrar la sesión y volver a iniciarla. Si alguien sabe cómo forzar una nueva exploración, ¡hágamelo saber!

B) Arreglar el script de inicio de Android Studio

Aquí hay una solución fácil, elegante y semipermanente: solo cambie la configuración regional de Android Studio modificando su secuencia de comandos de inicio:

  1. Edite, studio.shpor ejemplo, ~/opt/android-studio/bin/studio.sho cualquiera que sea su ruta de instalación.

  2. En algún lugar en la parte superior del archivo, debajo #!/bin/shy antes de que aparezcan las primeras líneas de código, agregue esto:

    LC_NUMERIC="en_US.UTF-8".

    Aquí está la parte superior de mi studio.shpara completar:

    #!/bin/sh
    #
    # ---------------------------------------------------------------------
    # Android Studio startup script.
    # ---------------------------------------------------------------------
    #
    
    LC_NUMERIC="en_US.UTF-8"
    
    message()
    {
      TITLE="Cannot start Android Studio"
    ...
    
  3. Reinicie Android Studio

Una nota sobre la actualización de Android Studio o Gradle

Cuando más tarde actualice su instalación de Android Studio, detectará que ha modificado studio.sh. Debe dejar que el instalador reemplace el archivo y luego ejecutar el parche nuevamente como se describe arriba. Finalmente reinicia Android Studio y estarás listo nuevamente. Las otras soluciones no se ven afectadas por esto.

C) Arreglar el caparazón; Gradle, Jenkins, todo eso

La construcción desde el shell utilizando gradlewtambién requiere que se aplique la corrección. Esto solo afecta al shell y no a Android Studio. Elegir uno:

  1. O especifique la solución en cada invocación de esta manera:

    LC_NUMERIC="en_US.UTF-8" ./gradlew clean assDebug

  2. O para hacer esto permanente para el proyecto , edite el gradlewarchivo en la raíz del proyecto y en algún lugar de la parte superior agregue esto:

    LC_NUMERIC="en_US.UTF-8"

    Como aquí:

    #!/usr/bin/env bash
    
    ################################################################################    
    ##
    ##  Gradle start up script for UN*X
    ##
    ################################################################################
    
    LC_NUMERIC="en_US.UTF-8"
    
    # Add default JVM options here. You can al...
    DEFAULT_JVM_OPTS=""
    
    APP_NAME="Gradle"
    ...
    
  3. O, por supuesto, también puede agregar una solución global y permanente mediante el uso de un alias gr:

    cat <<EOF>>~/.bash_aliases
    
    # Fixing Android Studio 3 Canary bug https://stackoverflow.com/a/44304075/2412477
    alias gr='LC_NUMERIC="en_US.UTF-8" ./gradlew'
    EOF
    

    Tenga en cuenta que así es como se agregan los alias de shell bash en Ubuntu; si está en un sistema operativo diferente, quizás debería agregar ~ / .bashrc o ~ / .profile en su lugar.

    Luego, inicie un nuevo shell y ahora, en lugar de invocar, ./gradlewuse el nuevo alias gr:

    gr clean assDebug

La clara desventaja del n. ° 2 es que debe aplicarse a todos los proyectos manualmente. La ventaja, creo, es que esto se sobrescribirá automáticamente cuando se instale un nuevo gradlew, al igual que studio.shse reemplaza, por lo que puede probar si el error se ha solucionado =)

D) Deshabilitar APPT2 todos juntos

Personalmente, no haría esto, pero lo he agregado para completar, ya que definitivamente es una forma de hacer que appt2 deje de dar errores. Agregue esta línea a su gradle.properties:android.enableAapt2=false

Stephan Henningsen
fuente
10
esto parece una solución mucho mejor que la respuesta aceptada
lelloman
2
Por alguna razón, esto no me funciona. Obtuve Android Studio 3.0 Canary 3 y después de configurar todo esto, el problema de fusión persiste. Mi configuración regional es en_US.UTF-8
vladaman
1
Acabo de actualizar a canary 3 y volví aquí para copiar y pegar de nuevo, todavía me funciona
lelloman
1
@vladaman Esto corrige el error obvio de punto flotante, sin embargo, Android Studio 3.0 canary 3 sigue siendo más estricto que antes, y algunos errores en sus archivos de recursos que antes eran aceptados ahora causarán un error de fusión. Tenga en cuenta que a partir de hoy, la vista previa de la biblioteca de diseño tiene errores y no se compilará en Android Studio 3.0 canary 3.
aberaud
1
@Stephan Henningsen no está seguro de qué podría haber hecho mal, aunque en realidad estoy usando el SDK, las herramientas y las bibliotecas en la versión 26.X. Ya solucioné el error yo mismo deshabilitando aapt2 configurando android.enableAapt2(o similar) falseen mi gradle.properties. Muchas gracias por la útil respuesta de todos modos :)
Maxr1998
33

Resolví este problema agregando la siguiente línea a los archivos gradle.properties

android.enableAapt2=false
Hoshouns
fuente
2
Creo que esta respuesta merece su explicación.
ksugiarto
esta respuesta ayudó, pero no resuelve el problema, solo apaga el módulo gradle que lo causó, si necesita el aapt2, definitivamente agregue export LC_NUMERIC="en_US.UTF-8"a su .bashrc que funcionó a la
perfección
1
¿Qué pasa con los usuarios de MAC OS?
HendraWD
Estoy desarrollando en un entorno de Windows, ¿qué cambio necesito para esto?
Mehbube Arman
android.enableAapt2 = false está siendo obsoleto y se eliminará a finales de 2018.
XurajB
1

Este problema se ha solucionado en la versión estable de Android Studio más reciente. Actualizar su Android Studio a 3.0 debería resolver este problema por usted (tampoco es necesario deshabilitar AAPT2).

Izabela Orlowska
fuente
0

Asegúrese de no agregar ninguna unidad (dp) al usar format="float"

Estaba enfrentando el mismo problema porque genere automáticamente dimensiones usando Android Studio Extract dimen resourcey agregó un tipo de unidad como:

<item name="margin_top" type="dimen" format="float">51.75dp</item>

Debería ser:

<item name="margin_top" type="dimen" format="float">51.75</item>

Max
fuente
-6

añadir

maven{
 url 'https://maven.google.com'
}

para que los repositorios funcionen para mí

Romuald DANSOU
fuente
@EugenPechanec Sí
Romuald DANSOU
Eso no tiene ningún sentido. Si faltara el repositorio cuando lo necesitaba, no llegaría tan lejos como para fusionar recursos. La compilación fallará si faltan dependencias. Si no necesitara el repositorio, tenerlo especificado no cambiaría nada. OP no llegaría tan lejos en el proceso de compilación si no hubiera incluido la referencia de repositorio de Google Maven en su proyecto. Su respuesta no proporciona una solución al problema en cuestión. También debe haber realizado otros cambios.
Eugen Pechanec
-6

Bibliotecas necesarias para máquinas de 64 bits:

Si está ejecutando una versión de Ubuntu de 64 bits, debe instalar algunas bibliotecas de 32 bits con el siguiente comando:

sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386

Si está ejecutando Fedora de 64 bits, el comando es:

sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686
Linh Nguyễn Thế
fuente
No veo cómo la instalación de estos paquetes debería solucionar el problema en cuestión en el OP. ¿Cómo se relaciona este problema con un método de compresión desinflado? Ni siquiera tengo lib32z1 instalado yo mismo, y mi instalación funciona después de aplicar este stackoverflow.com/a/44304075/2412477 ; Recomiendo a cualquiera que lo intente antes de instalar paquetes potencialmente innecesarios.
Stephan Henningsen