Играйте за искусственный интеллект на устройстве (бета)

Введение

Play for On-device AI приносит преимущества Android App Bundles и доставки Google Play для пользовательского распределения моделей ML, чтобы вы могли улучшить производительность модели с меньшей сложностью экосистемы устройства без дополнительных затрат. Он позволяет вам публиковать в Play один артефакт, содержащий ваш код, активы и модели ML, и выбирать из ряда режимов доставки и вариантов таргетинга.

Преимущества

  • Загрузите один объект публикации в Google Play и делегируйте хостинг, доставку, обновления и таргетинг Play без дополнительных затрат.
  • Предоставляйте свои модели МО во время установки, в режиме ускоренной доставки или по запросу.
    • Доставка во время установки может гарантировать, что при открытии вашего приложения будет присутствовать очень большая модель. Ваша модель будет установлена ​​как APK.
    • Доставка Fast-follow происходит автоматически в фоновом режиме после установки вашего приложения. Пользователи могут открыть ваше приложение до того, как ваша модель будет полностью загружена. Ваша модель будет загружена во внутреннюю память вашего приложения.
    • Доставка по требованию позволяет вам запрашивать модель во время выполнения, что полезно, если модель требуется только для определенных пользовательских потоков. Ваша модель будет загружена во внутреннее хранилище вашего приложения.
  • Предоставляйте варианты ваших моделей машинного обучения, ориентированные на конкретные устройства на основе модели устройства, свойств системы или оперативной памяти.
  • Сохраняйте небольшие и оптимизированные обновления приложений с помощью функции автоматического исправления Play, которая означает, что загружать нужно только различия в файлах.

Соображения

  • Используя Play для искусственного интеллекта на устройстве, вы соглашаетесь с условиями Соглашения о распространении ПО через Google Play и Условиями обслуживания Play Core Software Development Kit .
  • Модели, загруженные Play для On-device AI, должны использоваться только вашими приложениями. Модели не должны предлагаться другим приложениям.
  • Отдельные пакеты AI могут быть размером до 1,5 ГБ, в зависимости от их сжатых размеров загрузки. Максимальный совокупный размер приложения любой версии вашего приложения, сгенерированной из вашего пакета приложений, составляет 4 ГБ.
  • Для приложений размером более 1 ГБ минимальный уровень SDK должен быть установлен на уровне 21 или выше.

Как использовать Play для искусственного интеллекта на устройстве

Play for On-device AI использует пакеты AI. Вы упаковываете пользовательские модели, готовые к распространению в пакеты AI в вашем пакете приложений. Вы можете выбрать, будет ли пакет AI доставлен во время установки, быстро или по запросу.

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

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

Пакеты AI содержат только модели. Java/Kotlin и собственные библиотеки не допускаются. Если вам нужно отправить библиотеки или код для запуска вашей модели ML, переместите их в базовый модуль или модуль функций . Вы можете настроить свой модуль функций так, чтобы он имел те же настройки загрузки и таргетинга, что и пакет AI.

Используйте LiteRT и MediaPipe с пакетами AI

Вы можете использовать LiteRT и MediaPipe с пакетами AI. Упакуйте свою модель в пакет AI, а затем получите к ней доступ, используя инструкции для пакетов, запускаемых во время установки , или для пакетов fast-follow и on-demand .

Дальнейшее чтение:

Начните работу с пакетами ИИ

Вот как можно начать использовать Play для искусственного интеллекта на устройстве:

  1. Упакуйте свои модели в пакеты AI в своем Android App Bundle и укажите, как должны доставляться пакеты AI.
  2. [Необязательно] Если вы хотите доставить разные модели на разные устройства, вы можете настроить таргетинг устройств для ваших пакетов AI. Например, вы можете доставить пакет AI A на определенную модель устройства, пакет AI B на устройства с объемом оперативной памяти не менее 6 ГБ, а все остальные устройства могут не получить ни одной модели.
  3. [Необязательно] Если вы используете доставку по запросу или ускоренную доставку, интегрируйте библиотеку Play AI Delivery Library в свое приложение, чтобы загружать пакеты AI по мере необходимости.
  4. Протестируйте и выпустите свой пакет приложений в Google Play.

Проверьте версию плагина Android Gradle

Чтобы использовать пакеты AI, убедитесь, что версия вашего Android Gradle Plugin (AGP) не ниже 8.8. Эта версия упакована с Android Studio Ladybug 2.

