A compilação de AAPT2 falhou: dimen inválido no Android 3.0 Canary 1

88

Estou brincando com Instant Apps para Android. Instalei todos os pacotes corretos e cansei para criar um novo aplicativo com suporte para Instant App (marquei a caixa para Instant App ao criar um novo aplicativo). O problema é que sempre encontro problemas com ferramentas de compilação. Alguém mais tem esse problema e foi capaz de encontrar alguma solução alternativa.

Meu ambiente:

  • Android Studio 3.0 Canary 1
  • Compilar SDK: 25
  • Ferramentas de construção: "26.0.0 rc2"
  • Plug-in Gradle: 3.0.0-alpha1
  • Gradle: testei gradle-4.0-milestone1 e 2
  • Java 1.8 / 1.7
  • SO: testei Windows 10 e Linux Ubuntu 16.4 LTS

O erro:

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

A linha em questão contém (520):

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

Espero ter fornecido informações suficientes para você resolver o problema. Obrigado.

Sposnjak
fonte
4
Como uma solução alternativa para fazer a compilação funcionar, atualmente desativei o aapt2 e ele funciona para testar a compilação ... você pode fazer isso configurando android.enableAapt2 = false em seu arquivo gradle.properties. Acho que pode ser um bug do estúdio, não tenho certeza ...
BruceWayne
Outra solução é stackoverflow.com/a/33943562/5125608 Funciona para mim.
anlijudavid
5
A versão mais recente do canário para conhecimento, 5, foi lançada e o Google mencionou abaixo que eles ainda têm problemas com este AAPT2 como segue, AAPT2. Continuamos a estabilizar o AAPT2, que permite o processamento incremental de recursos. Se a sua construção falhar devido a um problema de processamento de recursos, envie-nos um relatório de bug. Para desativar temporariamente o AAPT, defina android.enableAapt2 = false em seu arquivo gradle.properties. Roboelectric atualmente não é compatível com AAPT2
Infinite Loops

Respostas:

57

A solução alternativa é mudar sua máquina de desenvolvimento para um local que use "." como uma marca decimal.

Pode ser alterado da seguinte forma:

insira a descrição da imagem aqui

Saturov
fonte
6
Isso funcionou para mim. Aplicar em todo o sistema não era necessário. Mas reiniciar o Android-Studio não é suficiente. Você precisa fazer logout e login novamente (ou reiniciar o sistema) para tornar as alterações ativas para o gradle build.
Salim de
14
Funciona! Para o Linux, você deve fazer: export LC_NUMERIC = "en_US.UTF-8" e, em seguida, iniciar o Android Studio no mesmo prompt
sposnjak
17
Eu adicionei export LC_NUMERIC = "en_US.UTF-8" ao início do meu studio.sh e funcionou bem. Eu certamente não mudaria a localidade do meu sistema apenas para contornar algum bug.
Rzehan
7
... wat? Recomendar a alguém que mude a localidade de todo o sistema apenas por causa de um bug em um aplicativo é uma loucura. Isso afetará como sua data é formatada, por exemplo, nos clientes de email, até mesmo no idioma e em quase tudo o mais.
Stephan Henningsen
2
Bem, estou no Windows. Alguma sugestão?
user2520215
106

Abaixo são mencionadas quatro soluções diferentes: A, B, C e D; escolha um que seja adequado para você:

A) Correção do Android Studio por meio do arquivo de inicialização do Ubuntu .desktop

Esta é uma alternativa apenas do Ubuntu para a abordagem geral de correção do Android Studio (veja abaixo). Observe que você ainda pode querer implementar a parte sobre como corrigir o shell e talvez até mesmo reverter quaisquer modificações para studio.shpara confirmar totalmente esta correção.

Eu cansei de corrigir o meu studio.shpara cada atualização do canário, então eu vim com uma solução melhor que elimina esta etapa. Ele funciona no Ubuntu e envolve simplesmente a criação de um iniciador .desktop que define a variável de ambiente doente em questão.

  1. Anote onde o Android Studio 3 está instalado, por exemplo ~/opt/android-studio-3.

  2. Prepare seu ícone local e diretório de aplicativos, caso ainda não existam:

    mkdir -vp ~/.local/share/icons ~/.local/share/applications
  3. Crie um ícone do Android Studio 3 que fará seu iniciador se destacar do ícone padrão e salve-o no ~/.local/share/icons/android-studio-3.png. Ou você pode usar o que fiz esfregando um pedaço de queijo no original ( ~/opt/android-studio-3/bin/studio.png):

    android-studio-3.png

  4. Crie um arquivo inicializador do Android Studio 3 copiando e colando-o em um 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. Torne-o executável:

    chmod +x ~/.local/share/applications/android-studio-3.desktop
  6. Agora para a parte mais complicada. Idealmente, você deve ser capaz de encontrar, iniciar e criar shorts para Android Studio 3 a partir do Dash:

Para o seu prazer

Mas, pessoalmente, quase sempre tenho problemas para fazer o Ubuntu detectar meus arquivos .desktop novos ou alterados. Uma solução é fazer logout e login novamente. Se alguém souber como forçar uma nova varredura, me avise!

B) Corrigindo o script de inicialização do Android Studio

Aqui está uma correção fácil, elegante e semipermanente: apenas altere a localidade do próprio Android Studio modificando seu script de inicialização:

  1. Edite, studio.shpor exemplo, ~/opt/android-studio/bin/studio.shou qualquer que seja o seu caminho de instalação.

  2. Em algum lugar na parte superior do arquivo, abaixo #!/bin/she antes que as primeiras linhas de código apareçam, adicione o seguinte:

    LC_NUMERIC="en_US.UTF-8".

    Aqui está a parte superior do meu studio.shpara integridade:

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

