Échec de la compilation AAPT2: dimen non valide sur Android 3.0 Canary 1

88

Je joue avec les applications instantanées pour Android, j'ai installé tous les packages appropriés et je suis fatigué de créer une nouvelle application avec le support de l'application instantanée (coché la case pour l'application instantanée lors de la création d'une nouvelle application). Le problème est que je rencontre toujours un problème avec les outils de compilation. Est-ce que quelqu'un d'autre a ce problème et a pu trouver une solution de contournement.

Mon environnement:

  • Android Studio 3.0 Canary 1
  • Compiler le SDK: 25
  • Outils de construction: "26.0.0 rc2"
  • Plug-in Gradle: 3.0.0-alpha1
  • Gradle: essayé à la fois gradle-4.0-milestone1 et 2
  • Java 1.8 / 1.7
  • OS: essayé à la fois Windows 10 et Linux Ubuntu 16.4 LTS

L'erreur:

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 ligne en question contient (520):

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

J'espère que je vous ai fourni suffisamment d'informations pour résoudre le problème. Je vous remercie.

sposnjak
la source
4
Pour contourner le problème pour que la construction fonctionne, j'ai actuellement désactivé aapt2 et cela fonctionne pour tester la construction ... vous pouvez le faire en définissant android.enableAapt2 = false dans votre fichier gradle.properties. Je pense que cela pourrait être un bug de studio pas sûr ...
BruceWayne
Une autre solution est stackoverflow.com/a/33943562/5125608 Cela fonctionne pour moi.
anlijudavid
5
Pour info, la dernière version de Canary, 5, est publiée et Google a mentionné ci-dessous qu'ils avaient toujours des problèmes avec cet AAPT2 comme suit, AAPT2. Nous continuons à stabiliser AAPT2 qui permet le traitement incrémentiel des ressources. Si votre build échoue en raison d'un problème de traitement des ressources, veuillez nous envoyer un rapport de bogue. Pour désactiver temporairement AAPT, définissez android.enableAapt2 = false dans votre fichier gradle.properties. Roboelectric n'est actuellement pas compatible avec AAPT2
Infinite Loops

Réponses:

57

La solution de contournement consiste à basculer votre machine de développement vers une locale qui utilise "." sous forme de marque décimale.

Il peut être modifié de la manière suivante:

entrez la description de l'image ici

saturov
la source
6
Cela a fonctionné pour moi. L'application à l'échelle du système n'était pas nécessaire. Mais redémarrer Android-Studio ne suffit pas. Vous devez vous déconnecter et vous reconnecter (ou redémarrer votre système) pour rendre les modifications actives pour la génération gradle.
Salim
14
Ça marche! Pour Linux, vous devez faire: exporter LC_NUMERIC = "en_US.UTF-8" puis démarrer Android Studio dans la même invite
sposnjak
17
J'ai ajouté export LC_NUMERIC = "en_US.UTF-8" au début de mon studio.sh et cela fonctionne très bien. Je ne changerais certainement pas les paramètres régionaux de mon système juste pour contourner un bogue.
rzehan
7
... wat? Recommander à quelqu'un de changer les paramètres régionaux du système juste à cause d'un bogue dans une application est fou. Cela aura un impact sur la façon dont votre date est formatée, par exemple dans les clients de messagerie, même la langue et à peu près tout le reste aussi.
Stephan Henningsen
2
Eh bien, je suis sous windows. Aucune suggestion?
user2520215
106

Ci-dessous sont mentionnés quatre solutions différentes: A, B, C et D; choisissez celui qui vous convient:

A) Correction d'Android Studio via le fichier de lancement Ubuntu .desktop

Il s'agit d'une alternative Ubuntu uniquement à l'approche générale de la correction d'Android Studio (voir ci-dessous). Notez que vous voudrez peut-être toujours implémenter la partie sur la correction du shell , et peut-être même annuler les modifications apportées àstudio.sh confirmer complètement ce correctif.

