Ошибка компиляции AAPT2: недопустимый размер на Android 3.0 Canary 1

88

Я играю с Instant Apps для Android. Я установил все правильные пакеты и устал создавать новое приложение с поддержкой Instant App (при создании нового приложения поставил флажок для Instant App). Проблема в том, что у меня всегда возникают проблемы с инструментами компиляции. Есть ли у кого-нибудь еще эта проблема и смог ли ее найти решение?

Моя среда:

  • Android Studio 3.0 Canary 1
  • Скомпилировать SDK: 25
  • Инструменты сборки: «26.0.0 rc2»
  • Плагин Gradle: 3.0.0-alpha1
  • Gradle: пробовал как gradle-4.0-milestone1, так и 2
  • Java 1.8 / 1.7
  • ОС: пробовал как Windows 10, так и Linux Ubuntu 16.4 LTS

Ошибка:

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

Рассматриваемая строка содержит (520):

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

Надеюсь, я предоставил вам достаточно информации для решения проблемы. Спасибо.

спосняк
источник
4
В качестве обходного пути для получения работающей сборки я в настоящее время отключил aapt2, и он работает для тестирования сборки ... вы можете сделать это, установив android.enableAapt2 = false в вашем файле gradle.properties. Я думаю, это может быть студийная ошибка, не уверен ...
Брюс Уэйн
Другое решение - stackoverflow.com/a/33943562/5125608 Это работает для меня.
anlijudavid
5
К вашему сведению, выпущена последняя канареечная сборка, 5, и Google упомянул ниже, что у них все еще есть проблема с этим AAPT2, как показано ниже
Infinite Loops

Ответы:

57

Обходной путь - переключить вашу машину разработки на локаль, которая использует "." как десятичный знак.

Его можно изменить следующим образом:

введите описание изображения здесь

сатуров
источник
6
Это сработало для меня. Применять общесистемные не нужно. Но перезапуска Android-Studio недостаточно. Вам нужно выйти и снова войти в систему (или перезапустить систему), чтобы изменения вступили в силу для сборки gradle.
Салим
14
Оно работает! Для linux вы должны сделать: export LC_NUMERIC = "en_US.UTF-8", а затем запустить Android Studio в том же приглашении
sposnjak
17
Я добавил export LC_NUMERIC = "en_US.UTF-8" в начало моего studio.sh, и он отлично работает. Я бы определенно не стал менять общесистемный языковой стандарт, чтобы обойти какую-то ошибку.
rzehan
7
...Wat? Безумие рекомендовать кому-то изменить общесистемный языковой стандарт только из-за одной ошибки в одном приложении. Это повлияет на форматирование даты, например, в почтовых клиентах, даже на язык и многое другое.
Стефан Хеннингсен
2
Ну я на windows. Какие-либо предложения?
user2520215 05
106

Ниже указаны четыре различных решения: A, B, C и D; выберите тот, который вам подходит:

A) Исправление Android Studio через файл запуска Ubuntu .desktop

Это альтернатива только для Ubuntu общему подходу к исправлению Android Studio (см. Ниже). Обратите внимание, что вы все равно можете реализовать часть об Исправлении оболочки и, возможно, даже отменить любые изменения, studio.shчтобы полностью подтвердить это исправление.

Мне надоело патчить мой studio.shдля каждого обновления канарейки, поэтому я придумал лучшее решение, которое устраняет этот шаг. Он работает в Ubuntu и просто включает в себя создание программы запуска .desktop, которая устанавливает соответствующую переменную среды.

  1. Запишите, где установлена ​​ваша Android Studio 3, например ~/opt/android-studio-3.

  2. Подготовьте локальный значок и каталог приложений, если они еще не существуют:

    mkdir -vp ~/.local/share/icons ~/.local/share/applications
    
  3. Создайте значок Android Studio 3, который выделит вашу программу запуска по сравнению со значком по умолчанию, и сохраните его в формате ~/.local/share/icons/android-studio-3.png. Или вы можете использовать тот, который я сделал, натерев кусок сыра о оригинал ( ~/opt/android-studio-3/bin/studio.png):

    android-studio-3.png

  4. Создайте файл запуска Android Studio 3, скопировав его и вставив в оболочку:

    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. Сделайте его исполняемым:

    chmod +x ~/.local/share/applications/android-studio-3.desktop
    
  6. А теперь самое сложное. В идеале вы должны уметь находить, запускать и создавать шорты для Android Studio 3 из Dash:

Для вашего удовольствия

Но лично у меня почти всегда возникают проблемы с тем, чтобы Ubuntu обнаруживал мои новые или измененные файлы .desktop. Одно из решений - выйти и снова войти. Если кто-нибудь знает, как принудительно выполнить повторное сканирование, дайте мне знать!

Б) Исправление скрипта запуска Android Studio

Вот простое, элегантное и полупостоянное исправление: измените локаль только самой Android Studio, изменив ее сценарий запуска:

  1. Отредактируйте, studio.shнапример, ~/opt/android-studio/bin/studio.shили другой путь установки.

  2. Где-нибудь в верхней части файла, ниже #!/bin/shи до появления первых строк кода добавьте следующее:

    LC_NUMERIC="en_US.UTF-8".

    Вот моя верхняя часть studio.shдля полноты:

    #!/bin/sh
    #
    # ---------------------------------------------------------------------
    # Android Studio startup script.
    # ---------------------------------------------------------------------
    #
    
    LC_NUMERIC="en_US.UTF-8"
    
    message()
    {
      TITLE="Cannot start Android Studio"
    ...
    
  3. Перезагрузите Android Studio

Примечание об обновлении Android Studio или Gradle

Когда вы позже обновите установку Android Studio, она обнаружит, что вы изменили studio.sh. Вы должны позволить программе установки заменить файл, а затем снова выполнить исправление, как описано выше. Наконец перезапустите Android Studio, и вы снова будете готовы. На другие решения это не влияет.

В) Крепление корпуса; Грейдл, Дженкинс, все это

