Формат пакета приложений Android

Пакет Android App Bundle – это файл (с расширением .aab ), который вы загружаете в Google Play.

Пакеты приложений представляют собой подписанные двоичные файлы, которые организуют код и ресурсы вашего приложения в модули, как показано на рисунке 1. Код и ресурсы для каждого модуля организованы аналогично тому, что вы найдете в APK, и это имеет смысл, поскольку каждый из этих модулей может быть создаются как отдельные APK. Затем Google Play использует пакет приложений для создания различных APK-файлов, которые предоставляются пользователям, таких как базовый APK, APK-файлы функций, APK-файлы конфигурации и (для устройств, которые не поддерживают разделенные APK-файлы) мульти-APK. Каталоги, окрашенные в синий цвет, например, drawable/ , values/ и lib/ , представляют собой код и ресурсы, которые Google Play использует для создания APK-файлов конфигурации для каждого модуля.

Пакеты приложений организуют ваше приложение в каталоги, каждый из которых представляет модуль. В каждом каталоге модулей код и ресурсы организованы аналогично типичному APK.

Рис. 1. Содержимое пакета Android App Bundle с одним базовым модулем, двумя функциональными модулями и двумя пакетами ресурсов.

В следующем списке более подробно описаны некоторые файлы и каталоги пакета приложения:

  • base/, Feature1/ и Feature2/: каждый из этих каталогов верхнего уровня представляет отдельный модуль вашего приложения. Базовый модуль вашего приложения всегда содержится в base каталоге пакета приложения. Однако каталогу каждого функционального модуля присваивается имя, указанное атрибутом split в манифесте модуля. Чтобы узнать больше, прочитайте о манифесте функционального модуля .
  • assets_pack_1/ и assets_pack_2/: для больших, требовательных к графике приложений или игр вы можете объединить ресурсы в пакеты ресурсов. Пакеты ресурсов идеально подходят для игр из-за больших ограничений по размеру. Вы можете настроить способ и время загрузки каждого пакета ресурсов на устройство в соответствии с тремя режимами доставки: во время установки, быстрого отслеживания и по требованию. Все пакеты ресурсов размещаются и обслуживаются через Google Play. Дополнительную информацию о том, как добавить пакеты ресурсов в пакет приложений, см. в обзоре доставки ресурсов Play .
  • BUNDLE-METADATA/: этот каталог содержит файлы метаданных, содержащие информацию, полезную для инструментов или магазинов приложений. Такие файлы метаданных могут включать сопоставления ProGuard и полный список файлов DEX вашего приложения. Файлы в этом каталоге не входят в APK-файлы вашего приложения.
  • Файлы буфера протокола модуля ( *.pb ): эти файлы содержат метаданные, которые помогают описать содержимое каждого модуля приложения в магазинах приложений, таких как Google Play. Например, BundleConfig.pb предоставляет информацию о самом пакете, например, какая версия инструментов сборки использовалась для сборки пакета приложения, а native.pb и resources.pb описывают код и ресурсы в каждом модуле, что полезно, когда Google Play оптимизирует APK-файлы для различных конфигураций устройств.
  • манифест/: в отличие от APK, пакеты приложений хранят файл AndroidManifest.xml каждого модуля в этом отдельном каталоге.
  • dex/: в отличие от APK, пакеты приложений хранят файлы DEX для каждого модуля в этом отдельном каталоге.
  • res/, lib/ и assets/: эти каталоги идентичны папкам в обычном APK. Когда вы загружаете пакет приложений, Google Play проверяет эти каталоги и упаковывает только те файлы, которые соответствуют конфигурации целевого устройства, сохраняя при этом пути к файлам.
  • root/: в этом каталоге хранятся файлы, которые позже перемещаются в корень любого APK, включающего модуль, в котором находится этот каталог. Например, каталог base/root/ пакета приложения может включать ресурсы на основе Java, которые ваше приложение загружается с помощью Class.getResource() . Эти файлы позже перемещаются в корневой каталог базового APK-файла вашего приложения и каждого мульти-APK, созданного Google Play. Пути внутри этого каталога также сохраняются. То есть каталоги (и их подкаталоги) также перемещаются в корень APK.

