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

spo*_*jak 88 android aapt android-studio android-gradle-plugin android-instant-apps

我正在使用Instant Apps for Android.I安装了所有正确的软件包并厌倦了创建具有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
Run Code Online (Sandbox Code Playgroud)

该行包含(520):

<item format="float" name="abc_disabled_alpha_material_dark" type="dimen">0.30</item>
Run Code Online (Sandbox Code Playgroud)

希望我提供足够的信息来解决问题.谢谢.

Ste*_*sen 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个Android Studio 3图标,使您的启动器从默认图标中脱颖而出并保存到其中~/.local/share/icons/android-studio-3.png.或者你可以使用我在原始(~/opt/android-studio-3/bin/studio.png)上摩擦一块奶酪制作的那个:

    Android的工作室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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使其可执行:

    chmod +x ~/.local/share/applications/android-studio-3.desktop
    
    Run Code Online (Sandbox Code Playgroud)
  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"
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重启Android Studio

关于升级Android Studio或Gradle的说明

稍后升级Android Studio安装时,它会检测到您已修改studio.sh.您应该让安装程序替换该文件,然后再按上述方法再次执行修补程序.最后重新启动Android Studio,您将再次准备好.其他解决方案不受此影响.

C)固定外壳; Gradle,Jenkins,这一切

从shell构建使用gradlew也需要应用修复.这只会影响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"
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    注意这是在Ubuntu上添加bash shell别名的方法; 如果你在不同的操作系统上,也许应该附加到〜/ .bashrc或〜/ .profile.

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

    gr clean assDebug

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

D)一起禁用APPT2

我个人不会这样做,但我已经添加它完整性,因为它肯定是一种让appt2停止给出错误的方法.将此行添加到您的gradle.properties:android.enableAapt2=false

  • 这似乎是一个比接受的答案更好的解决方法 (10认同)
  • 出于某种原因,这对我不起作用.我得到了Android Studio 3.0 Canary 3,在设置了所有这些之后,合并问题仍然存在.我的语言环境是en_US.UTF-8 (2认同)

sat*_*rov 57

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

它可以通过以下方式更改:

在此输入图像描述

  • 我将导出LC_NUMERIC ="en_US.UTF-8"添加到我的studio.sh的开头,它运行正常.我当然不会改变我的系统范围的语言环境只是为了解决一些bug. (17认同)
  • 有用!对于linux,你应该这样做:export LC_NUMERIC ="en_US.UTF-8",然后在同一个提示符下启动Android Studio (14认同)
  • ...笏?仅仅因为一个应用程序中的一个错误而推荐某人更改其系统范围的语言环境就很疯狂.它将影响您的日期格式,例如电子邮件客户端,甚至语言,以及其他所有内容. (7认同)
  • 这对我有用.无需在系统范围内应用.但重启Android-Studio还不够.您需要注销并重新登录(或重新启动系统)以使更改处于活动状态以进行gradle构建. (6认同)
  • 好吧,我在窗户上.有什么建议? (2认同)

小智 33

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

android.enableAapt2=false
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案值得解释. (2认同)