Кинжал 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, что может вызвать различные проблемы. Вместо этого предоставьте фабричный или другой официальный способ создания вашего библиотечного класса из-за пределов библиотеки, чтобы не было причин, чтобы два запуска Кинжала могли мешать друг другу.

Другие вопросы по тегам