Kompilacja AAPT2 nie powiodła się: nieprawidłowy wymiar w systemie Android 3.0 Canary 1

88

Bawię się aplikacjami błyskawicznymi na Androida, zainstalowałem wszystkie poprawne pakiety i byłem zmęczony tworzeniem nowej aplikacji z obsługą aplikacji błyskawicznej (zaznaczone pole dla aplikacji błyskawicznej podczas tworzenia nowej aplikacji). Problem w tym, że zawsze mam problem z narzędziami do kompilacji. Czy ktoś inny ma ten problem i był w stanie znaleźć jakieś obejście.

Moje otoczenie:

  • Android Studio 3.0 Canary 1
  • Skompiluj SDK: 25
  • Narzędzia kompilacji: „26.0.0 rc2”
  • Wtyczka Gradle: 3.0.0-alpha1
  • Gradle: wypróbowałem oba poziomy gradle-4.0-milestone1 i 2
  • Java 1.8 / 1.7
  • System operacyjny: wypróbowano zarówno system Windows 10, jak i Linux Ubuntu 16.4 LTS

Błąd:

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

Przedmiotowa linia zawiera (520):

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

Mam nadzieję, że dostarczyłem Ci wystarczająco dużo informacji, aby rozwiązać problem. Dziękuję Ci.

sposnjak
źródło
4
Aby obejść problem, aby kompilacja działała, obecnie wyłączyłem aapt2 i działa on do testowania kompilacji ... możesz to zrobić, ustawiając android.enableAapt2 = false w pliku gradle.properties. Myślę, że to może być błąd studia, nie jestem pewien ...
BruceWayne
Inne rozwiązanie to stackoverflow.com/a/33943562/5125608 To działa dla mnie.
anlijudavid
5
Najnowsza wersja kanaryjska FYI, 5, została wydana, a Google wspomniał poniżej, że nadal ma problem z tym AAPT2 w następujący sposób, AAPT2. Kontynuujemy stabilizację AAPT2, który umożliwia przyrostowe przetwarzanie zasobów. Jeśli twoja kompilacja nie powiedzie się z powodu problemu z przetwarzaniem zasobów, prześlij nam raport o błędzie. Aby tymczasowo wyłączyć AAPT, ustaw android.enableAapt2 = false w pliku gradle.properties. Roboelectric nie jest obecnie kompatybilny z AAPT2
Nieskończone pętle,

Odpowiedzi:

57

Sposób obejścia problemu polega na przełączeniu maszyny deweloperskiej na ustawienia regionalne, które używają „.” jako znak dziesiętny.

Można to zmienić w następujący sposób:

wprowadź opis obrazu tutaj

saturov
źródło
6
To zadziałało dla mnie. Stosowanie w całym systemie nie było konieczne. Ale ponowne uruchomienie Android-Studio nie wystarczy. Musisz się wylogować i zalogować ponownie (lub zrestartować system), aby aktywować zmiany dla budowania Gradle.
Salim
14
To działa! W przypadku Linuksa należy: wyeksportować LC_NUMERIC = "en_US.UTF-8", a następnie uruchomić Android Studio w tym samym
znaku
17
Dodałem eksport LC_NUMERIC = "en_US.UTF-8" na początku mojego studio.sh i działa dobrze. Z pewnością nie zmieniłbym ustawień regionalnych dla całego systemu tylko po to, aby obejść jakiś błąd.
rzehan
7
... co? Polecanie komuś zmiany ustawień regionalnych w całym systemie tylko z powodu jednego błędu w jednej aplikacji jest szalone. Wpłynie to na format Twojej daty, np. W klientach poczty e-mail, a nawet na język i prawie wszystko inne.
Stephan Henningsen
2
Cóż, jestem na oknach. Jakieś sugestie?
user2520215
106

Poniżej wymieniono cztery różne rozwiązania: A, B, C i D; wybierz taki, który Ci odpowiada:

A) Naprawianie Android Studio za pośrednictwem pliku uruchamiania Ubuntu .desktop

Jest to tylko dla Ubuntu alternatywa dla ogólnego podejścia do naprawy Android Studio (patrz poniżej). Zwróć uwagę, że nadal możesz chcieć zaimplementować część dotyczącą naprawiania powłoki , a może nawet cofnąć wszelkie modyfikacje, aby studio.shw pełni potwierdzić tę poprawkę.

