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

AAPT2 compile failed: invalid dimen on Android 3.0 Canary 1

我正在玩 Instant Apps,因为 Android.I 安装了所有正确的软件包并且厌倦了创建具有 Instant App 支持的新应用程序(在创建新应用程序时选中 Instant App 框)。问题是我总是运行 编译工具出问题了。是否有其他人遇到此问题并且能够找到任何解决方法。

我的环境:

错误:

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>

希望我为您提供了足够的信息来解决问题。谢谢。

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

可以通过以下方式更改:

添加

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

存储库对我有用

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

A) 通过 Ubuntu .desktop 启动器文件

修复 Android Studio

这是 Ubuntu-only 替代 Fixing 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):

  4. 创建一个 Android Studio 3 启动器文件,方法是将其复制并粘贴到 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. 使其可执行:

    chmod +x ~/.local/share/applications/android-studio-3.desktop
    
  6. 现在是棘手的部分。理想情况下,您应该能够从 Dash:

  7. 中为 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) 修复 shell; Gradle,詹金斯,所有这些

使用 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:

    cat <<EOF>>~/.bash_aliases
    
    # Fixing Android Studio 3 Canary bug 
    alias gr='LC_NUMERIC="en_US.UTF-8" ./gradlew'
    EOF
    

    注意这是 bash shell 别名是如何添加到 Ubuntu 上的;如果你在不同的 OS 上,也许你应该附加到 ~/.bashrc 或 ~/.profile 而不是。

    然后开始一个新的 shell 现在不用调用 ./gradlew 使用新的别名 gr:

    gr clean assDebug

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

D) 一起禁用 APPT2

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

64 位机器所需的库:

如果您运行是Ubuntu的64位版本,您需要使用以下命令安装一些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

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

android.enableAapt2=false

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

确保在使用 format="float"

时没有添加任何单位 (dp)

我遇到了同样的问题,因为我使用 Extract dimen resource 使用 Android Studio 自动生成维度,并且它添加了如下单位类型:

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

应该是:

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