ИИ на устройстве от Google Play (бета)

Введение

Play для ИИ на устройстве позволяет использовать преимущества наборов Android App Bundle и доставки Google Play для распространения пользовательских моделей ML. Это позволяет повысить производительность моделей и упростить экосистему устройств без дополнительных затрат. Вы можете опубликовать в Google Play один объект, содержащий код, ресурсы и модели машинного обучения, а также выбрать один из нескольких режимов доставки и вариантов таргетинга.

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

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

Что нужно учесть

Как использовать ИИ на устройстве от Google Play

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

Добавив пакеты ИИ в набор App Bundle, вы сможете использовать все существующие инструменты тестирования и выпуска Google Play, такие как тестовые версии и поэтапное внедрение, чтобы управлять распространением приложения с собственными моделями.

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

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

Как использовать LiteRT и MediaPipe с пакетами ИИ

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

Дополнительные сведения

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

Вот как начать использовать ИИ на устройстве через Google Play:

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

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

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

Как извлечь модель в пакет ИИ

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

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

    // 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. В файле build.gradle приложения добавьте название каждого набора ИИ в проекте, как показано ниже:

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

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. Внутри пакета ИИ создайте каталог 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. Добавьте код для загрузки и запуска моделей. Способ, которым вы это сделаете, будет зависеть от режима доставки ваших пакетов ИИ. Инструкции для установки и быстрого обновления/скачивания по запросу приведены ниже.

  8. При необходимости настройте таргетинг на устройства, чтобы доставлять разные модели на разные устройства.

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

    • ai-pack-name/manifest/AndroidManifest.xml: настраивает идентификатор и режим доставки пакета ИИ.
    • ai-pack-name/assets/your-model-directories – каталог, содержащий все объекты, которые поставляются в составе пакета ИИ.

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

Как настроить доставку при установке

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

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

Как настроить быструю доставку и доставку по запросу

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

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

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

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

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

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

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

Как получить информацию о скачивании пакетов ИИ

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

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

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

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 позволяют узнать размер пакета ИИ, объем скачанных данных (если запрашивается) и объем данных, уже переданных в приложение:

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

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

Установить

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

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

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

Как отслеживать статусы скачивания

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

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
Большие скачиваемые файлы

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

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

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

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

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

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 содержит информацию о ходе скачивания, его статусе и кодах ошибок.

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

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

Пакеты ИИ хранятся в каталоге assets внутри корневого каталога пакетов ИИ. Путь к каталогу 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;
}

Как настроить таргетинг на устройства

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

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

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

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

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

Как удалить пакет ИИ

Чтобы запланировать удаление пакета ИИ, используйте removePack().

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

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

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

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

Вы можете настроить таргетинг на следующие свойства устройств:

Обзор необходимых действий

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

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

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

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

Как включить эту функцию в плагине 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>

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

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

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

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

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

  • device_ram – требования к ОЗУ устройства.
    • min_bytes (включительно) – минимальный объем ОЗУ в байтах.
    • max_bytes (исключающий) – максимальный требуемый объем ОЗУ (в байтах).
  • included_device_ids – модели устройств, которые нужно включить в этот селектор (не более 10 000 идентификаторов устройств на группу). Это свойство выполняется, если устройство соответствует любому идентификатору device_id в списке.
    • build_brand – производитель устройства.
    • build_device – код модели устройства.
  • excluded_device_ids – модели устройств, которые нужно исключить из этого селектора (не более 10 000 идентификаторов устройств на группу). Это свойство выполняется, если устройство не соответствует ни одному идентификатору device_id в списке.
    • build_brand – производитель устройства.
    • build_device – код модели устройства.
  • required_system_features – функции, которые должны быть на устройстве, чтобы оно было включено в селектор (не более 100 функций на группу). Чтобы устройство соответствовало этому свойству, на нем должны быть все системные функции из этого списка.

    Справочник по функциям

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

    Справочник по функциям

    • name – системная функция.
  • 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-файл со списком поддерживаемых устройств и укажите значения из столбцов Manufacturer и Model Code в полях build_brand и build_device соответственно.

Добавьте файл конфигурации таргетинга на устройства в набор App Bundle

Добавьте в файл 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 – путь к файлу конфигурации относительно основного модуля. Это гарантирует, что файл конфигурации будет упакован вместе с набором App Bundle.

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

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

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

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

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

...
.../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.

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

Скачав пакет ИИ, вы можете проверить, есть ли в нем ваша модель. Для этого используйте 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.

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

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

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

Bundletool

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

  1. Создайте набор App Bundle с помощью 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. Это означает, что они не будут автоматически извлекаться при установке приложения из неизвестного источника. Разработчики должны запрашивать их вручную при запуске приложения. Изменения в коде приложения не требуются.
  • Пакеты извлекаются из внешнего хранилища, а не из Google 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-файлы, созданные на основе модулей функций и пакетов объектов, устанавливаемых при скачивании. Пакеты ИИ по запросу и с быстрой загрузкой не устанавливаются как APK.

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

Рекомендуем провести комплексное тестирование приложения в Google Play, используя канал внутреннего тестирования.

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

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

Скачайте пример приложения.

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

Подробнее о наборах Android App Bundle и AI Delivery SDK…