Zmęczyło mnie łatanie mojej studio.shdla każdej aktualizacji kanarka, więc wymyśliłem lepsze rozwiązanie, które eliminuje ten krok. Działa na Ubuntu i po prostu polega na utworzeniu programu uruchamiającego .desktop, który ustawia zmienną środowiskową, o której mowa.

  1. Zanotuj, gdzie jest zainstalowane Twoje Android Studio 3, np ~/opt/android-studio-3.

  2. Przygotuj lokalną ikonę i katalog aplikacji, na wypadek gdyby te jeszcze nie istniały:

    mkdir -vp ~/.local/share/icons ~/.local/share/applications
    
  3. Utwórz ikonę Android Studio 3, która wyróżni Twój program uruchamiający na tle domyślnej ikony i zapisz go w ~/.local/share/icons/android-studio-3.png. Lub możesz użyć tego, który zrobiłem, pocierając kawałek sera o oryginał ( ~/opt/android-studio-3/bin/studio.png):

    android-studio-3.png

  4. Utwórz plik programu uruchamiającego Android Studio 3, kopiując i wklejając go do powłoki:

    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. Spraw, aby był wykonywalny:

    chmod +x ~/.local/share/applications/android-studio-3.desktop
    
  6. Teraz trudniejsza część. Idealnie byłoby, gdybyś był w stanie znaleźć, uruchomić i stworzyć krótkie spodenki dla Android Studio 3 z poziomu Dash:

Dla Twojej przyjemności

Ale osobiście prawie zawsze mam problem z wykrywaniem przez Ubuntu moich nowych lub zmienionych plików .desktop. Jednym z rozwiązań jest wylogowanie się i ponowne zalogowanie. Jeśli ktoś wie, jak wymusić ponowne skanowanie, daj mi znać!

B) Naprawianie skryptu startowego Android Studio

Oto łatwa, elegancka i półtrwała poprawka: Zmień ustawienia regionalne samego Androida Studio, modyfikując jego skrypt startowy:

  1. Edytuj studio.shnp. ~/opt/android-studio/bin/studio.shLub jakąkolwiek ścieżkę instalacji.

  2. Gdzieś na górze pliku, poniżej #!/bin/shi przed pojawieniem się pierwszych linii kodu, dodaj to:

    LC_NUMERIC="en_US.UTF-8".

    Oto górna część mojego studio.shdla kompletności:

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

Uwaga dotycząca aktualizacji Android Studio lub Gradle

Kiedy później zaktualizujesz instalację Android Studio, wykryje, że dokonałeś modyfikacji studio.sh. Powinieneś pozwolić instalatorowi zastąpić plik, a następnie ponownie wykonać poprawkę, jak opisano powyżej. Na koniec uruchom ponownie Android Studio, a będziesz gotowy ponownie. Nie ma to wpływu na inne rozwiązania.

C) Mocowanie powłoki; Gradle, Jenkins i to wszystko

Budowanie ze stanu surowego gradlewrównież wymaga zastosowania poprawki. Dotyczy to tylko powłoki, a nie Android Studio. Wybierz jedno:

  1. Albo określ poprawkę przy każdym wywołaniu w następujący sposób:

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

  2. Lub, aby uczynić to stałym dla projektu , edytuj gradlewplik w katalogu głównym projektu i gdzieś na górze dodaj to:

    LC_NUMERIC="en_US.UTF-8"

    Jak tutaj:

    #!/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. Lub możesz oczywiście dodać globalną i trwałą poprawkę za pomocą aliasu 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
    

    Zauważ, że w ten sposób aliasy powłoki bash są dodawane w systemie Ubuntu; jeśli korzystasz z innego systemu operacyjnego, być może powinieneś dołączyć do ~ / .bashrc lub ~ / .profile.

    Następnie uruchom nową powłokę i zamiast wywoływać ./gradlewużyj nowego aliasu gr:

    gr clean assDebug

Wyraźną wadą # 2 jest to, że musi to być stosowane do wszystkich projektów ręcznie. Myślę, że zaletą jest to, że zostanie to automatycznie nadpisane po zainstalowaniu nowego gradlewu, podobnie jak studio.shzostanie zastąpione, więc możesz sprawdzić, czy błąd został naprawiony =)

D) Całkowite wyłączenie APPT2

Osobiście nie zrobiłbym tego, ale dodałem to dla kompletności, ponieważ zdecydowanie jest to sposób, aby appt2 przestał dawać błędy. Dodaj tę linię do gradle.properties:android.enableAapt2=false

