Причина D8 грустна
Когда вы запускаете Wire code gen, в вашем проекте создается несколько исходных файлов Java, от которых зависит весь остальной код, созданный с помощью Wire-кода. com.google.protobuf.DescriptorProto
является одним из таких файлов. Поэтому, когда вы зависите от двух модулей, которые используют Wire, у вас есть два модуля, каждый из которых содержит исходный файл Java с тем же именем и пакетом, и в итоге получаются дубликаты .class-файлов. Эти файлы .class являются частью пакетного вывода ваших библиотечных модулей (не транзитивная зависимость), поэтому никакое количество gradle exclude
не поможет (если вы не знаете некоторые махинации Gradle, которые я не знаю? ...).
Возможные решения
Настройте параметры упаковки в модуле библиотеки, включив в нее исходные коды java, чтобы вы все еще могли скомпилировать, но исключить файлы .class при упаковке aar. Я попробовал это, но не смог сделать так, чтобы параметры упаковки фактически исключали файлы .class. Я не был в восторге от подхода, даже если он сработал, поэтому я кинул его.
(не пробовал, может работать) Объедините исходные файлы com.google.protobuf
, которые Wire создает в вашу собственную отдельную библиотеку, чтобы они стали переходной зависимостью. Возможно, вы захотите написать задачу gradle, которая обрабатывает этот процесс после запуска Wire, чтобы не перемещать эти файлы каждый раз вручную. Включите одну копию указанной библиотеки в ваше приложение и используйте gradle exclude
, чтобы игнорировать переходные процессы.
В конечном итоге это выглядело как слишком большая временная синхронизация, и я решил использовать Protobuf Gradle Plugin