Извлеките свою модель в пакет AI

Для выполнения следующих шагов Android Studio не требуется.

  1. В каталоге верхнего уровня вашего проекта создайте каталог для пакета AI. Это имя каталога используется как имя пакета AI. Имена пакетов AI должны начинаться с буквы и могут содержать только буквы, цифры и подчеркивания.
  2. В каталоге AI pack создайте файл build.gradle и добавьте следующий код. Обязательно укажите имя AI pack и только один тип доставки:

    // In the AI pack's build.gradle file:
    plugins {
      id 'com.android.ai-pack'
    }
    
    aiPack {
        packName = "ai-pack-name" // Directory name for the AI pack
        dynamicDelivery {
            deliveryType = "[ install-time | fast-follow | on-demand ]"
        }
    }
    
  3. В файле проекта app build.gradle добавьте имя каждого пакета AI в вашем проекте, как показано ниже:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. В файле settings.gradle проекта включите все пакеты AI в свой проект, как показано ниже:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. Внутри вашего пакета AI создайте каталог src/main/assets/ .

  6. Поместите свои модели в каталог src/main/assets . Вы также можете создавать здесь подкаталоги. Структура каталогов для вашего приложения теперь должна выглядеть следующим образом:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. Добавьте код для загрузки и запуска ваших моделей. Как вы это сделаете, будет зависеть от режима доставки ваших пакетов AI. См. инструкции по времени установки и fast-follow/on-demand ниже.

  8. [Необязательно] Настройте таргетинг устройств для доставки разных моделей на разные устройства.

  9. Создайте Android App Bundle с помощью Gradle . В сгенерированном app bundle корневой каталог теперь включает следующее:

    • ai-pack-name/manifest/AndroidManifest.xml : настраивает идентификатор и режим доставки пакета AI
    • ai-pack-name/assets/your-model-directories : Каталог, содержащий все ресурсы, поставляемые как часть пакета AI

    Gradle генерирует манифест для каждого пакета AI и выводит для вас каталог assets/ .

Настройте доставку во время установки

Пакеты AI, настроенные как время установки, сразу доступны при запуске приложения. Используйте API Java AssetManager для доступа к пакетам AI, обслуживаемым в этом режиме:

import android.content.res.AssetManager;
...
Context context = createPackageContext("com.example.app", 0);
AssetManager assetManager = context.getAssets();
InputStream is = assetManager.open("model-name");

Настройте быструю доставку и доставку по требованию

Чтобы загрузить пакеты AI с быстрой доставкой или доставкой по запросу, используйте библиотеку Play AI Delivery.

Объявить зависимость от библиотеки Play AI Delivery Library

В файле build.gradle вашего приложения объявите зависимость от библиотеки Play AI Delivery Library:

dependencies {
  ...
  implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}

Проверить статус

Каждый пакет AI хранится в отдельной папке во внутреннем хранилище приложения. Используйте метод getPackLocation() для определения корневой папки пакета AI. Этот метод возвращает следующие значения:

Возвращаемое значение Статус
Действительный объект AiPackLocation Корневая папка пакета AI готова к немедленному доступу по адресу assetsPath()
null Неизвестный пакет AI или пакеты AI недоступны

Получить информацию о загрузке пакетов AI

Используйте
Метод getPackStates() позволяет определить размер загружаемого файла и то, загружается ли пакет.

Task<AiPackStates> getPackStates(List<String> packNames)

getPackStates() — асинхронный метод, который возвращает Task<AiPackStates> . Метод packStates() объекта AiPackStates возвращает Map<String, AiPackState> . Эта карта содержит состояние каждого запрошенного пакета AI, ключом которого является его имя:

Map<String, AiPackState> AiPackStates#packStates()

Окончательный запрос отображается следующим образом:

final String aiPackName = "myAiPackName";

