№
Классы - это полностью квалифицированные предметы. Даже если вы можете импортировать, например. все классы с именем Object из всех пакетов, среда выполнения должна знать, какой из них вы хотите использовать в любом задании. Для среды исполнения не существует никакого способа узнать, какой класс вы хотите без полного имени (это именно то, что предназначены для операторов импорта). И, если два класса имеют одинаковое имя canonical, то они являются одним и тем же классом.
Чтобы быть полным, в vanilla java вы можете фактически загрузить два класса с тем же именем в одну и ту же среду выполнения. Однако вы должны использовать другой загрузчик классов, указанный в разных jars
. Вы также можете искусно создавать классные пути таким образом, чтобы вы затеняли другие классы внутри одного и того же загрузчика классов (вы получите класс, который будет первым в пути к классам). Но система сборки Android не даст вам dex
нескольких классов с тем же самым каноническим именем. Вы получите DexException
, поскольку все, что использовалось, было сжато в тот же файл classes.dex
. Я не знаю, появилось ли это ограничение в мире мультидексов.
Чтобы сделать то, что вы хотите, вы можете просто использовать набор источников, специфичных для вкуса. Таким образом, у вас есть src/flavor1/java
, которые содержат одно определение класса, а затем src/flavor2/java
содержат другое определение того же класса. Если вы сделаете это, класс не может быть определен в основном наборе источников и должен быть определен в каждом источнике каждого источника, установленном независимо.
Обратите внимание, что ароматизаторы обычно определяют типы продуктов и flavor != variant
. Таким образом, вы хотите получить normal
и whitelabel
. В нормальном вкусе вы строите с нормальным фрагментом. В оттенке белого цвета вы строите с другим размахом. Это всего лишь два разных класса.
Кроме того, вы получаете простое вложение и интерфейсы зависимостей, которые вы можете выбрать, чтобы развязать философию сборки от вкусов и удобного представления о наборах источников в любом случае.
Как это поможет? – dcow
Потому что в противном случае приложение не обращает внимания на изменения вкуса продукта. Если я жестко закодирую путь импорта в основной код приложения, он просто будет продолжать использовать версию этого класса класса, а не код продукта – KairisCharm
Конечно, но как бы '* .fragments.MyFragment' что-нибудь устранить? – dcow