【问题标题】:Android mergeDebugResources failedAndroid mergeDebugResources 失败
【发布时间】:2019-05-09 16:34:27
【问题描述】:

不重复

我已经阅读了很多具有“类似”问题的不同 SO 帖子,但到目前为止,我的问题还没有解决:

似乎这一特定步骤(mergeDebugResources)可能会以数百种不同的方式严重失败,并且从不提供有用的错误消息。充其量它不会告诉您任何信息,最坏的情况是它会为您提供误导性信息,使您在尝试调试问题时误入歧途。

我在做什么

我正在围绕 ExoPlayer 编写一个小包装器。我的包装器公开了一个自定义视图,其属性直接传递给 ExoPlayer 的PlayerView。我的自定义视图的attrs.xml 文件如下所示:

<resources>
    <declare-styleable name="BFPlayer">
        <!-- PlayerView attributes -->
        <!-- I wish these were camelCase and not snake_case, but c'est la vie -->
        <attr name="use_artwork" format="boolean" />
        <attr name="default_artwork" format="reference" />
        <attr name="use_controller" format="boolean" />
        <attr name="hide_on_touch" format="boolean" />
        <attr name="auto_show" format="boolean" />
        <attr name="hide_during_ads" format="boolean" />
        <attr name="show_buffering" format="enum">
            <enum name="never" value="0" />
            <enum name="when_playing" value="1" />
            <enum name="always" value="2" />
        </attr>
        <attr name="resize_mode" format="enum">
            <enum name="fit" value="0" />
            <enum name="fixed_width" value="1" />
            <enum name="fixed_height" value="2" />
            <enum name="fill" value="3" />
            <enum name="zoom" value="4" />
        </attr>
        <attr name="surface_type" format="enum">
            <enum name="none" value="0" />
            <enum name="surface_view" value="1" />
            <enum name="texture_view" value="2" />
            <enum name="spherical_view" value="3" />
        </attr>
        <attr name="shutter_background_color" format="color" />
        <attr name="keep_content_on_player_reset" format="boolean" />
        <attr name="player_layout_id" format="reference" />
        <attr name="controller_layout_id" format="reference" />
        <!-- BFPlayer attributes -->
        <!-- snake_case to match ExoPlayer attributes -->
        <attr name="video_src" format="string" />
    </declare-styleable>
</resources>

发生了什么

我在尝试构建我的项目时遇到以下错误:

* What went wrong:
Execution failed for task ':app:mergeDebugResources'.
> 1 exception was raised by workers:
  com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource compilation failed
  /Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: duplicate value for resource 'attr/resize_mode' with config ''.

  /Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: resource previously defined here.

  /Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: duplicate value for resource 'attr/surface_type' with config ''.

  /Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: resource previously defined here.

  /Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/1694e02eca6cc0cfe670672c5973bd19/res/values/values.xml:32:5-36:373: AAPT: error: duplicate value for resource 'attr/show_buffering' with config ''.

  /Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/1694e02eca6cc0cfe670672c5973bd19/res/values/values.xml:32:5-36:373: AAPT: error: resource previously defined here.

  /Users/stevenbarnett/Source/BluePlayer/AndroidSDK/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml: error: file failed to compile.

请注意,它在 values.xml 从第 726 行第 5 行到第 730 行第 25 列的第 726 行第 5 列到第 730 行第 25 列“以前定义”中声明了 values.xml 中定义的值。它实际上看到了相同的声明!