Построение из оболочки с использованием gradlewтакже требует применения исправления. Это влияет только на оболочку, а не на Android Studio. Выбери один:

  1. Либо укажите исправление при каждом вызове следующим образом:

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

  2. Или, чтобы сделать это постоянным для проекта , отредактируйте gradlewфайл в корне проекта и где-нибудь вверху добавьте следующее:

    LC_NUMERIC="en_US.UTF-8"

    Как здесь:

    #!/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. Или, конечно, вы также можете добавить глобальное и постоянное исправление, используя псевдоним 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
    

    Обратите внимание, как псевдонимы оболочки bash добавляются в Ubuntu; если вы используете другую ОС, возможно, вам следует вместо этого добавить в ~ / .bashrc или ~ / .profile.

    Затем запустите новую оболочку и теперь вместо вызова ./gradlewиспользуйте новый псевдоним gr:

    gr clean assDebug

Явным недостатком №2 является то, что его нужно применять ко всем проектам вручную. Преимущество, я думаю, в том, что это будет автоматически перезаписано при установке нового gradlew, как и при studio.shзамене, поэтому вы можете проверить, исправлена ​​ли ошибка =)

Г) Отключение APPT2 все вместе

Лично я бы этого не делал, но я добавил это для полноты, поскольку это определенно способ заставить appt2 перестать выдавать ошибки. Добавьте эту строку в свой gradle.properties:android.enableAapt2=false

Стефан Хеннингсен
источник
10
это кажется гораздо лучшим решением, чем принятый ответ
lelloman 02
2
У меня почему-то не работает. Я получил Android Studio 3.0 Canary 3, и после всех настроек проблема слияния не исчезла. Моя локаль - en_US.UTF-8
vladaman 05
1
Я только что обновился до canary 3 и вернулся сюда, чтобы снова скопировать пасту, у меня все еще работает
lelloman
1
@vladaman Это исправляет очевидную ошибку с плавающей запятой, однако Android Studio 3.0 canary 3 по-прежнему строже, чем раньше, и некоторые ошибки в ваших файлах ресурсов, которые ранее были приняты, теперь вызывают ошибку слияния. Обратите внимание, что на сегодняшний день предварительный просмотр библиотеки дизайна содержит ошибки и не будет построен на Android Studio 3.0
canary
1
@Stephan Henningsen не уверен, что я мог сделать неправильно, хотя на самом деле я использую SDK, инструменты и библиотеки в версии 26.X. Я сам уже исправил ошибку, просто отключив aapt2, установив android.enableAapt2(или аналогично) falseв my gradle.properties. В любом случае большое спасибо за полезный ответ :)
Maxr1998
33

Я решил эту проблему, добавив следующую строку в файлы gradle.properties

android.enableAapt2=false
Hoshouns
источник
2
Я думаю, что этот ответ заслуживает своего объяснения.
ksugiarto
этот ответ помог, но не решает проблему, просто отключает модуль gradle, который его вызвал, если вам нужен aapt2, обязательно добавьте export LC_NUMERIC="en_US.UTF-8"в свой .bashrc, который работал для меня как шарм
lukassos
1
как насчет пользователей MAC OS?
HendraWD
Я разрабатываю в среде Windows, что мне для этого нужно изменить?
Mehbube Arman
android.enableAapt2 = false устарел и будет удален к концу 2018 года.
XurajB
1

Эта проблема исправлена ​​в последней стабильной версии Android Studio. Обновление Android Studio до 3.0 должно решить эту проблему для вас (также нет необходимости отключать AAPT2).

Изабела Орловска
источник
0

Убедитесь, что вы не добавляете никаких единиц (dp) при использовании format="float"

Я столкнулся с той же проблемой, потому что я автоматически сгенерировал размеры с помощью Android Studio, Extract dimen resourceи он добавил тип блока, например:

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

Должен быть:

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

Максимум
источник
-6

Добавить

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

чтобы репозитории работали у меня

Ромуальд ДАНСУ
источник
@EugenPechanec Yes
Romuald DANSOU
В этом нет никакого смысла. Если бы вам не хватало репозитория, когда он вам нужен, вы бы не добрались до объединения ресурсов. Сборка завершится ошибкой из-за отсутствия зависимостей. Если вам не нужен репозиторий, его указание ничего не изменит. OP не зашел бы так далеко в процессе сборки, если бы они еще не включили ссылку репозитория google maven в свой проект. Ваш ответ не дает решения возникшей проблемы. Вы, должно быть, внесли и другие изменения.
Eugen Pechanec
-6

Необходимые библиотеки для 64-битных машин:

Если вы используете 64-битную версию Ubuntu, вам необходимо установить некоторые 32-битные библиотеки с помощью следующей команды:

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

Если вы используете 64-битную Fedora, команда будет такой:

sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686
Линь Нгуен Тхо
источник
Я не понимаю, как установка этих пакетов должна решить проблему в OP. Как эта проблема связана с методом сжатия deflate? У меня даже не установлен lib32z1, и моя установка работает после применения этого stackoverflow.com/a/44304075/2412477 ; Я рекомендую всем попробовать это перед установкой потенциально ненужных пакетов.
Стефан Хеннингсен