Android mergeDebugResources失败

时间:2019-05-09 16:34:27

标签: java android android-studio gradle

不是重复的

我已经阅读了很多关于“相似”问题的不同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列中定义的值是“在values.xml中在~/.gradle中从第726行第5行到730行第25列中声明的值。看到相同的声明!

我尝试过:

  • 清理我的项目
  • 使缓存无效并重新启动
  • 删除我的3.4.0目录
  • 重新安装Android Studio
  • 将Gradle Android插件降级(从3.0.0降为3.4.0
  • 升级Gradle Android插件(从3.5.0-beta1attrs.xml

我在Mac OS X上使用(因此与Windows相关的所有问题均无关紧要)

我在使用64位构建工具的64位计算机上

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

1 个答案:

答案 0 :(得分:0)

我没有一个满意的答案,但是我确实有一个答案。 种类

对于enum值(仅enum值),由于某种原因,PlayerView的属性与我自己的属性发生冲突。也许是关于Android如何解析attribute.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周期和电池寿命

还是,这是我能想到的最好的。