Подтвердить что ты не робот

Почему gradle не переопределяет Java-классы в разных вариантах Android?

У меня есть приложение для Android с двумя вкусами: -flavor1 -flavor2

Мое дерево каталогов:

/src/main
/src/flavor1
/src/flavor2

main имеет установленный по умолчанию источник. flavor1 и flavor2 имеют свой собственный набор источников, который gradle получает автоматически. Если я добавлю файл ресурсов в каталог аромата, он переопределит его из основного и отлично работает.

Однако, если я добавлю класс java в flavor2, чтобы переопределить другой из "основного" (например, действие, которое должно быть разным в flavor2), оно не заменяет его, и в нем говорится о дублированном классе в мой проект. Я только получил это для работы, удалив класс из "основного" каталога и добавив его во все папки с ароматами.

Есть ли способ переопределить классы Java как файлы ресурсов? почему это происходит?

4b9b3361

Ответ 1

Есть ли способ переопределить классы Java как файлы ресурсов?

Нет. Xavier Ducrohet из группы инструментов Android обсудил здесь несколько здесь.

Есть способы выполнить то, что вы хотите, хотя более того, через секунду.

Почему это происходит?

Ваш код Java должен компилироваться. Предполагая, что вы ссылаетесь на класс Foo из других классов в исходном наборе main, класс Foo должен иметь один и тот же открытый API независимо от того, какой вкус компилируется. Если вы смогли полностью заменить основной Foo на специфичный для аромата Foo, это может быть недействительным. Это, конечно, не проблема, которую невозможно решить с помощью этих инструментов, но решение существующих инструментов сборки просто не позволяет вам это делать.

Конечно, с такими ресурсами, как изображения, это совершенно по-другому - пока существует некоторая версия ресурса, Android может использовать его просто отлично.

Тем не менее, вы можете создавать реалистичные реализации класса, используемые в вашем исходном наборе main. Самый простой способ - просто поместить только Foo в каждый вкус и не предоставить Foo в исходном наборе main. Для бонусных точек создайте интерфейс для этих реализаций в исходном наборе main, чтобы убедиться, что реализации, специфичные для аромата, соответствуют одному и тому же интерфейсу и не будут вызывать ошибки сборки.