Кинжал 2.12 и выпуск Proguard
У меня ошибка после перехода с Dagger 2.5 на 2.12 при использовании proguard в моей сборке релиза.
DaggerGraph.java:662: ошибка: не удается найти символ ReportingService_MembersInjector.injectA(instance, provideDataLayerProvider.get());
У меня есть библиотека Android, которая компилируется и запутывается, и приложение для Android, которое включает эту библиотеку.
График создается с использованием компонентов из обоих модулей.
Есть намеки?
Спасибо
PS. С Dagger 2.5 работает без проблем. PPS. Отладочная сборка без Proguard также хорошо работает с Dagger 2.12
1 ответ
Спекулятивный ответ: Это может быть связано не столько с Proguard, сколько с некоторыми оптимизациями, сделанными специально в Dagger 2.12.
Поскольку вы запускаете Dagger в созданной вами библиотеке и затем используете эту библиотеку из другого приложения Dagger, Dagger получает два шанса на запуск: сначала для библиотеки, которая создает ваш ReportingService_MembersInjector, а затем секунду, которая предположительно потребляет тот же ReportingService. Между этими шагами Proguard может эффективно делать все, что он хочет с классами, которые вы не пометили -keep
и связанные выключатели. Я догадываюсь, что Кинжал должен был держать тебя injectA
с версии 2.5, но для оптимизации 2.12 вам больше не нужно сохранять этот метод, поэтому Proguard исключает его.
В вашем приложении Android, которое использует библиотеку, Dagger обнаруживает класс с именем ReportingService_MembersInjector, поэтому он не создает другую копию и ошибочно полагает, что содержит все методы, которые он сгенерирует.
Я думаю, корень проблемы в том, что ваша библиотека предоставляет @Inject
-аннотированный класс, который ваш внешний (app) граф Dagger, очевидно, потребляет напрямую, а затем вы также сохраняете классы Factory и MembersInjector, которые предоставляет Dagger, рядом с ним. Даже если бы вы были правильно -keep
в ваших сгенерированных классах MembersInjector, Provider и Factory могут возникнуть различия в версиях между внутренней обфусцированной библиотекой и внешней копией Dagger, что может вызвать различные проблемы. Вместо этого предоставьте фабричный или другой официальный способ создания вашего библиотечного класса из-за пределов библиотеки, чтобы не было причин, чтобы два запуска Кинжала могли мешать друг другу.