Uma nota sobre a atualização do Android Studio ou Gradle

Quando você atualizar posteriormente a instalação do Android Studio, ele detectará que você modificou studio.sh. Você deve deixar o instalador substituir o arquivo e, em seguida, executar o patch novamente conforme descrito acima. Finalmente reinicie o Android Studio, e você estará pronto novamente. As outras soluções não são afetadas por isso.

C) Fixação da carcaça; Gradle, Jenkins, tudo isso

Construir a partir do shell usando gradlewtambém requer que a correção seja aplicada. Isso afeta apenas o shell e não o Android Studio. Escolha um:

  1. Especifique a correção em cada invocação desta forma:

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

  2. Ou para tornar isso permanente para o projeto , edite o gradlewarquivo na raiz do projeto e, em algum lugar no topo, adicione isto:

    LC_NUMERIC="en_US.UTF-8"

    Como aqui:

    #!/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. Ou, é claro, você também pode adicionar uma correção global e permanente através do uso de um 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

    Observe que é assim que os aliases do shell bash são adicionados no Ubuntu; se você estiver em um sistema operacional diferente, talvez deva anexar a ~ / .bashrc ou ~ / .profile.

    Em seguida, inicie um novo shell e agora, em vez de invocar, ./gradlewuse o novo alias gr:

    gr clean assDebug

A clara desvantagem do nº 2 é que isso deve ser aplicado a todos os projetos manualmente. A vantagem, eu acho, é que isso será substituído automaticamente quando um novo gradlew for instalado, bem comostudio.sh é substituído, então você pode testar se o bug foi corrigido =)

D) Desativando APPT2 todos juntos

Pessoalmente, eu não faria isso, mas eu adicionei para completar, já que é definitivamente uma maneira de fazer o appt2 parar de dar erros. Adicione esta linha ao seu gradle.properties:android.enableAapt2=false

Stephan Henningsen
fonte
10
esta parece uma solução muito melhor do que a resposta aceita
lelloman
2
Por algum motivo, isso não funciona para mim. Eu tenho o Android Studio 3.0 Canary 3 e depois de configurar tudo isso o problema de mesclagem persiste. Minha localidade é en_US.UTF-8
vladaman
1
Acabei de atualizar para o canário 3 e voltei aqui para copiar e colar novamente, ainda está funcionando para mim
lelloman
1
@vladaman Isso corrige o bug óbvio de ponto flutuante, no entanto, o Android Studio 3.0 canary 3 ainda é mais rígido do que antes, e alguns bugs em seus arquivos de recursos que antes eram aceitos agora causarão um erro de mesclagem. Observe que a partir de hoje, a visualização da biblioteca de design está bugada e não será construída no Android Studio 3.0 canary 3.
aberaud
1
@Stephan Henningsen não tenho certeza do que eu poderia ter feito de errado, embora eu esteja realmente usando o SDK, as ferramentas e as libs na versão 26.X. Eu já consertei o erro apenas desabilitando aapt2 configurando android.enableAapt2(ou similar) para falseno meu gradle.properties. Muito obrigado pela resposta útil de qualquer maneira :)
Maxr1998
33

Resolvi esse problema adicionando a seguinte linha aos arquivos gradle.properties

android.enableAapt2=false
Hoshouns
fonte
2
Acho que essa resposta merece sua explicação.
ksugiarto
esta resposta ajudou, mas não resolve o problema apenas desliga o módulo gradle que o causou, se você precisar do aapt2, então definitivamente adicione export LC_NUMERIC="en_US.UTF-8"ao seu .bashrc que funcionou
perfeitamente
1
e os usuários do MAC OS?
HendraWD
Estou desenvolvendo em ambiente windows, que mudança preciso para isso?
Mehbube Arman
android.enableAapt2 = false está sendo descontinuado e será removido até o final de 2018.
XurajB
1

Esse problema foi corrigido no mais recente estábulo do Android Studio. Atualizar seu Android Studio para 3.0 deve resolver esse problema para você (também não é necessário desativar o AAPT2).

Izabela Orlowska
fonte
0

Certifique-se de não adicionar unidades (dp) ao usar format="float"

Eu estava enfrentando o mesmo problema porque gerei dimensões automaticamente usando o Android Studio Extract dimen resourcee adicionei um tipo de unidade como:

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

Deveria ser:

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

Max
fonte
-6

adicionar

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

para repositórios trabalhar para mim

Romuald DANSOU
fonte
@EugenPechanec Sim
Romuald DANSOU
Isso não faz sentido. Se você estivesse perdendo o repositório quando precisava, não iria tão longe quanto mesclar recursos. O build falharia com dependências ausentes. Se você não precisava do repositório, tê-lo especificado não mudaria nada. O OP não chegaria tão longe no processo de construção se ainda não tivesse incluído a referência google maven repo em seu projeto. Sua resposta não fornece solução para o problema em questão. Você deve ter feito outras alterações também.
Eugen Pechanec
-6

Bibliotecas necessárias para máquinas de 64 bits:

Se você estiver executando uma versão de 64 bits do Ubuntu, precisará instalar algumas bibliotecas de 32 bits com o seguinte comando:

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

Se você estiver executando o Fedora de 64 bits, o comando é:

sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686
Linh Nguyễn Thế
fonte
Não vejo como a instalação desses pacotes deve resolver o problema em questão no OP. Como esse problema está relacionado a um método de compressão de esvaziamento? Eu nem mesmo tenho o lib32z1 instalado, e minha instalação funciona após aplicar este stackoverflow.com/a/44304075/2412477 ; Recomendo a qualquer pessoa que tente isso antes de instalar pacotes potencialmente desnecessários.
Stephan Henningsen