Перенесите свое приложение с мгновенным запуском для поддержки пакетов приложений Android.

Если вы все еще используете устаревший плагин Feature Android Gradle ( com.android.feature ) для модулей Android Instant App, вам необходимо перейти на использование плагина базового приложения ( com.android.application ) и плагина Dynamic Feature ( com.android.dynamic-feature ).

В плагине Android Gradle 3.3.0 и более поздних версиях плагин базового приложения включает поддержку мгновенных возможностей. То есть, если базовый модуль приложения удовлетворяет требованиям мгновенного взаимодействия, вы получаете преимущество автоматически. Затем вы можете включить дополнительные функции, которые пользователи смогут загружать по требованию в качестве мгновенного взаимодействия с помощью плагина Dynamic Feature. Такая настройка упрощает поддержку как установленных, так и мгновенных приложений из одного проекта, а также позволяет получить преимущества от публикации с помощью наборов Android App Bundle .

Следующая таблица лучше описывает, на какие плагины вы перейдете:

Описание модуля Старый плагин Текущий плагин
Модуль, включающий базовый код, ресурсы и функции для вашего установленного или мгновенного приложения. com.android.featurebaseFeature = true ) com.android.application

Примечание. Этот модуль включает всю информацию о манифесте и подписи, необходимую для сборки и упаковки вашего приложения в виде пакета Android App Bundle или APK.

Дополнительные модульные функции, которые пользователи могут загрузить по требованию. com.android.feature com.android.dynamic-featuredist:instant="true" и dist:onDemand="false" в манифесте модуля)
Код и ресурс для функции, доступной только в установленной версии вашего приложения. com.android.application com.android.dynamic-featuredist:instant="false" и dist:onDemand="false" в манифесте модуля)

На этой странице показано, как перенести существующий проект приложения с мгновенным запуском для создания пакета Android App Bundle с поддержкой мгновенного запуска. В нем также описывается, как создать, протестировать и опубликовать пакет Android App Bundle с мгновенной поддержкой.

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

Понять изменения

Когда вы переносите свой проект на использование плагина Dynamic Feature, пакеты приложений Android предоставляют новый способ создания и публикации вашего приложения, который существенно упрощает распространение оптимизированных APK среди ваших пользователей.

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

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

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

Чтобы перенести существующий проект приложения с мгновенным запуском и использовать более оптимизированную модель распространения Android App Bundle, выполните действия, описанные в разделах ниже.

Преобразование базового функционального модуля в модуль приложения.

Сначала вам необходимо отредактировать файл build.gradle базового функционального модуля, прежде чем конвертировать его в основной модуль приложения, следующим образом:

  1. Удалите baseFeature true .
  2. Удалите все зависимости, которые используют конфигурации зависимостей feature или application .

    классный

    dependencies {
        ...
        // delete any lines that look like
        // feature project(":foo")
        // feature project(":bar")
        // application project(":app")
    }

    Котлин

    dependencies {
        ...
        // delete any lines that look like
        // feature(project(":foo"))
        // feature(project(":bar"))
        // application(project(":app"))
    }
  3. Переместите applicationId вместе с любыми другими конфигурациями сценария сборки, которые вы ожидаете увидеть в базовом модуле приложения, из текущего модуля com.android.application в модуль com.android.feature . Некоторые примеры показаны ниже. На этом этапе, в зависимости от вашей конкретной настройки build.gradle , возможно, будет проще скопировать и вставить блок android build.gradle из предыдущего модуля приложения в файл build.gradle нового модуля приложения. Однако при этом следует проявлять осторожность.

    классный

    android {
        ...
        defaultConfig {
            // You need to move the application ID from the app module
            // to your feature module.
            applicationId "com.example.myapp"
            ...
        }
        // Some additional build configurations you might want to
        // copy from your current ‘app’ module may include ProGuard
        // rules and code shrinking settings.
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile(
                  'proguard-android-optimize.txt'),
                  'proguard-rules.pro'
            }
        }
    }

    Котлин

    android {
        ...
        defaultConfig {
            // You need to move the application ID from the app module
            // to your feature module.
            applicationId = "com.example.myapp"
            ...
        }
        // Some additional build configurations you might want to
        // copy from your current ‘app’ module may include ProGuard
        // rules and code shrinking settings.
        buildTypes {
            getByName("release") {
                minifyEnabled = true
                proguardFiles(
                    getDefaultProguardFile("proguard-android-optimize.txt"),
                    "proguard-rules.pro"
                )
            }
        }
    }
  4. Отметьте функциональный модуль как мгновенно включенный, добавив в манифест соответствующие теги распространения пакета, как показано ниже.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="true" />
        ...
    </manifest>
    
  5. Преобразуйте функциональный модуль в модуль базового приложения, изменив тип его плагина на com.android.application :

    классный

    // Replace  "plugins { id 'com.android.feature' }"
    // with the following
    plugins {
      id 'com.android.application'
    }

    Котлин

    // Replace  "plugins { id("com.android.feature") }"
    // with the following
    plugins {
        id("com.android.application")
    }

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

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

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

