Вопрос или проблема
Кажется, что с каждым релизом Android, загрузчик макетов становится медленнее. В многих случаях замедление скорости составляет 4x между Lollipop и Upside Down Cake. Решение, на которое указывают люди, — это программное создание представлений. Однако, если ViewBindings уже разбирает XML файл и генерирует код, есть ли техническая причина, по которой он не мог бы также генерировать само представление программно? Это кажется чем-то очевидным для ускорения почти всего кода, одновременно способствуя хорошему стилю и более корректным программам.
Например, если вы делаете ActivityMainBinding.inflate(getLayoutInflator())
, то, по крайней мере, насколько мне известно, он пройдет через стандартный процесс загрузки XML файлов, который происходит с inflater.inflate(R.id.activity_main)
, он просто также выполняет findViewById
за вас. Однако, поскольку он все равно генерирует код для этого, есть ли причина, по которой он не мог бы также генерировать код для загрузки из XML? По крайней мере, это обошло бы все вызовы файловой системы и разбор XML, что могло бы привести к огромным увеличениям скорости без каких-либо затрат.
В любом случае, я не знаю, есть ли техническая причина, по которой это не было сделано, или это просто не было на радаре у кого-либо? Или это доступно, и я просто не знаю об этом?
Ответ или решение
Технические причины отсутствия программногоInflater в ViewBindings
С каждым выходом новой версии Android наблюдается постепенное ухудшение производительности процесса инфляции макетов. Это явление стало заметным, начиная с версии Lollipop и заканчивая последними релизами, такими как Upside Down Cake, где замедление достигает потрясающих 4 раз. В этой связи, многие разработчики задумываются о том, почему библиотека ViewBindings, которая уже занимается парсингом XML и генерацией кода, не предлагает возможности программной инфляции.
Принцип работы ViewBindings
ViewBindings реализован на основе механизма генерации кода, который упрощает доступ к элементам интерфейса. При вызове метода ActivityMainBinding.inflate(getLayoutInflater())
, этот метод фактически вызывает стандартный процесс инфляции макета из XML, который включает в себя:
- Чтение XML-файла.
- Создание и инициализацию объектов View.
- Применение атрибутов и стилей.
В процессе этого выполняется множество операций, в том числе доступ к файловой системе и разбор XML, что и приводит к замедлению работы. Однако ViewBindings значительно упрощает код, автоматически создавая переменные для последующего обращения к элементам интерфейса, что мудро ведет к улучшению читаемости и уменьшению количества кода.
Технические соображения
Основная причина, почему ViewBindings не предоставляет программный inflater, заключается в:
-
Сложности с кодом: Генерация программного кода для создания View может быть более сложной и менее интуитивно понятной, чем работа с XML. XML предоставляет четкую и понятную структуру, что значительно упрощает задачу верстки интерфейса.
-
Совместимость с существующими библиотеками: Большинство библиотек и фреймворков для Android уже завязаны на использование XML для определения макетов. Переход на программное создание объектов может вызвать несовместимости или потребовать значительной переработки существующих решений.
-
Оптимизация и производительность: Несмотря на то, что частое чтение из файловой системы и парсинг XML могут быть медленными процессами, Android оказывает значительные усилия в оптимизации работы с XML макетами. Они могут использовать кэширование и прочие методы оптимизации, которые делают действия с XML достаточно быстрыми для большинства случаев.
-
Стандартизация подхода: Использование XML обеспечивает единообразие в разработке, упрощая работу дизайнеров и разработчиков, которые работают в одной команде. Визуальная структура, обеспечиваемая XML, позволяет разделить ответственность между членами команды и поддерживать единообразие в проекте.
Заключение
Хотя внедрение программного inflater внутри ViewBindings могло бы повысить скорость создания интерфейсов, это также влечет за собой множество сложностей, связанных с совместимостью, читаемостью и поддержкой стандартизированных подходов. Существует возможность, что в будущих версиях Android будут предложены новые оптимизации, позволяющие улучшить производительность инфляции без необходимости перехода на программное создание интерфейсов. На данный момент использование ViewBindings и XML остаётся оптимальным вариантом для достижения высокой производительности и поддерживаемых стандартов разработки.