AAPT2编译失败:在Android 3.0 Canary 1上维度无效

88
我正在尝试使用Android的Instant Apps。我已经安装了所有正确的软件包,并尝试创建支持Instant App的新应用程序(在创建新应用程序时勾选Instant App复选框)。问题是,我总是遇到编译工具的问题。有人遇到过这个问题并且找到了解决方法吗?
我的环境:
  • Android Studio 3.0 Canary 1
  • Compile SDK: 25
  • Build Tools: "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来实现。我认为这可能是一个Studio的bug,但不确定。 - BruceWayne
另一种解决方案是https://dev59.com/glwY5IYBdhLWcg3wLFOw#33943562。它对我有效。 - anlijudavid
5
最新的金丝雀版构建版本为5,Google在下面提到他们仍然存在以下AAPT2问题, AAPT2。我们正在继续稳定AAPT2,这使得资源处理逐步增量化。如果由于资源处理问题造成构建失败,请向我们发送错误报告。要暂时禁用AAPT,请在gradle.properties文件中设置android.enableAapt2=false。 Roboelectric目前与AAPT2不兼容 - Infinite Loops
7个回答

106

以下提到了四种不同的解决方案:A、B、C和D;选择一个适合你的:

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

这是Ubuntu操作系统的替代方法,用于修复Android Studio(请参见下文)。请注意,您可能仍然希望实施关于修复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. 通过将此内容复制并粘贴到 shell 中,创建一个 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创建快捷方式:

For your pleasure

但是个人而言,我几乎总是无法使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)修复 shell;Gradle、Jenkins等

在使用gradlew从shell构建也需要应用修复。这只影响shell而不是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来添加全局和永久性修复:

  4. cat <<EOF>>~/.bash_aliases
    
    # Fixing Android Studio 3 Canary bug https://dev59.com/9lcP5IYBdhLWcg3wkKvT#44304075
    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.properties中添加此行:android.enableAapt2=false


10
这种方法看起来比被接受的答案要好得多。 - lelloman
2
由于某些原因,这对我不起作用。我使用的是Android Studio 3.0 Canary 3版本,即使设置了所有内容,合并问题仍然存在。我的语言环境是en_US.UTF-8。 - vladaman
1
我刚刚更新到了Canary 3,回到这里再次复制粘贴,它仍然对我有效。 - lelloman
1
@vladaman 这个修复了明显的浮点数错误,但是Android Studio 3.0 canary 3仍然比以前更加严格,一些之前被接受的资源文件中的错误现在会导致合并错误。请注意,截至今天,设计库预览存在缺陷,在Android Studio 3.0 canary 3上无法构建。 - aberaud
1
@Stephan Henningsen,我不确定我可能做错了什么,但我实际上正在使用版本为26.X的SDK、工具和库。我已经通过在我的gradle.properties中将android.enableAapt2(或类似)设置为false来禁用aapt2来自行解决了错误。无论如何,非常感谢您提供的有用答案 :) - Maxr1998
显示剩余8条评论

57

解决方法是将您的开发计算机切换到使用 "." 作为小数点的区域设置。

更改方式如下:

输入图像描述


6
这对我起作用了。不需要应用于整个系统。但是仅重新启动Android Studio是不够的。你需要注销并重新登录(或重新启动系统),以使更改对gradle构建生效。 - Salim
14
没问题!针对 Linux 操作系统,您需要执行以下命令:export LC_NUMERIC="en_US.UTF-8",然后在同一个提示符中启动 Android Studio 即可。 - sposnjak
17
我在studio.sh的开头添加了"export LC_NUMERIC="en_US.UTF-8"",现在可以正常工作。我肯定不会因为要解决某个bug而改变整个系统的区域设置。 - rzehan
7
因为一个应用程序中存在的一个错误,建议某人更改其系统范围的语言环境是疯狂的。这将影响日期格式,例如在电子邮件客户端中,甚至影响语言以及几乎所有其他方面。 - Stephan Henningsen
2
我在使用Windows系统。有什么建议吗? - user2520215
显示剩余9条评论

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=false 正在被弃用,并将在2018年底之前被移除。 - XurajB

1
请确保在使用format="float"时,不要添加任何单位(dp)。
我遇到了同样的问题,因为我使用Android Studio自动生成dimens,使用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>

1
这个问题已经在最新的稳定版Android Studio中修复。将您的Android Studio升级到3.0版本应该能为您解决此问题(也无需禁用AAPT2)。

-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,但是在应用https://dev59.com/9lcP5IYBdhLWcg3wkKvT#44304075之后我的安装工作正常;我建议任何人在安装可能不必要的软件包之前尝试一下这个方法。 - Stephan Henningsen

-6

添加

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

对我来说,仓库运作正常


@EugenPechanec 是的。 - Romuald DANSOU
这没有任何意义。如果你需要仓库却缺失了它,那么你在合并资源时就不会有进展。构建将因缺少依赖而失败。如果你不需要仓库,指定它也不会改变任何事情。如果 OP 在项目中没有包含 Google Maven 仓库的引用,他们在构建过程中就无法到达这一步。你的答案没有提供解决问题的方法。你肯定还做了其他更改。 - Eugen Pechanec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接