Stephan Henningsen
źródło
10
wydaje się, że jest to znacznie lepsze obejście niż akceptowana odpowiedź
lelloman
2
Z jakiegoś powodu to nie działa dla mnie. Mam Androida Studio 3.0 Canary 3 i po ustawieniu tego wszystkiego problem z łączeniem się utrzymuje. Moje ustawienia regionalne to en_US.UTF-8
vladaman
1
Właśnie zaktualizowałem do wersji Canary 3 i wróciłem tutaj, aby ponownie skopiować wklej, nadal działa dla mnie
lelloman
1
@vladaman To naprawia oczywisty błąd zmiennoprzecinkowy, jednak Android Studio 3.0 canary 3 jest nadal bardziej rygorystyczny niż wcześniej, a niektóre błędy w plikach zasobów, które zostały wcześniej zaakceptowane, będą teraz powodować błąd scalania. Zwróć uwagę, że na dzień dzisiejszy podgląd biblioteki projektów ma błędy i nie będzie
oparty
1
@Stephan Henningsen nie jest pewien, co mogłem zrobić źle, chociaż w rzeczywistości używam SDK, narzędzi i bibliotek w wersji 26.X. Sam już naprawiłem błąd, wyłączając aapt2, ustawiając android.enableAapt2(lub podobnie) falsew moim gradle.properties. I tak bardzo dziękuję za pomocną odpowiedź :)
Maxr1998
33

Rozwiązałem ten problem, dodając następujący wiersz do plików gradle.properties

android.enableAapt2=false
Hoshouns
źródło
2
Myślę, że ta odpowiedź zasługuje na wyjaśnienie.
ksugiarto
ta odpowiedź pomogła ale nie rozwiązuje problemu po prostu wyłącza moduł gradle, który go spowodował, jeśli potrzebujesz aapt2 to zdecydowanie dodaj export LC_NUMERIC="en_US.UTF-8"do swojego .bashrc który działał jak urok dla mnie
lukassos
1
a co z użytkownikami MAC OS?
HendraWD
Programuję w środowisku Windows, jakiej zmiany potrzebuję w tym celu?
Mehbube Arman
android.enableAapt2 = false jest przestarzałe i zostanie usunięte do końca 2018 r.
XurajB
1

Ten problem został rozwiązany w najnowszej stabilnej wersji Android Studio. Aktualizacja Android Studio do 3.0 powinna rozwiązać ten problem (również nie ma potrzeby wyłączania AAPT2).

Izabela Orłowska
źródło
0

Upewnij się, że nie dodajesz żadnych jednostek (dp) podczas używania format="float"

Miałem ten sam problem, ponieważ automatycznie wygenerowałem wymiary za pomocą Android Studio przy użyciu Extract dimen resourcei dodałem typ jednostki, taki jak:

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

Powinno być:

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

Maks
źródło
-6

Dodaj

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

repozytoria działają dla mnie

Romuald DANSOU
źródło
@EugenPechanec Yes
Romuald DANSOU
To nie ma żadnego sensu. Gdybyś przegapił repozytorium, gdy go potrzebujesz, nie doszedłbyś do scalania zasobów. Kompilacja zakończyłaby się niepowodzeniem z brakującymi zależnościami. Gdybyś nie potrzebował repozytorium, określenie go nie zmieniłoby niczego. OP nie zaszedłby tak daleko w procesie kompilacji, gdyby nie uwzględnił jeszcze odniesienia do repozytorium Google Maven w swoim projekcie. Twoja odpowiedź nie zapewnia rozwiązania problemu. Musiałeś też wprowadzić inne zmiany.
Eugen Pechanec
-6

Wymagane biblioteki dla maszyn 64-bitowych:

Jeśli używasz 64-bitowej wersji Ubuntu, musisz zainstalować niektóre biblioteki 32-bitowe za pomocą następującego polecenia:

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

Jeśli używasz 64-bitowej Fedory, polecenie brzmi:

sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686
Linh Nguyễn Thế
źródło
Nie rozumiem, jak zainstalowanie tych pakietów powinno rozwiązać problem w OP. W jaki sposób ten problem jest powiązany z metodą kompresji deflate? Nie mam nawet zainstalowanego lib32z1, a moja instalacja działa po zastosowaniu tego stackoverflow.com/a/44304075/2412477 ; Polecam każdemu wypróbowanie tego przed zainstalowaniem potencjalnie niepotrzebnych pakietów.
Stephan Henningsen