aiPackManager
    .getPackStates(Collections.singletonList(aiPackName))
    .addOnCompleteListener(new OnCompleteListener<AiPackStates>() {
        @Override
        public void onComplete(Task<AiPackStates> task) {
            AiPackStates aiPackStates;
            try {
                aiPackStates = task.getResult();
                AiPackState aiPackState =
                    aiPackStates.packStates().get(aiPackName);
            } catch (RuntimeExecutionException e) {
                Log.d("MainActivity", e.getMessage());
                return;
            });

Следующие методы AiPackState предоставляют размер пакета AI, загруженный на данный момент объем (если запрошено) и объем, уже переданный в приложение:

Чтобы получить статус пакета AI, используйте метод status() , который возвращает статус как целое число, соответствующее константному полю в классе AiPackStatus . Пакет AI, который еще не установлен, имеет статус AiPackStatus.NOT_INSTALLED .

Если запрос не выполнен, используйте метод errorCode() , возвращаемое значение которого соответствует константному полю в классе AiPackErrorCode .

Установить

Используйте метод fetch() для первой загрузки пакета AI или вызовите обновление пакета AI для завершения:

Task<AiPackStates> fetch(List<String> packNames)

Этот метод возвращает объект AiPackStates , содержащий список пакетов и их начальные состояния загрузки и размеры. Если пакет AI, запрошенный через fetch() , уже загружается, возвращается статус загрузки, и дополнительная загрузка не начинается.

Мониторинг состояний загрузки

Вам следует реализовать AiPackStateUpdateListener для отслеживания процесса установки пакетов AI. Обновления статуса разбиты по пакетам для поддержки отслеживания статуса отдельных пакетов AI. Вы можете начать использовать доступные пакеты AI до того, как будут завершены все остальные загрузки по вашему запросу.

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
Большие загрузки

Если загрузка превышает 200 МБ и пользователь не подключен к Wi-Fi, загрузка не начнется, пока пользователь явно не даст свое согласие на продолжение загрузки с использованием мобильного подключения к данным. Аналогично, если загрузка большая и пользователь теряет Wi-Fi, загрузка приостанавливается, и для продолжения с использованием мобильного подключения к данным требуется явное согласие. Приостановленный пакет имеет состояние WAITING_FOR_WIFI . Чтобы запустить поток пользовательского интерфейса для запроса согласия пользователя, используйте метод showConfirmationDialog() .

Обратите внимание: если приложение не вызывает этот метод, загрузка приостанавливается и автоматически возобновляется только после того, как пользователь снова подключится к сети Wi-Fi.

Требуется подтверждение пользователя

Если пакет имеет статус REQUIRES_USER_CONFIRMATION , загрузка не будет продолжена, пока пользователь не примет диалог, показанный с помощью showConfirmationDialog() . Этот статус может возникнуть, когда приложение не распознается Play, например, если приложение было загружено из стороннего источника. Обратите внимание, что вызов showConfirmationDialog() в этом случае приведет к обновлению приложения. После обновления вам нужно будет снова запросить пакеты AI.

Ниже приведен пример реализации прослушивателя:

AiPackStateUpdateListener aiPackStateUpdateListener = new AiPackStateUpdateListener() {
    private final ActivityResultLauncher<IntentSenderRequest> activityResultLauncher =
      registerForActivityResult(
          new ActivityResultContracts.StartIntentSenderForResult(),
          new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
              if (result.getResultCode() == RESULT_OK) {
                Log.d(TAG, "Confirmation dialog has been accepted.");
              } else if (result.getResultCode() == RESULT_CANCELED) {
                Log.d(TAG, "Confirmation dialog has been denied by the user.");
              }
            }
          });

    @Override
    public void onStateUpdate(AiPackState aiPackState) {
      switch (aiPackState.status()) {
        case AiPackStatus.PENDING:
          Log.i(TAG, "Pending");
          break;

        case AiPackStatus.DOWNLOADING:
          long downloaded = aiPackState.bytesDownloaded();
          long totalSize = aiPackState.totalBytesToDownload();
          double percent = 100.0 * downloaded / totalSize;

          Log.i(TAG, "PercentDone=" + String.format("%.2f", percent));
          break;

        case AiPackStatus.TRANSFERRING:
          // 100% downloaded and assets are being transferred.
          // Notify user to wait until transfer is complete.
          break;

        case AiPackStatus.COMPLETED:
          // AI pack is ready to use. Run the model.
          break;

        case AiPackStatus.FAILED:
          // Request failed. Notify user.
          Log.e(TAG, aiPackState.errorCode());
          break;

        case AiPackStatus.CANCELED:
          // Request canceled. Notify user.
          break;

        case AiPackStatus.WAITING_FOR_WIFI:
        case AiPackStatus.REQUIRES_USER_CONFIRMATION:
          if (!confirmationDialogShown) {
            aiPackManager.showConfirmationDialog(activityResultLauncher);
            confirmationDialogShown = true;
          }
          break;

        case AiPackStatus.NOT_INSTALLED:
          // AI pack is not downloaded yet.
          break;
        case AiPackStatus.UNKNOWN:
          Log.wtf(TAG, "AI pack status unknown")
          break;
      }
    }
}

