Ошибка Android mergeDebugResources - PullRequest
0 голосов
/ 09 мая 2019

Не дубликат

Я прочитал много разных 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 от строки 726 столбца 5 до строки 730 столбца 25. Он буквально видит то же объявление!

Я пробовал:

  • Очистка моего проекта
  • Аннулирование кэшей и перезапуск
  • Удаление моего ~/.gradle каталога
  • Переустановка Android Studio
  • Понижение версии плагина Gradle Android (с 3.4.0 до 3.0.0)
  • Обновление плагина Gradle Android (с 3.4.0 до 3.5.0-beta1)

Я нахожусь на Mac OS X (поэтому любые проблемы, связанные с Windows, не имеют значения)

Я на 64-битной машине, использую 64-битные инструменты сборки

Iуспешно построили этот проект и многие другие ранее.Проблема не возникала, пока я не попытался создать этот файл attrs.xml.Только атрибуты enum выдают ошибку.Удаление или переименование этих атрибутов позволяет собирать проект, однако это имена, ожидаемые от ExoPlayer PlayerView, и поэтому я не могу их изменить

1 Ответ

0 голосов
/ 13 мая 2019

У меня нет ответа, которым я доволен, но у меня есть ответ вроде на данный момент.

Для значений 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.xml до BFPlayer.java, поэтому, если ExoPlayer добавит новый атрибут в будущем выпуске, мне придется запомнить, чтобы обновить two файлы вместо одного
  2. В некоторых атрибутах отсутствуют соответствующие методы. Например, нет метода setSurfaceType. Это означает, что я физически не могу изменить это значение по умолчанию. По умолчанию видео рендерер создается даже при работе с аудио-контентом, что означает, что при воспроизведении аудио-контента я буду тратить впустую циклы ЦП и время автономной работы без причины

Тем не менее, это лучшее, что я мог придумать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...