Comments 2
Спасибо за статью!
Я, возможно, неправильно понял, но вы получаеться ServiceLoader используете и для модуля который является приложением для прода.
У нас есть похожая система для инициализации на старте. Для её реализации рассматривали и ServiceLoader, но в итоге сделали через метаданные в AndroidManifest. Причиной тому была нестабильность работы ServiceLoader в Android. В этом Pull Request, в репозитории корутин, как раз уходят от ServiceLoader в пользу Class.forName. Там в комментариях к коду и Pull Request достаточно подробно расписано. Ну или вот, у меня похожая ситуация возникла в Ktorfit.
Как я понимаю, в идеальной ситуации плохая работа ClassLoader в Android должна компенсироваться R8. Он должен заменить ServiceLoader.load(X.class, X.class.getClassLoader()).iterator() на Arrays.asList(new X[] { new Y(), ..., new Z() }).iterator(). Но в тех же корутинах это почему-то не всегда работало, хотя код у них как раз подходящий:
ServiceLoader.load(
MainDispatcherFactory::class.java,
MainDispatcherFactory::class.java.classLoader
).iterator()
Мы у себя тоже используем ServiceLoader для демоприложений, но только для сущностей которые находятся в debug папке и на прод никогда не попадут.
Поэтому у меня возникли такие вопросы:
1) У вас не возникало проблем на проде из-за ServiceLoader?
2) Вы у себя в Gradle-таске получаете все META-INF файлы. Не думали достать из них все имена наследников BaseInitializer и просто сгенерировать класс в котором бы у каждого из наследников вызывается init()? Как-будто это позволит избежать потенциальных проблем с ServiceLoader и прокидывать что-то в конструктор наследников BaseInitializer.
3) Думали ли вы применять у себя Dynamic Feature? Для нас это была одна из причин не использовать ServiceLoader, так как для оптимизации R8 ему нужен доступ к классу, что не возможно при использовании Dynamic Feature.
1) Все верно, мы используем ServiceLoader для продакшн кода в том числе. Столкнулись с единственной проблемой, что оптимизация не применяется, если использовать котлиновский экстеншн foreach. В остальном, проблем не возникало, но я на всякий случай поглубже изучу вопрос, спасибо за предоставленные материалы.
2) Пока в этом нет необходимости, но мы думали про этот вариант.
3) Начинали работы в эту сторону, но как только нас удалили из маркета, решили отложить до лучших времен.
Демоприложения: как жить, когда у вас 90+ application-модулей