В качестве альтернативы вы можете использовать метод getPackStates() для получения статуса текущих загрузок. AiPackStates содержит ход загрузки, статус загрузки и любые коды ошибок сбоев.

Доступ к пакетам ИИ

Вы можете получить доступ к пакету AI с помощью вызовов файловой системы после того, как запрос на загрузку достигнет состояния COMPLETED . Используйте метод getPackLocation() , чтобы получить корневую папку пакета AI.

Пакеты AI хранятся в каталоге assets в корневом каталоге пакета AI. Вы можете получить путь к каталогу assets , используя удобный метод assetsPath() . Используйте следующий метод, чтобы получить путь к определенному активу:

private String getAbsoluteAiAssetPath(String aiPack, String relativeAiAssetPath) {
    AiPackLocation aiPackPath = aiPackManager.getPackLocation(aiPack);

    if (aiPackPath == null) {
        // AI pack is not ready
        return null;
    }

    String aiAssetsFolderPath = aiPackPath.assetsPath();
    // equivalent to: FilenameUtils.concat(aiPackPath.path(), "assets");
    String aiAssetPath = FilenameUtils.concat(aiAssetsFolderPath, relativeAiAssetPath);
    return aiAssetPath;
}

Настройте таргетинг на устройство

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

Другие методы API Play AI Delivery

Ниже приведены некоторые дополнительные методы API, которые вы можете использовать в своем приложении.

Отменить запрос

Используйте cancel() для отмены активного запроса пакета AI. Обратите внимание, что этот запрос является операцией с наилучшими усилиями.

Удалить пакет AI

Используйте removePack() для планирования удаления пакета AI.

Получить местоположение нескольких пакетов ИИ

Используйте getPackLocations() для массового запроса статуса нескольких пакетов AI, который возвращает карту пакетов AI и их местоположений. Карта, возвращаемая getPackLocations() содержит запись для каждого пакета, который в данный момент загружен и актуален.

Нацеливание на устройство

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

Вы можете настроить таргетинг на такие свойства устройства, как:

Обзор необходимых шагов

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

  1. Определите группы устройств в XML-файле.
  2. Укажите, какие части вашего пакета должны быть отправлены в те или иные группы устройств.
  3. [Необязательно] Проверьте свою конфигурацию локально.
  4. Загрузите свой пакет (содержащий XML-файл) в Google Play.

Проверьте версию плагина Android Gradle

Чтобы использовать таргетинг на устройства, убедитесь, что версия вашего Android Gradle Plugin (AGP) не ниже 8.10.0-alpha01. Он упакован с Android Studio Meerkat 2, который находится в canary .

Включите эту функцию в плагине Android Gradle

Выбор устройства должен быть явно включен в файле gradle.properties :

android.experimental.enableDeviceTargetingConfigApi=true

Создайте XML-файл конфигурации таргетинга устройства

Файл конфигурации таргетинга устройств — это XML-файл, в котором вы определяете свои пользовательские группы устройств. Например, вы можете определить группу устройств с именем qti_v79 , которая содержит все устройства с системой Qualcomm SM8750 на чипе:

<config:device-targeting-config
    xmlns:config="http://schemas.android.com/apk/config">

    <config:device-group name="qti_v79">
        <config:device-selector>
            <config:system-on-chip manufacturer="QTI" model="SM8750"/>
        </config:device-selector>
    </config:device-group>

</config:device-targeting-config>

Группа устройств состоит из максимум 5 селекторов устройств . Устройство включается в группу устройств, если оно удовлетворяет любому из ее селекторов устройств.

Селектор устройств может иметь одно или несколько свойств устройства . Устройство выбирается, если оно соответствует всем свойствам устройства селектора.

Если устройство соответствует нескольким группам, ему будет предоставлен контент для группы, которая определена первой в XML-файле. Порядок, в котором вы определяете группы в XML-файле, является вашим приоритетным порядком.

