В модели распространения приложений Google Play используются пакеты приложений Android (Android App Bundles) для генерации и распространения оптимизированных APK-файлов для конфигурации устройства каждого пользователя, поэтому пользователи загружают только тот код и ресурсы, которые им необходимы для запуска вашего приложения.
Функция Play Feature Delivery использует расширенные возможности пакетов приложений, позволяя предоставлять определенные функции вашего приложения в зависимости от условий или загружать их по запросу. Для этого сначала необходимо отделить эти функции от базового приложения на модули функций.
конфигурация сборки функционального модуля
При создании нового функционального модуля с помощью Android Studio, IDE применяет следующий плагин Gradle к файлу build.gradle этого модуля.
// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.
plugins {
id 'com.android.dynamic-feature'
}
Многие свойства, доступные стандартному плагину приложения, также доступны вашему функциональному модулю. В следующих разделах описаны свойства, которые следует и не следует включать в конфигурацию сборки вашего функционального модуля.
Что не следует включать в конфигурацию сборки функционального модуля
Поскольку каждый функциональный модуль зависит от базового модуля, он также наследует определенные конфигурации. Поэтому в файле build.gradle функционального модуля следует опустить следующее:
- Настройки подписи: Пакеты приложений подписываются с использованием настроек подписи, которые вы указываете в базовом модуле.
- Свойство
minifyEnabled: Вы можете включить сокращение кода для всего проекта приложения, используя только конфигурацию сборки базового модуля. Поэтому это свойство следует опустить для функциональных модулей. Однако вы можете указать дополнительные правила ProGuard для каждого функционального модуля. -
versionCodeиversionName: При сборке пакета приложения Gradle использует информацию о версии приложения, предоставляемую базовым модулем. Вам следует опустить эти свойства в файлеbuild.gradleвашего функционального модуля.
Установить связь с базовым модулем.
Когда Android Studio создает ваш модуль функций, она делает его видимым для базового модуля, добавляя свойство android.dynamicFeatures в файл build.gradle базового модуля, как показано ниже:
// In the base module’s build.gradle file.
android {
...
// Specifies feature modules that have a dependency on
// this base module.
dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}
Кроме того, Android Studio включает базовый модуль в качестве зависимости модуля функций, как показано ниже:
// In the feature module’s build.gradle file:
...
dependencies {
...
// Declares a dependency on the base module, ':app'.
implementation project(':app')
}
Укажите дополнительные правила ProGuard
Хотя сокращение кода для вашего проекта приложения может быть включено только в конфигурацию сборки базового модуля, вы можете задать пользовательские правила ProGuard для каждого функционального модуля, используя свойство proguardFiles , как показано ниже.
android.buildTypes {
release {
// You must use the following property to specify additional ProGuard
// rules for feature modules.
proguardFiles 'proguard-rules-dynamic-features.pro'
}
}
Обратите внимание, что эти правила ProGuard объединяются с правилами других модулей (включая базовый модуль) во время сборки. Таким образом, хотя каждый функциональный модуль может определять новый набор правил, эти правила применяются ко всем модулям в проекте приложения.
Разверните свое приложение
При разработке приложения с поддержкой функциональных модулей вы можете развернуть его на подключенном устройстве обычным способом, выбрав «Запуск» > «Запуск» в строке меню (или нажав кнопку «Запуск»).
(на панели инструментов).
Если ваш проект приложения включает один или несколько функциональных модулей, вы можете выбрать, какие функции следует включить при развертывании приложения, изменив существующую конфигурацию запуска/отладки следующим образом:
- Выберите в строке меню пункт «Выполнить» > «Изменить настройки» .
- В левой панели диалогового окна «Настройки запуска/отладки» выберите нужную конфигурацию вашего Android-приложения .
- В разделе «Динамические функции для развертывания» на вкладке «Общие» установите флажки рядом с каждым модулем функций, который вы хотите включить при развертывании приложения.
- Нажмите ОК .
По умолчанию Android Studio не использует пакеты приложений для развертывания вашего приложения. Вместо этого IDE собирает и устанавливает на ваше устройство APK-файлы, оптимизированные для скорости развертывания, а не для размера APK. Чтобы настроить Android Studio на сборку и развертывание APK-файлов и мгновенных интерактивных элементов из пакета приложения, измените конфигурацию запуска/отладки .
Используйте функциональные модули для индивидуальной доставки.
Уникальное преимущество функциональных модулей заключается в возможности настраивать способ и время загрузки различных функций вашего приложения на устройства под управлением Android 5.0 (уровень API 21) или выше. Например, чтобы уменьшить первоначальный размер загружаемого приложения, вы можете настроить загрузку определенных функций либо по мере необходимости, либо только на устройствах, поддерживающих определенные возможности, такие как возможность делать фотографии или поддержка функций дополненной реальности.
Хотя при загрузке приложения в виде пакета по умолчанию вы получаете оптимизированные для скачивания файлы, более продвинутые и настраиваемые варианты доставки функций требуют дополнительной конфигурации и модульной организации функций вашего приложения с помощью модулей функций . То есть модули функций предоставляют строительные блоки для создания модульных функций, каждую из которых можно настроить для загрузки по мере необходимости.
Рассмотрим приложение, позволяющее пользователям покупать и продавать товары на онлайн-торговой площадке. Разумно разделить каждую из следующих функций приложения на отдельные модули:
- Вход и создание учетной записи
- Просмотр торговой площадки
- Размещение товара на продажу
- Обработка платежей
В таблице ниже описаны различные варианты доставки, поддерживаемые функциональными модулями, и способы их использования для оптимизации первоначального размера загружаемого демонстрационного приложения из магазина приложений.
| Вариант доставки | Поведение | Пример использования | Начиная |
|---|---|---|---|
| Доставка в момент установки | Модули функций, которые не настраивают ни один из описанных выше параметров доставки, по умолчанию загружаются при установке приложения. Это важное поведение, поскольку оно позволяет постепенно внедрять расширенные параметры доставки. Например, вы можете извлечь выгоду из модульной структуры функций вашего приложения и включить доставку по запросу только после того, как полностью реализуете загрузку по запросу с помощью библиотеки Play Feature Delivery Library. Кроме того, ваше приложение может запросить удаление функций позже. Таким образом, если вам необходимы определенные функции при установке приложения, но они больше не нужны после этого, вы можете уменьшить размер установки, запросив удаление функции с устройства. | Если приложение содержит обучающие материалы, например, интерактивное руководство по покупке и продаже товаров на торговой площадке, вы можете включить эту функцию при установке приложения по умолчанию. Однако, чтобы уменьшить размер устанавливаемого приложения, оно может запросить удаление функции после того, как пользователь завершит обучение. | Создайте модульную структуру для своего приложения, используя функциональные модули, которые не предусматривают настройки дополнительных параметров доставки. Чтобы узнать, как уменьшить размер устанавливаемого приложения, удалив определенные функциональные модули, которые могут быть больше не нужны пользователю, ознакомьтесь с разделом «Управление установленными модулями» . |
| Доставка по запросу | Позволяет вашему приложению запрашивать и загружать необходимые функциональные модули. | Если только 20% пользователей приложения-маркетплейса размещают товары на продажу, хорошей стратегией для уменьшения первоначального размера загрузки для большинства пользователей является предоставление возможности делать фотографии, включая описание товара, и размещать товар на продажу в качестве загрузки по запросу. То есть, можно настроить модуль для функции продажи в приложении таким образом, чтобы он загружался только тогда, когда пользователь проявляет интерес к размещению товаров на маркетплейсе. Кроме того, если пользователь перестает продавать товары по истечении определенного периода времени, приложение может уменьшить размер установленной версии, запросив удаление этой функции. | Создайте функциональный модуль и настройте доставку по запросу . Затем ваше приложение сможет использовать библиотеку Play Feature Delivery для запроса загрузки модуля по требованию. |
| Условная доставка | Позволяет указать определенные требования к устройству пользователя, такие как аппаратные характеристики, языковые настройки и минимальный уровень API, чтобы определить, будет ли загружаться модульная функция при установке приложения. | Если приложение-маркетплейс имеет глобальный охват, вам может потребоваться поддержка способов оплаты, популярных только в определенных регионах или локациях. Чтобы уменьшить первоначальный размер загружаемого приложения, вы можете создать отдельные функциональные модули для обработки определенных типов способов оплаты и устанавливать их на устройство пользователя в зависимости от зарегистрированной локали. | Создайте функциональный модуль и настройте условную доставку . |
| Мгновенная доставка | Google Play Instant позволяет пользователям взаимодействовать с вашим приложением без необходимости его установки на устройство. Вместо этого они могут попробовать ваше приложение, нажав кнопку «Попробовать сейчас» в Google Play Store или перейдя по созданной вами ссылке. Такой способ предоставления контента упрощает повышение вовлеченности пользователей в ваше приложение. Благодаря функции мгновенной доставки вы можете использовать Google Play Instant, чтобы ваши пользователи могли мгновенно ознакомиться с определенными функциями вашего приложения без установки. | Рассмотрим игру, в которой первые несколько уровней представлены в виде легковесного модуля. Вы можете мгновенно активировать этот модуль, чтобы пользователи могли сразу же опробовать игру по ссылке или кнопке «Попробовать сейчас», без установки приложения. | Создайте функциональный модуль и настройте мгновенную доставку . Затем ваше приложение сможет использовать библиотеку Play Feature Delivery для запроса загрузки модуля по требованию. Помните, что модульная структура функций вашего приложения с использованием функциональных модулей — это только первый шаг. Для поддержки Google Play Instant размер загружаемого базового модуля вашего приложения и той или иной функции, доступной мгновенно, должен соответствовать строгим ограничениям по размеру. Чтобы узнать больше, прочитайте статью «Включение мгновенного доступа путем уменьшения размера приложения или игры» . |
Создание URI для ресурса
Если вы хотите получить доступ к ресурсу, хранящемуся в модуле функций, используя URI, вот как сгенерировать URI ресурса модуля функций с помощью Uri.Builder() :
Котлин
val uri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded .appendPath(resources.getResourceTypeName(resId)) .appendPath(String.format("%s:%s", resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace. resources.getResourceEntryName(resId) )) .build()
Java
String uri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded .appendPath(resources.getResourceTypeName(resId)) .appendPath(String.format("%s:%s", resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace. resources.getResourceEntryName(resId) )) .build().toString();
Каждая часть пути к ресурсу формируется во время выполнения, что гарантирует генерацию правильного пространства имен после загрузки разделенных APK-файлов.
В качестве примера генерации URI предположим, что у вас есть приложение и функциональные модули со следующими именами:
- Название пакета приложения:
com.example.my_app_package - Название пакета ресурсов функции:
com.example.my_app_package.my_dynamic_feature
Если resId в приведенном выше фрагменте кода относится к ресурсу необработанного файла с именем «my_video» в вашем модуле функций, то код Uri.Builder() выведет следующее:
android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video
Затем этот URI может быть использован вашим приложением для доступа к ресурсу функционального модуля.
Для проверки путей в вашем URI вы можете использовать анализатор APK , чтобы изучить APK-файл вашего функционального модуля и определить имя пакета:

