AAPT2编译失败:Android 3.0 Canary 1上无效的dimen


88

我正在使用适用于Android的Instant Apps。问题是我总是遇到编译工具的问题。是否还有其他人有此问题,并且能够找到任何解决方法。

我的环境:

  • 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,它可用于测试构建...您可以通过在gradle.properties文件中设置android.enableAapt2 = false来实现。我认为这可能是不确定的工作室错误……
BruceWayne

其他解决方案是stackoverflow.com/a/33943562/5125608它对我有用。
anlijudavid

5
FYI最新的Canary版本5已发布,Google在下面确实提到他们仍然对该AAPT2遇到问题,如下所述,AAPT2。我们将继续稳定AAPT2,以实现增量资源处理。如果由于资源处理问题导致构建失败,请向我们发送错误报告。要暂时禁用AAPT,请在gradle.properties文件中设置android.enableAapt2 = false。Roboelectric当前与AAPT2不兼容
无限循环

Answers:


57

解决方法是将开发计算机切换到使用“。”的语言环境。作为小数点。

可以通过以下方式更改:

在此处输入图片说明


6
这对我有用。无需在系统范围内应用。但是仅重启Android Studio是不够的。您需要注销并再次登录(或重新启动系统)以使更改对gradle构建生效。
萨利姆(Salim)

14
有用!对于Linux,您应该执行以下操作:导出LC_NUMERIC =“ en_US.UTF-8”,然后在相同的提示下启动Android Studio
sposnjak,2016年

17
我在studio.sh的开头添加了导出LC_NUMERIC =“ en_US.UTF-8”,它可以正常工作。我当然不会为了解决一些错误而更改系统范围的语言环境。
rzehan '17

7
...没?仅仅因为一个应用程序中的一个错误而建议某人更改其系统范围的区域设置是疯狂的。这将影响日期的格式设置,例如在电子邮件客户端中,甚至在语言方面,以及几乎所有其他内容。
Stephan Henningsen

2
好吧,我在窗户上。有什么建议?
user2520215

106

以下是提到的四个不同的解决方案:A,B,C和D; A,B,C和D。选择适合您的一个:

A)通过Ubuntu .desktop启动器文件修复Android Studio

这是修复Android Studio常规方法的唯一Ubuntu替代方法(请参见下文)。请注意,您可能仍想实现有关修复shell的部分,甚至可能还原所有修改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. 现在开始棘手的部分。理想情况下,您应该能够从Dash查找,启动和创建Android Studio 3的短裤:

为了你的快乐

但就我个人而言,我几乎总是很难让Ubuntu检测到我的新文件或已更改的.desktop文件。一种解决方案是注销并再次登录。如果有人知道如何强制重新扫描,请告诉我!

B)修复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,您将再次准备就绪。其他解决方案不受此影响。

C)固定外壳;Gradle,Jenkins等

使用shell从外壳构建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

    注意,这是在Ubuntu上添加bash shell别名的方式。如果您使用的是其他操作系统,则应该附加〜/ .bashrc或〜/ .profile。

    然后启动一个新的shell,现在不用调用./gradlew使用新的别名gr

    gr clean assDebug

#2的明显缺点是必须手动将其应用于所有项目。我认为这样做的好处是,当安装新的gradlew时,它将自动被覆盖,就像studio.sh被替换一样,因此您可以测试错误是否已修复=)

D)一起禁用APPT2

我个人不会这样做,但是为了完整性起见我添加了它,因为它绝对是使appt2停止发出错误的一种方法。将此行添加到您的gradle.propertiesandroid.enableAapt2=false


10
这似乎比接受的答案更好的解决方法
lelloman

2
由于某种原因,这对我不起作用。我得到了Android Studio 3.0 Canary 3,设置了所有这些之后,合并问题仍然存在。我的语言环境是en_US.UTF-8
vladaman

1
我刚刚更新到金丝雀3,然后回到这里再次复制粘贴,它仍然对我
有用

1
@vladaman修复了明显的浮点错误,但是Android Studio 3.0 canary 3仍然比以前更严格,并且资源文件中的某些错误以前被接受会导致合并错误。请注意,截至今日,设计库预览窃听并在Android Studio将不建3.0金丝雀3
aberaud

1
@Stephan Henningsen不知道我可能做错了什么,尽管我实际上正在使用版本26.X中的SDK,工具和库。我已经通过在我的中设置android.enableAapt2(或类似设置)禁用aapt2来解决错误。无论如何,还是非常感谢您提供的有帮助的答案:)falsegradle.properties
Maxr1998年

33

我通过将以下行添加到gradle.properties文件中解决了此问题

android.enableAapt2=false

2
我认为这个答案值得解释。
ksugiarto

这个答案有所帮助,但不能解决问题,只是关闭了导致它的gradle模块,如果您需要aapt2,那么绝对要添加export LC_NUMERIC="en_US.UTF-8"到您的.bashrc中,这对我来说就像是魅​​力
lukassos

1
MAC OS用户呢?
HendraWD

我在Windows环境中进行开发,为此需要做哪些更改?
Mehbube Arman

android.enableAapt2 =假被弃用,将通过2018年年底被移除
XurajB


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是
Romuald DANSOU

那没有任何意义。如果您在需要时缺少存储库,那么您将无法进行资源合并。构建将因缺少依赖项而失败。如果您不需要存储库,则指定存储库不会改变任何事情。如果OP尚未在项目中包含google maven repo引用,则OP在构建过程中不会走得那么远。您的答案不能解决当前的问题。您也必须进行其他更改。
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中的问题。这个问题与放气压缩方法有什么关系?我什至没有自己安装lib32z1,并且在应用了stackoverflow.com/a/44304075/2412477之后,我的安装工作成功了;我建议任何人在安装潜在不必要的软件包之前尝试一下。
Stephan Henningsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.