Если устройство не соответствует ни одной группе, оно получит группу "другие" по умолчанию. Эта группа генерируется автоматически и не должна определяться явно.

Доступные свойства устройства

  • device_ram : Требования к оперативной памяти устройства
    • min_bytes ( включительно) : минимально необходимый объем оперативной памяти (в байтах)
    • max_bytes ( не включительно) : максимальный требуемый объем оперативной памяти (в байтах)
  • included_device_ids : Модели устройств, которые будут включены в этот селектор (макс. 10000 device_id на группу) . Это свойство выполняется, если устройство соответствует любому device_id в списке.
    • build_brand : Производитель устройства
    • build_device : Код модели устройства
  • exclude_device_ids : Модели устройств, которые следует исключить в этом селекторе (макс. 10000 device_id на группу) . Это свойство выполняется, если устройство не соответствует ни одному device_id в списке.
    • build_brand : Производитель устройства
    • build_device : Код модели устройства
  • required_system_features : Функции, которые должны быть у устройства, чтобы быть включенными в этот селектор (макс. 100 функций на группу) . Устройство должно иметь все системные функции из этого списка, чтобы удовлетворять этому свойству.

    Справочник по системным функциям

    • имя : Системная функция
  • denied_system_features : Функции, которые устройство не должно включать в этот селектор (максимум 100 функций на группу) . Если устройство имеет какие-либо системные функции из этого списка, оно не удовлетворяет этому свойству.

    Справочник по системным функциям

    • имя : Системная функция
  • system-on-chip : Система на чипах, которая будет включена в этот селектор. Устройство должно иметь любой чип из этого списка, чтобы удовлетворять этому свойству.

Вот пример, показывающий все возможные свойства устройства:

<config:device-targeting-config
    xmlns:config="http://schemas.android.com/apk/config">

    <config:device-group name="myCustomGroup1">
      <config:device-selector ram-min-bytes="8000000000">
        <config:included-device-id brand="google" device="redfin"/>
        <config:included-device-id brand="google" device="sailfish"/>
        <config:included-device-id brand="good-brand"/>
        <config:excluded-device-id brand="google" device="caiman"/>
        <config:system-on-chip manufacturer="Sinclair" model="ZX80"/>
        <config:system-on-chip manufacturer="Commodore" model="C64"/>
      </config:device-selector>
      <config:device-selector ram-min-bytes="16000000000"/>
    </config:device-group>

    <config:device-group name="myCustomGroup2">
      <config:device-selector ram-min-bytes="4000000000" ram-max-bytes="8000000000">
        <config:required-system-feature name="android.hardware.bluetooth"/>
        <config:required-system-feature name="android.hardware.location"/>
        <config:forbidden-system-feature name="android.hardware.camera"/>
        <config:forbidden-system-feature name="mindcontrol.laser"/>
      </config:device-selector>
    </config:device-group>

</config:device-targeting-config>

Официальные коды производителя и модели устройства

Вы можете найти правильный формат кода производителя и модели устройства, используя Каталог устройств в Google Play Console, выполнив одно из следующих действий:

  • Проверка отдельных устройств с помощью каталога устройств и поиск кода производителя и модели в местах, как показано в примере ниже (для Google Pixel 4a производитель — «Google», а код модели — «sunfish»)'

    страница pixel 4a в каталоге устройств

    страница pixel 4a в каталоге устройств

  • Загрузка CSV-файла поддерживаемых устройств и использование кода производителя и модели для полей build_brand и build_device соответственно.

Включите файл конфигурации таргетинга вашего устройства в ваш пакет приложений

Добавьте следующее в файл build.gradle вашего основного модуля:

android {
  ...
  bundle {
    deviceTargetingConfig = file('device_targeting_config.xml')
    deviceGroup {
      enableSplit = true   // split bundle by #group
      defaultGroup = "other"  // group used for standalone APKs
    }
  }
  ...
}

device_targeting_config.xml — это путь к вашему файлу конфигурации относительно основного модуля. Это гарантирует, что ваш файл конфигурации упакован вместе с вашим пакетом приложений.

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

Используйте таргетинг на устройства для ваших пакетов ИИ

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

Разделите свои пакеты AI по группам устройств, взяв существующие каталоги пакетов AI, созданные на последнем шаге, и добавив постфикс в соответствующие папки (как описано ниже) с помощью #group_myCustomGroup1, #group_myCustomGroup2 и т. д. При использовании пакетов AI в вашем приложении вам не нужно будет указывать папки с помощью постфикса (другими словами, постфикс автоматически удаляется в процессе сборки).