Обзор разделенных APK-файлов

Фундаментальным компонентом обслуживания оптимизированных приложений является механизм разделения APK, доступный в Android 5.0 (уровень API 21) и более поздних версиях. Разделенные APK-файлы очень похожи на обычные APK-файлы — они включают в себя скомпилированный байт-код DEX, ресурсы и манифест Android. Однако платформа Android может обрабатывать несколько установленных разделенных APK как одно приложение. То есть вы можете установить несколько разделенных APK-файлов, которые имеют доступ к общему коду и ресурсам и отображаются на устройстве как одно установленное приложение.

Преимущество разделенных APK-файлов заключается в возможности разбить монолитный APK-файл, то есть APK-файл, включающий код и ресурсы для всех функций и конфигураций устройств, поддерживаемых вашим приложением, на более мелкие отдельные пакеты, которые при необходимости устанавливаются на устройство пользователя.

Например, один разделенный APK-файл может включать код и ресурсы для дополнительной функции, которая нужна лишь немногим вашим пользователям, в то время как другой разделенный APK-файл включает ресурсы только для определенного языка или плотности экрана. Каждый из этих разделенных APK-файлов загружается и устанавливается, когда пользователь запрашивает его или этого требует устройство.

Ниже описаны различные типы APK-файлов, которые можно установить вместе на устройство, чтобы обеспечить полноценную работу с приложением. В последующих разделах этой страницы вы узнаете, как настроить проект приложения для поддержки этих APK-файлов.

  • Базовый APK: этот APK содержит код и ресурсы, к которым могут получить доступ все другие разделенные APK, и обеспечивает базовую функциональность вашего приложения. Когда пользователь запрашивает загрузку вашего приложения, этот APK-файл загружается и устанавливается первым. Это связано с тем, что только манифест базового APK содержит полную декларацию служб вашего приложения, поставщиков контента, разрешений, требований к версии платформы и зависимостей от системных функций. Google Play создает базовый APK-файл для вашего приложения на основе модуля приложения (или базового) вашего проекта. Если вы хотите уменьшить первоначальный размер загрузки вашего приложения, важно помнить, что весь код и ресурсы, включенные в этот модуль, включены в базовый APK-файл вашего приложения.
  • APK-файлы конфигурации. Каждый из этих APK-файлов включает в себя собственные библиотеки и ресурсы для определенной плотности экрана, архитектуры ЦП или языка. Когда пользователь загружает ваше приложение, его устройство загружает и устанавливает только те APK-файлы конфигурации, которые предназначены для его устройства. Каждый APK конфигурации является зависимостью либо от базового APK, либо от APK функционального модуля. То есть они загружаются и устанавливаются вместе с APK, для которого они предоставляют код и ресурсы. В отличие от базового и функционального модулей, для APK-файлов конфигурации не создается отдельный модуль. Если вы используете стандартные методы для организации альтернативных ресурсов, специфичных для конфигурации , для вашей базовой и функциональных модулей, Google Play автоматически создает для вас APK-файлы конфигурации .
  • APK-файлы функциональных модулей: каждый из этих APK-файлов содержит код и ресурсы для функции вашего приложения, которую вы можете модульизировать с помощью функциональных модулей. Затем вы можете настроить способ и время загрузки этой функции на устройство. Например, с помощью основной библиотеки Play функции могут быть установлены по требованию после установки базового APK на устройство, чтобы предоставить пользователю дополнительные функции. Рассмотрим приложение чата, которое загружает и устанавливает возможность захвата и отправки фотографий только тогда, когда пользователь запрашивает использование этой функции. Поскольку функциональные модули могут быть недоступны во время установки, вам следует включить любой общий код и ресурсы в базовый APK. То есть ваш функциональный модуль должен предполагать, что код и ресурсы только базового APK доступны во время установки. Google Play создает APK-файлы функциональных модулей для вашего приложения на основе функциональных модулей вашего проекта.