我试过了:

  • 清理我的项目
  • 使缓存失效并重新启动
  • 删除我的~/.gradle 目录
  • 重新安装 Android Studio
  • 降级 Gradle Android 插件(从 3.4.03.0.0
  • 升级 Gradle Android 插件(从 3.4.03.5.0-beta1

我使用的是 Mac OS X(因此任何与 Windows 相关的问题都无关紧要)

我在 64 位机器上,使用 64 位构建工具

我之前已经成功构建了这个项目和许多其他项目。直到我尝试创建此 attrs.xml 文件后,问题才出现。只有enum 属性会引发错误。删除或重命名这些属性可以构建项目,但是这些是 ExoPlayer 的 PlayerView 所期望的名称,因此我无法更改它们

【问题讨论】:

    标签: java android android-studio gradle


    【解决方案1】:

    我没有满意的答案,但我现在有的答案。

    对于enum 值(并且只有enum 值),PlayerView 的属性与我自己的属性发生冲突——出于某种原因。也许是 Android 解析 attributes.xml 文件的一个怪癖?我通过更改名称解决了这个问题,然后使用 PlayerView 上的方法在实例化时设置这些值:

    attrs.xml

    <resources>
        <declare-styleable name="BFPlayer">
            <!-- PlayerView attributes -->
            <attr name="useArtwork" format="boolean" />
            <attr name="defaultArtwork" format="reference" />
            <attr name="useController" format="boolean" />
            <attr name="hideOnTouch" format="boolean" />
            <attr name="autoShow" format="boolean" />
            <attr name="hideDuringAds" format="boolean" />
            <attr name="showBuffering" format="enum">
                <enum name="never" value="0" />
                <enum name="when_playing" value="1" />
                <enum name="always" value="2" />
            </attr>
            <attr name="resizeMode" format="enum">
                <enum name="fit" value="0" />
                <enum name="fixed_width" value="1" />
                <enum name="fixed_height" value="2" />
                <enum name="fill" value="3" />
                <enum name="zoom" value="4" />
            </attr>
            <attr name="surfaceType" format="enum">
                <enum name="none" value="0" />
                <enum name="surface_view" value="1" />
                <enum name="texture_view" value="2" />
                <enum name="spherical_view" value="3" />
            </attr>
            <attr name="shutterBackgroundColor" format="color" />
            <attr name="keepContentOnPlayerReset" format="boolean" />
            <attr name="playerLayoutId" format="reference" />
            <attr name="controllerLayoutId" format="reference" />
            <!-- BFPlayer attributes -->
            <attr name="videoSrc" format="string" />
        </declare-styleable>
    </resources>
    

    BFPlayer.java

            this.setUseArtwork(attributes.getBoolean(R.styleable.BFPlayer_useArtwork, true));
            this.setDefaultArtwork(attributes.getDrawable(R.styleable.BFPlayer_defaultArtwork));
            this.setUseController(attributes.getBoolean(R.styleable.BFPlayer_useController, true));
            this.setControllerHideOnTouch(attributes.getBoolean(R.styleable.BFPlayer_hideOnTouch, true));
            this.setControllerAutoShow(attributes.getBoolean(R.styleable.BFPlayer_autoShow, true));
            this.setControllerHideDuringAds(attributes.getBoolean(R.styleable.BFPlayer_hideDuringAds, true));
            this.setShowBuffering(attributes.getBoolean(R.styleable.BFPlayer_showBuffering, true));
            this.setResizeMode(attributes.getInt(R.styleable.BFPlayer_resizeMode, AspectRatioFrameLayout.RESIZE_MODE_FIT));
            this.setShutterBackgroundColor(attributes.getColor(R.styleable.BFPlayer_shutterBackgroundColor, Color.BLACK));
            this.setKeepContentOnPlayerReset(attributes.getBoolean(R.styleable.BFPlayer_keepContentOnPlayerReset, false));
            this.setKeepScreenOn(attributes.getBoolean(R.styleable.BFPlayer_keepScreenOn, true));
    

    我对这个解决方案的问题有两个:

    1. 这复制了attrs.xmlBFPlayer.java 之间的属性列表,所以如果 ExoPlayer 在未来的版本中添加新属性,我必须记得更新 两个 文件而不是一个
    2. 一些属性缺少对应的方法。例如,没有setSurfaceType 方法。这意味着我实际上无法更改默认值。即使在处理纯音频内容时,默认也会创建一个视频渲染器,这意味着在播放纯音频内容时我会无缘无故地浪费 CPU 周期和电池寿命

    不过,这是我能想到的最好的了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多