Pull to refresh

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) Начинали работы в эту сторону, но как только нас удалили из маркета, решили отложить до лучших времен.

Sign up to leave a comment.

Information

Website
l.tbank.ru
Registered
Founded
Employees
over 10,000 employees
Location
Россия