J'étais fatigué de patcher mon studio.shpour chaque mise à jour Canary, alors j'ai trouvé une meilleure solution qui élimine cette étape. Cela fonctionne sur Ubuntu et implique simplement la création d'un lanceur .desktop qui définit la variable d'environnement malade en question.

  1. Notez où votre Android Studio 3 est installé, par exemple ~/opt/android-studio-3.

  2. Préparez votre icône locale et votre répertoire d'applications, au cas où ils n'existeraient pas déjà:

    mkdir -vp ~/.local/share/icons ~/.local/share/applications
  3. Créez une icône Android Studio 3 qui permettra à votre lanceur de se démarquer de l'icône par défaut et de l'enregistrer dans ~/.local/share/icons/android-studio-3.png. Ou vous pouvez utiliser celui que j'ai fait en frottant un morceau de fromage sur l'original ( ~/opt/android-studio-3/bin/studio.png):

    android-studio-3.png

  4. Créez un fichier de lancement d'Android Studio 3 en copiant et en le collant dans 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. Rendez-le exécutable:

    chmod +x ~/.local/share/applications/android-studio-3.desktop
  6. Passons maintenant à la partie délicate. Idéalement, vous devriez être en mesure de trouver, démarrer et créer des courts métrages pour Android Studio 3 à partir du tableau de bord:

À votre service

Mais personnellement, j'ai presque toujours du mal à faire en sorte qu'Ubuntu détecte mes fichiers .desktop nouveaux ou modifiés. Une solution consiste à se déconnecter et à se reconnecter. Si quelqu'un sait comment forcer une nouvelle analyse, faites-le moi savoir!

B) Correction du script de démarrage d'Android Studio

Voici une solution simple, élégante et semi-permanente: changez uniquement les paramètres régionaux d'Android Studio lui-même en modifiant son script de démarrage:

  1. Modifiez studio.shpar exemple ~/opt/android-studio/bin/studio.shou quel que soit votre chemin d'installation.

  2. Quelque part en haut du fichier, en dessous #!/bin/shet avant que les premières lignes de code apparaissent, ajoutez ceci:

    LC_NUMERIC="en_US.UTF-8".

    Voici la partie supérieure de mon studio.shpour l'exhaustivité:

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

Une note sur la mise à niveau d'Android Studio ou Gradle

Lorsque vous mettrez à jour ultérieurement votre installation Android Studio, il détectera que vous avez modifié studio.sh . Vous devez laisser le programme d'installation remplacer le fichier, puis exécuter à nouveau le correctif comme décrit ci-dessus. Enfin, redémarrez Android Studio et vous serez à nouveau prêt. Les autres solutions n'en sont pas affectées.

C) Fixation de la coque; Gradle, Jenkins, tout ça

La construction à partir du shell en utilisant gradlewnécessite également l'application du correctif. Cela affecte uniquement le shell et non Android Studio. Choisissez-en un:

  1. Soit spécifiez le correctif à chaque appel comme ceci:

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

  2. Ou pour rendre cela permanent pour le projet , éditez le gradlewfichier à la racine du projet et quelque part en haut, ajoutez ceci:

    LC_NUMERIC="en_US.UTF-8"

    Comme ici:

    #!/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 vous pouvez bien sûr ajouter aussi une solution globale et permanente si l'utilisation d'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

    Notez que c'est ainsi que les alias de shell bash sont ajoutés sur Ubuntu; si vous êtes sur un OS différent, vous devriez peut-être ajouter à la place ~ / .bashrc ou ~ / .profile.

    Ensuite, démarrez un nouveau shell et maintenant, au lieu d'appeler, ./gradlewutilisez le nouvel alias gr:

    gr clean assDebug

L'inconvénient évident du n ° 2 est que cela doit être appliqué à tous les projets manuellement. L'avantage, je pense, est que cela sera automatiquement écrasé lorsqu'un nouveau gradlew est installé, un peu commestudio.sh remplacé, vous pouvez donc tester si le bogue a été corrigé =)

D) Désactiver APPT2 tous ensemble

Personnellement, je ne ferais pas cela, mais je l'ai ajouté par souci d'exhaustivité car c'est définitivement un moyen de faire en sorte que appt2 cesse de donner des erreurs. Ajoutez cette ligne à votre gradle.properties:android.enableAapt2=false

