Bundle-файлы и технология Android¶
Bundle (от англ. bundle — «связка», «пакет») — в разработке программного обеспечения для операционной системы Android — специальный формат упаковки данных, предназначенный для передачи произвольного набора значений между компонентами приложения (активностями, службами, приёмниками широковещательных сообщений), а также для сохранения состояния интерфейса при его повороте или временном уничтожении системой. В более широком смысле термин используется для обозначения пакетов ресурсов, расширений и дистрибутивов в различных экосистемах, включая формат Android App Bundle для публикации приложений в магазине Google Play.
¶История и происхождение
Технология Bundle появилась вместе с выходом первой версии Android (2008 год) и была заложена в фундамент платформы как часть базовой библиотеки android.os. Разработчики из компании Google, создавая фреймворк для работы с приложениями, столкнулись с необходимостью организовать безопасный и эффективный обмен данными между изолированными процессами и компонентами. Так как каждое Android-приложение работает в отдельной песочнице (sandbox) с собственными правами, прямого доступа к памяти друг друга у компонентов нет. Bundle стал стандартизированным механизмом сериализации данных, который позволяет упаковать значения в единый контейнер и передать его через системные вызовы (IPC, binder).
Ключевая идея Bundle восходит к более ранним концепциям хранения пар «ключ — значение» (key-value store) и структурам данных типа словарей. Однако в отличие от простых хеш-таблиц, Bundle имеет строгую типизацию и поддерживает специальные механизмы для работы в условиях ограниченной памяти мобильных устройств. В 2018 году компания Google представила расширение формата — Android App Bundle (AAB), который изменил способ распространения приложений, позволив генерировать оптимизированные APK-файлы под конкретное устройство.
¶Устройство и характеристики
¶Структура и типы данных
Технически Bundle является обёрткой над классом BaseBundle и хранит данные в виде отображения (map) строковых ключей на объекты. Внутри него используется массив для хранения значений и отдельный массив для ключей, что обеспечивает быстрый доступ. Для передачи данных Bundle использует механизм Parcel — высокопроизводительный протокол сериализации, оптимизированный для межпроцессного взаимодействия (IPC). Именно поэтому объекты, помещаемые в Bundle, должны быть примитивными типами, реализациями интерфейса Serializable или Parcelable.
Поддерживаемые типы данных включают: все примитивные типы Java (boolean, byte, char, double, float, int, long, short), строки (String), массивы примитивов, списки (ArrayList), а также объекты, реализующие интерфейсы Parcelable или Serializable. Размер Bundle ограничен системным лимитом на размер транзакции Binder — обычно около 1 мегабайта (лимит TransactionTooLargeException). Превышение этого порога вызывает крах приложения с исключением.
¶Ключевые методы
Основные методы для работы с Bundle: putString(), putInt(), putParcelable() и соответствующие им геттеры getString(), getInt(), getParcelable(). Для извлечения значений используется перегрузка с параметром defaultValue, которая возвращает значение по умолчанию, если ключ отсутствует. Для проверки наличия ключа применяется метод containsKey(). Создание Bundle обычно происходит через конструктор по умолчанию или через статический метод Bundle.EMPTY (пустой экземпляр, не содержащий данных).
¶Применение в Android
¶Передача данных между компонентами
Основное применение Bundle — передача параметров при запуске новых активностей через Intent. При вызове startActivity() или startActivityForResult() разработчик может прикрепить к Intent объект Bundle с аргументами, которые получит целевая активность в методе onCreate(). Аналогичным образом Bundle используется для передачи данных службам (Service) и широковещательным приёмникам (BroadcastReceiver). Этот механизм гарантирует, что данные будут корректно доставлены даже в том случае, если система убьёт процесс приложения в фоне, а затем восстановит его.
¶Сохранение состояния
Второе важное применение — сохранение состояния интерфейса. При повороте экрана Android уничтожает активность и создаёт её заново. Чтобы не потерять введённые пользователем данные или позицию прокрутки, используется пара методов onSaveInstanceState(Bundle outState) и onRestoreInstanceState(Bundle savedInstanceState). В первый метод разработчик сохраняет нужные значения, во втором — восстанавливает их. Система автоматически сохраняет состояние всех View-элементов, имеющих идентификатор, в том же Bundle, что позволяет восстановить интерфейс без дополнительного кода.
¶Android App Bundle (AAB)
¶Суть формата
Android App Bundle — это формат публикации приложений, введённый Google в 2018 году и ставший обязательным для новых приложений в Google Play с августа 2021 года. Вместо единого универсального APK-файла разработчик загружает в магазин AAB-файл, содержащий все ресурсы и скомпилированный код. Google Play затем генерирует из него оптимизированные APK-файлы (base APK, configuration APKs, dynamic feature APKs) для каждого конкретного устройства, включая только те ресурсы, которые нужны данному пользователю.
¶Преимущества и недостатки
Главное преимущество AAB — уменьшение размера загружаемого приложения в среднем на 15–20 % за счёт исключения неиспользуемых ресурсов (например, графики для экранов с другой плотностью пикселей или строк для неподдерживаемых языков). Формат также поддерживает модульные функции (Dynamic Delivery), позволяющие загружать отдельные части приложения по требованию. Недостатком является невозможность установки AAB-файла напрямую на устройство — для тестирования требуется специальный инструмент bundletool, который генерирует APK из AAB. Кроме того, формат жёстко привязывает разработчика к инфраструктуре Google Play.
¶Другие значения термина
В веб-разработке термин «bundle» используется для обозначения файла, объединяющего несколько модулей JavaScript (например, при использовании сборщиков Webpack или Rollup). В экосистеме Apple аналогичный механизм называется «framework» или «package». В экономике и маркетинге бандлом (пакетным предложением) называют набор товаров или услуг, продаваемых по единой цене. В игровой индустрии бандлы представляют собой наборы внутриигровых предметов. В операционной системе macOS термин «bundle» обозначает каталог с определённой структурой, содержащий исполняемый код и ресурсы приложения.
¶Критика и ограничения
Основные нарекания разработчиков к Bundle связаны с ограничением размера передаваемых данных. Попытка передать через Intent большой объём данных (например, растровое изображение в несколько мегабайт) приводит к исключению TransactionTooLargeException и аварийному завершению приложения. Для таких случаев рекомендуется использовать хранилища (базы данных, файлы) или статические ссылки. Также критике подвергается необходимость вручную поддерживать синхронизацию ключей между методами сохранения и восстановления состояния, что приводит к ошибкам при рефакторинге кода.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

