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

Введение

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

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

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

Соображения

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

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

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

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

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

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

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

Дополнительное чтение:

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

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

  1. Упакуйте свои модели в пакеты ИИ в вашем Android App Bundle и укажите, как должны доставляться пакеты ИИ.
  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.

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

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

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

    // 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. Добавьте код для загрузки и запуска моделей. Способ установки зависит от способа доставки ваших пакетов ИИ. Инструкции по установке в режиме Fast-Follow/по запросу см. ниже.

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

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

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

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

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

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

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 Library:

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

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

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

Возвращаемое значение Статус
Действительный объект AiPackLocation Корневая папка пакета AI готова к немедленному доступу по адресу 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 предоставляют размер 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() . Этот статус может возникать, когда приложение не распознаётся 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 , доступ к AI-пакету можно получить с помощью вызовов файловой системы. Используйте метод 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() для отмены активного запроса пакета ИИ. Обратите внимание, что этот запрос выполняется в режиме «лучшее из возможного».

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

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

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

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

Ориентация на устройство

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

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

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

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

  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>

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

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

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

Если устройство не соответствует ни одной группе, ему будет назначена группа по умолчанию «Другие». Эта группа генерируется автоматически и не требует явного указания.

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

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

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

    • имя : Системная функция
  • Запрещенные_системные_функции : Функции, которые устройство не должно включать в этот селектор (максимум 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»)

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

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

  • Загрузка 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 . То есть они не будут автоматически загружены при загрузке приложения из сторонних источников. Разработчикам необходимо запрашивать их вручную при запуске приложения; это не требует внесения каких-либо изменений в код приложения.
  • Пакеты извлекаются из внешнего хранилища вместо воспроизведения, поэтому вы не можете проверить, как ваш код ведет себя в случае сетевых ошибок.
  • Локальное тестирование не охватывает сценарий ожидания 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 для искусственного интеллекта на устройстве

Загрузите пример приложения .

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

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