Stephan Henningsen
la source
10
cela semble une bien meilleure solution de contournement que la réponse acceptée
lelloman
2
Pour une raison quelconque, cela ne fonctionne pas pour moi. J'ai Android Studio 3.0 Canary 3 et après avoir configuré tout cela, le problème de fusion persiste. Ma locale est en_US.UTF-8
vladaman
1
Je viens de mettre à jour vers Canary 3 et je suis revenu ici pour copier-coller à nouveau, cela fonctionne toujours pour moi
lelloman
1
@vladaman Cela corrige le bogue évident de la virgule flottante, mais Android Studio 3.0 Canary 3 est toujours plus strict qu'avant, et certains bogues dans vos fichiers de ressources qui étaient précédemment acceptés provoquent désormais une erreur de fusion. Notez qu'à partir d'aujourd'hui, l'aperçu de la bibliothèque de conception est bogué et ne sera pas basé sur Android Studio 3.0 Canary 3.
basé
1
@Stephan Henningsen ne sait pas ce que j'aurais pu faire de mal, bien que j'utilise en fait le SDK, les outils et les bibliothèques de la version 26.X. J'ai déjà corrigé l'erreur moi-même en désactivant simplement aapt2 en définissant android.enableAapt2(ou similaire) sur falsedans my gradle.properties. Merci beaucoup pour la réponse utile quand même :)
Maxr1998
33

J'ai résolu ce problème en ajoutant la ligne suivante aux fichiers gradle.properties

android.enableAapt2=false
Hoshouns
la source
2
Je pense que cette réponse mérite son explication.
ksugiarto
cette réponse a aidé mais ne résout pas le problème éteint simplement le module gradle qui l'a causé, si vous avez besoin de l'aapt2, ajoutez définitivement export LC_NUMERIC="en_US.UTF-8"à votre .bashrc qui a fonctionné comme un charme pour moi
lukassos
1
qu'en est-il des utilisateurs de MAC OS?
HendraWD
Je développe dans un environnement Windows, de quel changement ai-je besoin pour cela?
Mehbube Arman
android.enableAapt2 = false est obsolète et sera supprimé d'ici la fin de 2018.
XurajB
1

Ce problème a été résolu dans la dernière version stable d'Android Studio. La mise à niveau de votre Android Studio vers 3.0 devrait résoudre ce problème pour vous (pas besoin de désactiver AAPT2).

Izabela Orlowska
la source
0

Assurez-vous de ne pas ajouter d'unités (dp) lors de l'utilisation format="float"

J'étais confronté au même problème parce que j'avais généré automatiquement des dimens à l'aide d'Android Studio Extract dimen resourceet qu'il avait ajouté un type d'unité comme:

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

Ça devrait être:

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

Max
la source
-6

ajouter

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

les référentiels fonctionnent pour moi

Romuald DANSOU
la source
@EugenPechanec Yes
Romuald DANSOU
Cela n'a aucun sens. Si vous manquiez le référentiel lorsque vous en aviez besoin, vous n'iriez pas jusqu'à fusionner des ressources. La construction échouerait avec des dépendances manquantes. Si vous n'avez pas besoin du référentiel, le spécifier ne changerait rien. OP n'irait pas aussi loin dans le processus de construction s'ils n'ont pas déjà inclus la référence de repo google maven dans leur projet. Votre réponse n'apporte pas de solution au problème actuel. Vous devez également avoir apporté d'autres modifications.
Eugen Pechanec
-6

Bibliothèques requises pour les machines 64 bits:

Si vous exécutez une version 64 bits d'Ubuntu, vous devez installer des bibliothèques 32 bits avec la commande suivante:

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

Si vous exécutez Fedora 64 bits, la commande est:

sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686
Linh Nguyễn Thế
la source
Je ne vois pas comment l'installation de ces packages devrait résoudre le problème présent dans l'OP. Comment ce problème est-il lié à une méthode de compression dégonflée? Je n'ai même pas installé lib32z1 moi-même, et mon installation fonctionne après avoir appliqué ce stackoverflow.com/a/44304075/2412477 ; Je recommande à quiconque d'essayer cela avant d'installer des packages potentiellement inutiles.
Stephan Henningsen