После предыдущего шага это может выглядеть так:

...
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup1/
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup2/
...

В этом примере вы бы ссылались на ai-pack-name/assets/image-classifier/ без каких-либо постфиксов.

Устройства в myCustomGroup1 получат все активы в image-classifier#group_myCustomGroup1/ , тогда как устройства в myCustomGroup2 получат все активы в image-classifier#group_myCustomGroup2/ .

Устройства, которые не принадлежат ни к myCustomGroup1 , ни myCustomGroup2 , получат пустой пакет ai-pack-name .

Это связано с тем, что устройства, не соответствующие ни одной группе устройств, получат вариант вашего пакета AI по умолчанию. Это включает все, что не находится внутри каталога с суффиксом #group_suffix .

После загрузки пакета AI вы можете проверить, присутствует ли ваша модель, используя AssetManager для пакетов времени установки или AiPackManager для пакетов быстрого следования и пакетов по требованию. Примеры того, как это сделать, показаны для всех режимов доставки в образце приложения .

Используйте таргетинг на устройства для ваших функциональных модулей

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

Чтобы доставить модуль функций на устройства, принадлежащие либо myCustomGroup1 , либо myCustomGroup2 , измените его AndroidManifest.xml :

<manifest ...>
  ...
  <dist:module dist:title="...">
    <dist:delivery>
      <dist:install-time>
        <dist:conditions>
          <dist:device-groups>
            <dist:device-group dist:name="myCustomGroup1"/>
            <dist:device-group dist:name="myCustomGroup2"/>
          </dist:device-groups>
          ...
        </dist:conditions>
      </dist:install-time>
    </dist:delivery>
  </dist:module>
  ...
</manifest>

Тест локально

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

Внутренний общий доступ к приложениям

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

Ознакомьтесь с инструкциями по внутреннему совместному использованию приложений .

Bundletool

В качестве альтернативы вы можете сгенерировать APK с помощью bundletool (1.18.0 или выше) и загрузить их на свое устройство. Выполните следующие шаги, чтобы протестировать свое приложение локально с помощью bundletool:

  1. Создайте свой пакет приложений с помощью Android Studio или bundletool.

  2. Сгенерируйте APK с флагом --local-testing :

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. Подключите устройство и запустите bundletool для загрузки APK-файлов:

    # Example without Device Targeting Configuration
    java -jar bundletool.jar install-apks --apks=output.apks
    
    # Example with Device Targeting Configuration (you must specify which groups the connected device belongs to)
    java -jar bundletool.jar install-apks --apks=output.apks --device-groups=myCustomGroup1,myCustomGroup2
    

Ограничения локального тестирования с помощью bundletool

Ниже приведены ограничения локального тестирования с помощью bundletool:

  • Пакеты fast-follow ведут себя как пакеты on-demand . То есть они не будут автоматически извлекаться при загрузке приложения. Разработчикам необходимо запрашивать их вручную при запуске приложения; это не требует никаких изменений кода в вашем приложении.
  • Пакеты извлекаются из внешнего хранилища вместо Play, поэтому вы не можете проверить, как ваш код ведет себя в случае сетевых ошибок.
  • Локальное тестирование не охватывает сценарий ожидания Wi-Fi.
  • Обновления не поддерживаются. Перед установкой новой версии сборки вручную удалите предыдущую версию.

Убедитесь, что устанавливаются правильные APK-файлы.

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

adb shell pm path {packageName}

Вы должны увидеть что-то вроде:

package:{...}/base.apk
package:{...}/split_config.en.apk
package:{...}/split_config.xxhdpi.apk
package:{...}/split_main_ai-pack-name.apk
package:{...}/split_main_ai-pack-name.config.group_myCustomGroup1.apk

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

Тестирование и выпуск в Google Play

Мы рекомендуем вам полностью протестировать свое приложение в Google Play с помощью внутреннего тестового трека .

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

Пример приложения, использующего Play для искусственного интеллекта на устройстве

Обратитесь к своему менеджеру по работе с партнерами Google Play, чтобы получить доступ к нашему образцу приложения .

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

Узнайте больше о пакетах приложений Android и ознакомьтесь со справочной информацией по AI Delivery SDK .