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

Введение

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

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

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

Соображения

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

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

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

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

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

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

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

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

Дополнительная информация:

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

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

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

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

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

Извлеките вашу модель в пакет ИИ.

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

  1. В корневом каталоге вашего проекта создайте каталог для пакета ИИ. Имя этого каталога будет использоваться в качестве имени пакета ИИ. Имена пакетов ИИ должны начинаться с буквы и могут содержать только буквы, цифры и подчеркивания.
  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. В файле build.gradle вашего проекта добавьте названия всех пакетов ИИ, как показано ниже:

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

  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"
}

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

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

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

Для отслеживания хода установки пакетов AI следует реализовать обработчик AiPackStateUpdateListener . Обновления статуса будут разбиты по пакетам, что позволит отслеживать состояние отдельных пакетов 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 Store — например, если оно было установлено сторонними сервисами. Обратите внимание, что вызов 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;
}

Настройка целевого назначения устройств

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

Другие методы API для доставки игрового ИИ

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

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

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

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

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

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

Используйте getPackLocations() для одновременного запроса статуса нескольких пакетов ИИ, которая возвращает карту пакетов ИИ и их местоположений. Карта, возвращаемая функцией 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 ( исключая) : Максимально необходимый объем оперативной памяти (в байтах)
  • included_device_ids : Модели устройств, которые будут включены в этот селектор (максимум 10000 device_ids на группу) . Это свойство выполняется, если устройство соответствует любому device_id в списке.
    • build_brand : Производитель устройства
    • build_device : Код модели устройства
  • excluded_device_ids : Модели устройств, которые следует исключить из этого селектора (максимум 10000 device_ids на группу) . Это свойство выполняется, если устройство не соответствует ни одному device_id в списке.
    • build_brand : Производитель устройства
    • build_device : Код модели устройства
  • required_system_features : Функции, которыми должно обладать устройство, чтобы соответствовать этому селектору (максимум 100 функций на группу) . Для выполнения этого условия устройство должно обладать всеми системными функциями из этого списка.

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

    • Название : Системная функция
  • forbidden_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, выполнив один из следующих способов:

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

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

    страница пикселя 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 .

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

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

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

Скачайте демонстрационную версию приложения .

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

Узнайте больше об Android App Bundles и ознакомьтесь с рекомендациями по использованию AI Delivery SDK .