Создание функционального модуля включает изменение типа плагина с com.android.application на com.android.dynamic-feature , а также несколько других изменений build.gradle , как показано ниже:

  1. Измените тип плагина с com.android.application на com.android.dynamic-feature .

    классный

    // Replace "plugins { id 'com.android.feature' }"
    // with the following:
    plugins {
      id 'com.android.dynamic-feature'
    }

    Котлин

    // Replace "plugins { id("com.android.application") }"
    // with the following:
    plugins {
        id("com.android.dynamic-feature")
    }
  2. Как описано в предыдущем разделе, убедитесь, что вы переместили конфигурации сборки, необходимые для подключаемого модуля com.android.application , в базовый модуль приложения, например правила applicationId или proguardFiles .

  3. Переименуйте модуль во что-то вроде «installed_feature» следующим образом:

    1. Откройте панель «Проект» , выбрав «Просмотр» > «Окна инструментов» > «Проект» в строке меню.
    2. Щелкните правой кнопкой мыши функциональный модуль и выберите «Рефакторинг» > «Переименовать» .
    3. В появившемся диалоговом окне выберите «Переименовать модуль» и нажмите «ОК» .
    4. Введите новое имя модуля и нажмите «ОК» .
  4. Как и в шаге 3, переименуйте новый модуль приложения, созданный в предыдущем разделе, во что-то вроде «приложение».

  5. Добавьте зависимость реализации от модуля «app» в файл build.gradle функционального модуля, как показано ниже.

    классный

    dependencies {
        ...
        // In the feature module, add an implementation dependency
        // on the base app module.
        implementation project(":app")
    }

    Котлин

    dependencies {
        ...
        // In the feature module, add an implementation dependency
        // on the base app module.
        implementation(project(":app"))
    }
  6. Добавьте эту функцию в файл build.gradle нового модуля приложения.

    классный

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures = [":installed_feature"]
    }

    Котлин

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures.addAll(listOf(":installed_feature"))
    }
  7. В манифесте функционального модуля отметьте функциональный модуль как устанавливаемый, добавив в манифест соответствующие теги распространения пакета.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="false" dist:onDemand="false"
                dist:title="@string/title_dynamic_feature">
            <dist:fusing dist:include="true" />
        </dist:module>
        ...
    </manifest>
    

Преобразование других функциональных модулей в функциональные модули с мгновенной поддержкой.

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

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

  1. Измените тип плагина в файле build.gradle на com.android.dynamic-feature , как показано ниже:

    классный

    // Replace 'com.android.feature' with 'com.android.dynamic-feature'
    plugins {
      id 'com.android.dynamic-feature'
    }

    Котлин

    // Replace "com.android.feature" with "com.android.dynamic-feature"
    plugins {
        id("com.android.dynamic-feature")
    }
  2. Отметьте каждый функциональный модуль как мгновенно включенный, добавив в манифест следующее.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="true" dist:onDemand="false"
                dist:title="@string/title_dynamic_feature">
            <dist:fusing dist:include="true" />
        </dist:module>
        ...
    </manifest>
    
  3. Добавьте функциональный модуль в файл build.gradle нового модуля приложения, в который вы добавили installed_feature в список функциональных модулей.

    классный

    android {
       ...
       dynamicFeatures = [":installed_feature", ":feature_1", ":feature_2"]
       // or whichever name exists for the instant enabled feature module
    }

    Котлин

    android {
       ...
       dynamicFeatures.addAll(listOf(":installed_feature", ":feature_1", ":feature_2"))
       // or whichever name exists for the instant enabled feature module
    }

Создавайте, тестируйте и публикуйте новые пакеты приложений с мгновенной поддержкой.

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

Чтобы начать создание и тестирование пакета приложений с мгновенной поддержкой, перейдите к разделу Создание пакета приложений .