Вопросы, которые следует учитывать при разработке функциональных модулей.
С помощью функциональных модулей вы можете повысить скорость сборки и разработки, а также значительно настроить доставку функций вашего приложения, чтобы уменьшить его размер. Однако при использовании функциональных модулей следует учитывать некоторые ограничения и особые случаи:
- Установка 50 и более функциональных модулей на одно устройство с помощью условной или по запросу доставки может привести к проблемам с производительностью. Модули, устанавливаемые во время установки и не настроенные как удаляемые, автоматически включаются в базовый модуль и учитываются только как один функциональный модуль на каждом устройстве.
- Ограничьте количество модулей, которые вы настраиваете как удаляемые для установки, до 10 или менее. В противном случае время загрузки и установки вашего приложения может увеличиться.
- Загрузка и установка функций по запросу поддерживаются только устройствами под управлением Android 5.0 (уровень API 21) и выше. Чтобы сделать вашу функцию доступной для более ранних версий Android, включите функцию Fusing при создании модуля функций.
- Включите SplitCompat , чтобы ваше приложение имело доступ к загруженным функциональным модулям, которые предоставляются по запросу.
- Модули функций не должны указывать активности в своем манифесте с
android:exportedустановленным в значениеtrue. Это связано с тем, что нет гарантии, что устройство загрузило модуль функции, когда другое приложение пытается запустить активность. Кроме того, ваше приложение должно убедиться, что функция загружена, прежде чем пытаться получить доступ к ее коду и ресурсам. Для получения дополнительной информации см. раздел «Управление установленными модулями» . - Поскольку для работы функции Play Feature Delivery требуется публиковать приложение с помощью пакета приложений, убедитесь, что вы осведомлены об известных проблемах, связанных с пакетами приложений.
Справочник по манифесту функционального модуля
При создании нового модуля функций с помощью Android Studio, IDE включает большинство атрибутов манифеста, необходимых модулю для корректной работы. Кроме того, некоторые атрибуты внедряются системой сборки во время компиляции, поэтому вам не нужно указывать или изменять их самостоятельно. В следующей таблице описаны атрибуты манифеста, важные для модулей функций.
| Атрибут | Описание |
|---|---|
| <манифест | Это типичный блок <manifest> . |
| xmlns:dist="http://schemas.android.com/apk/distribution" | Указывает новое пространство имен dist: XML, описание которого приведено ниже. |
| split=" split_name " | Когда Android Studio собирает ваш пакет приложения, она автоматически добавляет этот атрибут. Поэтому вам не следует добавлять или изменять этот атрибут самостоятельно . Определяет имя модуля, которое ваше приложение указывает при запросе модуля по запросу с помощью библиотеки Play Feature Delivery Library. Как Gradle определяет значение этого атрибута: По умолчанию при создании функционального модуля с помощью Android Studio, IDE использует указанное вами имя модуля для идентификации модуля как подпроекта Gradle в файле настроек Gradle . При сборке пакета приложения Gradle использует последний элемент пути к подпроекту для внедрения этого атрибута манифеста в манифест модуля. Например, если вы создадите новый модуль функций в каталоге |
| android:isFeatureSplit="true | false"> | Когда Android Studio собирает ваш пакет приложения, она автоматически добавляет этот атрибут. Поэтому вам не следует добавлять или изменять этот атрибут вручную . Указывает, что данный модуль является функциональным модулем. В манифестах базового модуля и конфигурационных APK-файлах этот атрибут либо отсутствует, либо установлено значение |
| <dist:module | Определяет атрибуты, которые определяют способ упаковки и распространения модуля в виде APK-файлов. |
| dist:instant="true | false" | Указывает, должен ли модуль быть доступен через Google Play Instant в режиме мгновенного запуска. Если ваше приложение включает один или несколько модулей с мгновенным включением функций, вам также необходимо мгновенно включить базовый модуль. В Android Studio 3.5 и выше IDE делает это автоматически при создании модуля с мгновенным включением функций . Нельзя установить для этого XML-элемента значение |
| dist:title="@string/feature_name"> | Указывает заголовок модуля, отображаемый пользователю. Например, устройство может отображать этот заголовок при запросе подтверждения загрузки. Необходимо добавить строковый ресурс для этого заголовка в файл |
| <dist:fusing dist:include="true | false" /> | Указывает, следует ли включать модуль в мульти-APK-файлы, предназначенные для устройств под управлением Android 4.4 (уровень API 20) и ниже. Кроме того, при использовании |
| <dist:delivery> | Включает в себя параметры, позволяющие настраивать доставку модуля, как показано ниже. Имейте в виду, что каждый функциональный модуль должен настраивать только один тип этих пользовательских параметров доставки. |
| <dist:install-time> | Указывает, что модуль должен быть доступен во время установки. Это поведение по умолчанию для функциональных модулей, которые не указывают другой тип пользовательской доставки. Чтобы узнать больше о загрузках во время установки, прочтите раздел «Настройка доставки во время установки» . Этот узел также может задавать условия, ограничивающие доступ к модулю для устройств, отвечающих определенным требованиям, таким как характеристики устройства, страна пользователя или минимальный уровень API. Для получения дополнительной информации см. раздел «Настройка условной доставки» . |
| <dist:removable dist:value="true | false" /> | Если параметр не задан или установлен на Если По умолчанию установлено значение Примечание: Эта функция доступна только при использовании плагина Android Gradle версии 4.2 или при использовании bundletool v1.0 из командной строки. |
| </dist:install-time> | |
| <dist:on-demand /> | Указывает, что модуль должен быть доступен для загрузки по запросу. То есть модуль недоступен во время установки, но ваше приложение может запросить его загрузку позже. Чтобы узнать больше о загрузке по запросу, прочтите раздел «Настройка доставки по запросу» . |
| </dist:delivery> | |
| </dist:module> | |
| <приложение android:hasCode ="true | false"> ... </application> | Если модуль разработки не генерирует DEX-файлы, то есть не содержит кода, который впоследствии компилируется в формат DEX-файла, необходимо выполнить следующие действия (в противном случае могут возникнуть ошибки во время выполнения):
|
| ... </manifest> |
Дополнительные ресурсы
Чтобы узнать больше об использовании функциональных модулей, воспользуйтесь следующими ресурсами.
Сообщения в блоге
- Новые функции, которые помогут вам разрабатывать, выпускать и развивать свой бизнес в Google Play.
- Последние обновления Android App Bundle, включая API для добавления новых языков.
- Лоскутная клетка — история модульного строительства.
Видео
- Настраиваемая доставка с помощью пакета приложений и простой обмен тестовыми сборками.
- Новые инструменты для оптимизации размера вашего приложения и увеличения количества установок в Google Play.
Условия предоставления услуг и безопасность данных
Получая доступ к библиотеке Play Feature Delivery Library или используя её, вы соглашаетесь с Условиями использования комплекта разработки программного обеспечения Play Core Software Development Kit . Пожалуйста, ознакомьтесь и поймите все применимые условия и правила, прежде чем получать доступ к библиотеке.
Безопасность данных
Библиотеки Play Core — это интерфейс среды выполнения вашего приложения с Google Play Store. Таким образом, при использовании Play Core в вашем приложении Play Store запускает собственные процессы, которые включают обработку данных в соответствии с Условиями использования Google Play . Приведенная ниже информация описывает, как библиотеки Play Core обрабатывают данные для выполнения конкретных запросов от вашего приложения.
API для дополнительных языков
| Собранные данные об использовании | Список установленных языков |
| Цель сбора данных | Собранные данные используются для предоставления различных языковых версий приложения и для сохранения установленных языков после обновления приложения. |
| Шифрование данных | Данные зашифрованы. |
| Обмен данными | Данные не передаются третьим лицам. |
| Удаление данных | Данные удаляются по истечении установленного срока хранения. |
Доставка игровых функций
| Собранные данные об использовании | метаданные устройства Версия приложения |
| Цель сбора данных | Собранные данные используются для предоставления устройству нужного модуля, а также для сохранения установленных модулей после обновления, резервного копирования и восстановления. |
| Шифрование данных | Данные зашифрованы. |
| Обмен данными | Данные не передаются третьим лицам. |
| Удаление данных | Данные удаляются по истечении установленного срока хранения. |
Хотя мы стремимся к максимальной прозрачности, вы несете полную ответственность за принятие решения о том, как ответить на форму в разделе безопасности данных Google Play, касающуюся сбора, обмена и защиты пользовательских данных вашего приложения.