Рассмотрим приложение с тремя функциональными модулями и поддержкой нескольких конфигураций устройств. На рисунке 1 ниже показано, как может выглядеть дерево зависимостей для различных APK-файлов приложения. Обратите внимание, что базовый APK образует главу дерева, а все остальные APK зависят от базового APK. (Если вам интересно, как модули этих APK представлены в пакете приложений Android, см. раздел Формат пакета приложений Android .)

Базовый APK находится во главе дерева, от него зависят APK функциональных модулей. APK-файлы конфигурации, которые включают в себя код и ресурсы, специфичные для конфигурации устройства, для базового APK и каждого функционального модуля APK, образуют конечные узлы дерева зависимостей.

Рисунок 1. Дерево зависимостей для приложения, обслуживаемого с помощью разделенных APK-файлов.

Имейте в виду, что вам не нужно создавать эти APK самостоятельно — Google Play сделает это за вас, используя единый подписанный пакет приложений, который вы создаете с помощью Android Studio. Чтобы узнать больше о формате пакета приложений и о том, как его создать, перейдите в раздел Сборка, развертывание и загрузка пакетов приложений Android .

Устройства под управлением Android 4.4 (уровень API 19) и ниже.

Поскольку устройства под управлением Android 4.4 (уровень API 19) и ниже не поддерживают загрузку и установку разделенных APK-файлов, вместо этого Google Play предоставляет этим устройствам один APK-файл, называемый мульти-APK , оптимизированный для конфигурации устройства. То есть мульти-APK представляют собой полнофункциональную работу вашего приложения, но не включают в себя ненужный код и ресурсы, например, для других плотностей экрана и архитектур ЦП.

Однако они включают ресурсы для всех языков, которые поддерживает ваше приложение. Это позволяет, например, пользователям изменять предпочтительный язык вашего приложения без необходимости загружать другой мульти-APK.

Мульти-APK не имеют возможности позже загружать функциональные модули по требованию. Чтобы включить функциональный модуль в этот APK, необходимо либо отключить функцию «По требованию» , либо включить Fusing при создании функционального модуля .

Имейте в виду, что с пакетами приложений вам не нужно создавать, подписывать, загружать APK-файлы и управлять ими для каждой конфигурации устройства, которую поддерживает ваше приложение. Вы по-прежнему создаете и загружаете только один пакет приложений для всего вашего приложения, а Google Play позаботится обо всем остальном за вас. Поэтому независимо от того, планируете ли вы поддерживать устройства под управлением Android 4.4 или более ранней версии, Google Play предоставляет гибкий механизм обслуживания как для вас, так и для ваших пользователей.

Изменения языка пользователя

При использовании пакетов приложений устройства загружают только тот код и ресурсы, которые им необходимы для запуска вашего приложения. Таким образом, что касается языковых ресурсов, устройство пользователя загружает только те языковые ресурсы вашего приложения, которые соответствуют одному или нескольким языкам, выбранным в данный момент в настройках устройства.

Когда пользователь переключает язык в настройках устройства, Google Play может потребоваться загрузить и установить несколько дополнительных разделенных APK-файлов, прежде чем приложение сможет отображаться на новом языке.

Google Play пытается загрузить дополнительные языки сразу после переключения. Если пользовательское устройство находится в автономном режиме, загрузка не удалась или ресурсы слишком велики, Google Play попытается выполнить загрузку еще раз в фоновом режиме, когда условия устройства станут более благоприятными. Если при работе на устройстве с Android 9.0 (уровень API 28) или ниже ваше приложение находится на переднем плане во время установки APK-файлов с новым языковым разделением, приложение закрывается.

Если вашему приложению требуется, чтобы все языки были доступны на устройстве в любое время, вы можете отключить разделение языков в конфигурации сборки .

Если вашему приложению требуется загрузка дополнительных языков независимо от языков пользователя, выбранных в настройках устройства (например, для реализации средства выбора языка в приложении), вы можете использовать библиотеку Play Core, чтобы загружать их по требованию .