Введение
Play for On-device AI позволяет использовать преимущества пакетов Android App Bundle и Google Play для распространения пользовательских моделей машинного обучения, что позволяет повысить производительность модели без дополнительных затрат, уменьшив сложность экосистемы. Он позволяет вам публиковать в Play один артефакт, содержащий ваш код, ресурсы и модели машинного обучения, а также выбирать из нескольких режимов доставки и параметров таргетинга.
Преимущества
- Загрузите один артефакт публикации в Google Play и делегируйте Play хостинг, доставку, обновления и таргетинг без дополнительных затрат.
- Предоставляйте свои модели машинного обучения во время установки, быстрого выполнения или по требованию.
- Доставка во время установки может гарантировать, что при открытии вашего приложения будет присутствовать очень большая модель. Ваша модель будет установлена в виде APK.
- Быстрая доставка происходит автоматически в фоновом режиме после установки приложения. Пользователи могут открыть ваше приложение до того, как ваша модель будет полностью загружена. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Доставка по требованию позволяет запрашивать модель во время выполнения, что полезно, если модель требуется только для определенных пользовательских потоков. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Предоставляйте варианты моделей машинного обучения, ориентированные на конкретные устройства на основе модели устройства, свойств системы или оперативной памяти.
- Сохраняйте обновления приложений небольшими и оптимизированными благодаря автоматическому обновлению Play, что означает, что необходимо загружать только различия в файлах.
Соображения
- Используя Play для искусственного интеллекта на устройстве, вы соглашаетесь с условиями Соглашения о распространении программного обеспечения Google Play и Условиями использования пакета разработки программного обеспечения Play Core .
- Ожидается, что разработчики, участвующие в программе раннего доступа, оценят Play для искусственного интеллекта на устройстве и оставят отзыв в Google Play.
- Модели, загруженные Play for On-device AI, могут использоваться только приложением, которое загрузило модель. Модели не следует предлагать другим приложениям, например, через сервисное соединение.
- Отдельные пакеты AI могут иметь размер до 1,5 ГБ в зависимости от размера их сжатой загрузки. Максимальный совокупный размер любой версии вашего приложения, созданной из пакета приложений, составляет 4 ГБ.
- Для приложений размером более 1 ГБ необходимо установить минимальный уровень SDK 21 или выше.
- В ходе программы раннего доступа игра для искусственного интеллекта на устройстве может быть изменена.
Как использовать Play для искусственного интеллекта на устройстве
Игра для искусственного интеллекта на устройстве использует пакеты искусственного интеллекта. Вы упаковываете пользовательские модели, готовые к распространению, в пакеты AI в своем пакете приложений. Вы можете выбрать, будет ли пакет AI доставляться во время установки, в режиме быстрой загрузки или по требованию.
Упаковывая пакеты AI в пакет приложений, вы можете использовать все существующие инструменты Play для тестирования и выпуска, такие как тестовые версии и поэтапные внедрения, для управления распространением вашего приложения с помощью ваших пользовательских моделей.
Пакеты AI обновляются вместе с двоичным файлом приложения. Если ваша новая версия приложения не вносит изменений в пакет AI, процесс автоматического обновления Play гарантирует, что пользователю не придется повторно загружать его. Play просто скачает то, что изменилось, при обновлении приложения.
Пакеты AI содержат только модели. Java/Kotlin и собственные библиотеки не допускаются. Если вам нужно добавить библиотеки или код для запуска модели машинного обучения, переместите их в базовый модуль или функциональный модуль . Вы можете настроить свой функциональный модуль так, чтобы он имел те же настройки загрузки и таргетинга, что и пакет AI.
Используйте LiteRT и MediaPipe с пакетами AI.
Вы можете использовать LiteRT и MediaPipe с пакетами AI. Упакуйте свою модель в пакет AI, а затем получите к нему доступ, используя инструкции для пакетов, устанавливаемых во время установки, или для пакетов быстрого доступа и пакетов по требованию .
Дальнейшее чтение:
- Начало работы с LiteRT
- В примере приложения показано, как можно упаковать модель LiteRT в пакет AI и загрузить ее во время выполнения.
- Существует множество предварительно обученных моделей LiteRT , которые вы можете использовать в пакетах ИИ для начала работы.
- Начало работы с MediaPipe
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
.binarypb
) по их путям к файлам. - Для пакетов времени установки вы можете использовать AndroidAssetUtil.java .
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
Начните работу с пакетами AI
В общих чертах, вот как вы можете начать использовать Play для искусственного интеллекта на устройстве:
- Предоставьте идентификатор своей учетной записи разработчика Play в Google Play, чтобы присоединиться к EAP.
- Упакуйте свои модели в пакеты AI в пакете Android App Bundle и укажите, как следует доставлять пакеты AI.
- [Необязательно] Если вы хотите доставлять разные модели на разные устройства, вы можете настроить таргетинг на устройства для своих пакетов AI. Например, вы можете доставить пакет AI Pack A для конкретной модели устройства, пакет AI Pack B — для устройств с объемом оперативной памяти не менее 6 ГБ, а все остальные устройства могут не получать никакой модели.
- [Необязательно] Если вы используете доставку по требованию или ускоренную доставку, интегрируйте библиотеку доставки AI Play в свое приложение, чтобы загружать пакеты AI по мере необходимости.
- Протестируйте и опубликуйте пакет приложений в Google Play.
Укажите идентификатор своей учетной записи разработчика Play.
Поскольку эта функция находится в раннем доступе, ваша учетная запись разработчика должна быть внесена в список разрешенных, чтобы иметь доступ к Play для искусственного интеллекта на устройстве. Подтвердите идентификаторы учетных записей разработчика Play и названия пакетов приложений своему менеджеру по работе с партнерами Google Play или члену команды Play for On-device AI. Укажите, будете ли вы ориентировать свои модели на определенные устройства (это шаг 3 из предыдущего раздела). В настоящее время мы приглашаем избранных партнеров Google протестировать эту функцию.
Проверьте версию плагина Android Gradle
Чтобы использовать пакеты AI, убедитесь, что версия вашего плагина Android Gradle (AGP) не ниже 8.8. Эта версия поставляется с Android Studio Ladybug 2.
Извлеките свою модель в пакет AI.
Android Studio не требуется для следующих шагов.
- В каталоге верхнего уровня вашего проекта создайте каталог для пакета AI. Это имя каталога используется как имя пакета AI. Имена пакетов AI должны начинаться с буквы и могут содержать только буквы, цифры и символы подчеркивания.
В каталоге пакета 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 ]" } }
В файле приложения
build.gradle
проекта добавьте имя каждого пакета AI в вашем проекте, как показано ниже:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
В файле
settings.gradle
проекта включите все пакеты AI в вашем проекте, как показано ниже:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
Внутри вашего пакета AI создайте каталог
src/main/assets/
.Поместите свои модели в каталог
src/main/assets
. Здесь вы также можете создавать подкаталоги. Структура каталогов вашего приложения теперь должна выглядеть следующим образом:-
build.gradle
-
settings.gradle
-
app/
-
ai-pack-name/build.gradle
-
ai-pack-name/src/main/assets/your-model-directories
-
Добавьте код для загрузки и запуска ваших моделей. То, как вы это сделаете, будет зависеть от способа доставки ваших пакетов ИИ. См. инструкции по установке и быстрому выполнению/по требованию ниже.
[Необязательно] Настройте таргетинг на устройства , чтобы доставлять разные модели на разные устройства.
Создайте пакет приложений Android с помощью Gradle . В созданном пакете приложений каталог корневого уровня теперь включает следующее:
-
ai-pack-name/manifest/AndroidManifest.xml
: настраивает идентификатор и режим доставки пакета AI. -
ai-pack-name/assets/your-model-directories
: Каталог, содержащий все ресурсы, поставляемые как часть пакета AI.
Gradle генерирует манифест для каждого пакета AI и выводит для вас каталог
assets/
.-
Настройка доставки во время установки
Пакеты AI, настроенные для установки во время установки, сразу же доступны при запуске приложения. Используйте Java AssetManager API для доступа к пакетам AI, обслуживаемым в этом режиме:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
Настройте быструю доставку и доставку по требованию
Чтобы загрузить пакеты AI с быстрой доставкой или доставкой по требованию, используйте библиотеку доставки AI Play.
Объявить зависимость от библиотеки доставки Play AI.
В файле build.gradle
вашего приложения объявите зависимость от библиотеки доставки Play AI:
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>
. Эта карта содержит состояние каждого запрошенного пакета ИИ с указанием его имени:
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()
в этом случае приведет к обновлению приложения. После обновления вам нужно будет снова запросить пакеты ИИ.
Ниже приведен пример реализации прослушивателя:
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; }
Настройка таргетинга на устройства
Вы можете следовать инструкциям по настройке таргетинга устройств , чтобы указать устройства или группы устройств, которые должны получать ваши пакеты AI.
Другие методы Play AI Delivery API
Ниже приведены некоторые дополнительные методы API, которые вы можете использовать в своем приложении.
Отменить запрос
Используйте cancel()
чтобы отменить активный запрос пакета AI. Обратите внимание, что этот запрос представляет собой операцию с максимальными усилиями.
Удалить пакет AI
Используйте removePack()
чтобы запланировать удаление пакета AI.
Получите местоположение нескольких пакетов AI.
Используйте getPackLocations()
для массового запроса статуса нескольких пакетов AI, который возвращает карту пакетов AI и их местоположений. Карта, возвращаемая функцией getPackLocations()
содержит запись для каждого пакета, который в данный момент загружен и обновлен.
Таргетинг на устройства
Таргетинг на устройства дает вам более точный контроль над тем, какие части вашего пакета приложений доставляются на определенные устройства. Например, вы можете гарантировать, что большая модель будет доставляться только на устройства с большим объемом оперативной памяти, или вы можете доставлять разные версии модели на разные устройства.
Вы можете настроить таргетинг на такие свойства устройства, как:
- Система на чипе
- Модель устройства
- Оперативная память устройства
- Возможности системы
Обзор необходимых шагов
Чтобы включить таргетинг на устройства, необходимо выполнить следующие действия:
- Определите группы устройств в XML-файле.
- Укажите, какие части вашего пакета должны относиться к каким группам устройств.
- [Необязательно] Проверьте свою конфигурацию локально.
- Загрузите свой пакет (содержащий XML-файл) в Google Play.
Проверьте версию плагина Android Gradle
Чтобы использовать таргетинг на устройства, убедитесь, что версия вашего плагина Android Gradle (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 ( эксклюзивный) : Максимально необходимый объем оперативной памяти (в байтах).
- include_device_ids : модели устройств, которые будут включены в этот селектор (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство соответствует любому идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
- исключенные_device_ids : модели устройств, которые будут исключены из этого селектора (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство не соответствует ни одному идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
require_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, одним из следующих способов:
Проверка отдельных устройств с помощью каталога устройств и поиск производителя и кода модели в местах, как показано в примере ниже (для Google Pixel 4a производителем является «Google», а код модели — «sunfish»).
Загрузка 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 по группам устройств, взяв существующие каталоги пакетов 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 установил бы для этого устройства, если бы эта версия приложения была доступна в тестовой или рабочей версии.
Ознакомьтесь с внутренними инструкциями по совместному использованию приложений .
Пакетный инструмент
Кроме того, вы можете создать APK-файлы с помощью bundletool
(1.18.0 или выше) и загрузить их на свое устройство. Выполните следующие действия, чтобы протестировать свое приложение локально с помощью Bundletool:
Создайте пакет приложений с помощью Android Studio или Bundletool.
Сгенерируйте APK с флагом
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
Подключите устройство и запустите
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 по запросу и Fast-follow не устанавливаются в виде APK-файлов.
Протестируйте и выпустите в Google Play
Мы рекомендуем вам полностью протестировать свое приложение в Google Play с помощью внутренней тестовой версии .
Сделав это, вы можете постепенно выпускать обновление приложения в рабочую среду с помощью поэтапного развертывания .
Пример приложения с использованием Play для искусственного интеллекта на устройстве
Свяжитесь со своим менеджером по работе с партнерами Google Play, чтобы получить доступ к нашему примеру приложения .
В нем показано, как использовать каждый из режимов доставки, а также настройку таргетинга на устройства. Чтобы начать, ознакомьтесь с разделом локального тестирования .
Оставьте отзыв
Участники программы раннего доступа должны сообщать о проблемах и оставлять отзывы. Вы можете обратиться к своему менеджеру по работе с партнерами Google Play или к команде Play for On-device AI.
Связанный контент
Узнайте больше о наборах приложений для Android и прочитайте ссылки на AI Delivery SDK .
,Введение
Play for On-device AI позволяет использовать преимущества пакетов Android App Bundle и Google Play для распространения пользовательских моделей машинного обучения, что позволяет повысить производительность модели без дополнительных затрат, уменьшив сложность экосистемы. Он позволяет вам публиковать в Play один артефакт, содержащий ваш код, ресурсы и модели машинного обучения, а также выбирать из нескольких режимов доставки и параметров таргетинга.
Преимущества
- Загрузите один артефакт публикации в Google Play и делегируйте Play хостинг, доставку, обновления и таргетинг без дополнительных затрат.
- Предоставляйте свои модели машинного обучения во время установки, быстрого выполнения или по требованию.
- Доставка во время установки может гарантировать, что при открытии вашего приложения будет присутствовать очень большая модель. Ваша модель будет установлена в виде APK.
- Быстрая доставка происходит автоматически в фоновом режиме после установки приложения. Пользователи могут открыть ваше приложение до того, как ваша модель будет полностью загружена. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Доставка по требованию позволяет запрашивать модель во время выполнения, что полезно, если модель требуется только для определенных пользовательских потоков. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Предоставляйте варианты моделей машинного обучения, ориентированные на конкретные устройства на основе модели устройства, свойств системы или оперативной памяти.
- Сохраняйте обновления приложений небольшими и оптимизированными благодаря автоматическому обновлению Play, что означает, что необходимо загружать только различия в файлах.
Соображения
- Используя Play для искусственного интеллекта на устройстве, вы соглашаетесь с условиями Соглашения о распространении программного обеспечения Google Play и Условиями использования пакета разработки программного обеспечения Play Core .
- Ожидается, что разработчики, участвующие в программе раннего доступа, оценят Play для искусственного интеллекта на устройстве и оставят отзыв в Google Play.
- Модели, загруженные Play for On-device AI, могут использоваться только приложением, которое загрузило модель. Модели не следует предлагать другим приложениям, например, через сервисное соединение.
- Отдельные пакеты AI могут иметь размер до 1,5 ГБ в зависимости от размера их сжатой загрузки. Максимальный совокупный размер любой версии вашего приложения, созданной из пакета приложений, составляет 4 ГБ.
- Для приложений размером более 1 ГБ необходимо установить минимальный уровень SDK 21 или выше.
- В ходе программы раннего доступа игра для искусственного интеллекта на устройстве может быть изменена.
Как использовать Play для искусственного интеллекта на устройстве
Игра для искусственного интеллекта на устройстве использует пакеты искусственного интеллекта. Вы упаковываете пользовательские модели, готовые к распространению, в пакеты AI в своем пакете приложений. Вы можете выбрать, будет ли пакет AI доставляться во время установки, в режиме быстрой загрузки или по требованию.
Упаковывая пакеты AI в пакет приложений, вы можете использовать все существующие инструменты Play для тестирования и выпуска, такие как тестовые версии и поэтапные внедрения, для управления распространением вашего приложения с помощью ваших пользовательских моделей.
Пакеты AI обновляются вместе с двоичным файлом приложения. Если ваша новая версия приложения не вносит изменений в пакет AI, процесс автоматического обновления Play гарантирует, что пользователю не придется повторно загружать его. Play просто скачает то, что изменилось, при обновлении приложения.
Пакеты AI содержат только модели. Java/Kotlin и собственные библиотеки не допускаются. Если вам нужно добавить библиотеки или код для запуска модели машинного обучения, переместите их в базовый модуль или функциональный модуль . Вы можете настроить свой функциональный модуль так, чтобы он имел те же настройки загрузки и таргетинга, что и пакет AI.
Используйте LiteRT и MediaPipe с пакетами AI.
Вы можете использовать LiteRT и MediaPipe с пакетами AI. Упакуйте свою модель в пакет AI, а затем получите к нему доступ, используя инструкции для пакетов, устанавливаемых во время установки, или для пакетов быстрого доступа и пакетов по требованию .
Дальнейшее чтение:
- Начало работы с LiteRT
- В примере приложения показано, как можно упаковать модель LiteRT в пакет AI и загрузить ее во время выполнения.
- Существует множество предварительно обученных моделей LiteRT , которые вы можете использовать в пакетах ИИ для начала работы.
- Начало работы с MediaPipe
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
.binarypb
) по их путям к файлам. - Для пакетов времени установки вы можете использовать AndroidAssetUtil.java .
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
Начните работу с пакетами AI
В общих чертах, вот как вы можете начать использовать Play для искусственного интеллекта на устройстве:
- Предоставьте идентификатор своей учетной записи разработчика Play в Google Play, чтобы присоединиться к EAP.
- Упакуйте свои модели в пакеты AI в пакете Android App Bundle и укажите, как следует доставлять пакеты AI.
- [Необязательно] Если вы хотите доставлять разные модели на разные устройства, вы можете настроить таргетинг на устройства для своих пакетов AI. Например, вы можете доставить пакет AI Pack A для конкретной модели устройства, пакет AI Pack B — для устройств с объемом оперативной памяти не менее 6 ГБ, а все остальные устройства могут не получать никакой модели.
- [Необязательно] Если вы используете доставку по требованию или ускоренную доставку, интегрируйте библиотеку доставки AI Play в свое приложение, чтобы загружать пакеты AI по мере необходимости.
- Протестируйте и опубликуйте пакет приложений в Google Play.
Укажите идентификатор своей учетной записи разработчика Play.
Поскольку эта функция находится в раннем доступе, ваша учетная запись разработчика должна быть внесена в список разрешенных, чтобы иметь доступ к Play для искусственного интеллекта на устройстве. Подтвердите идентификаторы учетных записей разработчика Play и названия пакетов приложений своему менеджеру по работе с партнерами Google Play или члену команды Play for On-device AI. Укажите, будете ли вы ориентировать свои модели на определенные устройства (это шаг 3 из предыдущего раздела). В настоящее время мы приглашаем избранных партнеров Google протестировать эту функцию.
Проверьте версию плагина Android Gradle
Чтобы использовать пакеты AI, убедитесь, что версия вашего плагина Android Gradle (AGP) не ниже 8.8. Эта версия поставляется с Android Studio Ladybug 2.
Извлеките свою модель в пакет AI.
Android Studio не требуется для следующих шагов.
- В каталоге верхнего уровня вашего проекта создайте каталог для пакета AI. Это имя каталога используется как имя пакета AI. Имена пакетов AI должны начинаться с буквы и могут содержать только буквы, цифры и символы подчеркивания.
В каталоге пакета 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 ]" } }
В файле приложения
build.gradle
проекта добавьте имя каждого пакета AI в вашем проекте, как показано ниже:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
В файле
settings.gradle
проекта включите все пакеты AI в вашем проекте, как показано ниже:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
Внутри вашего пакета AI создайте каталог
src/main/assets/
.Поместите свои модели в каталог
src/main/assets
. Здесь вы также можете создавать подкаталоги. Структура каталогов вашего приложения теперь должна выглядеть следующим образом:-
build.gradle
-
settings.gradle
-
app/
-
ai-pack-name/build.gradle
-
ai-pack-name/src/main/assets/your-model-directories
-
Добавьте код для загрузки и запуска ваших моделей. То, как вы это сделаете, будет зависеть от способа доставки ваших пакетов ИИ. См. инструкции по установке и быстрому выполнению/по требованию ниже.
[Необязательно] Настройте таргетинг на устройства , чтобы доставлять разные модели на разные устройства.
Создайте пакет приложений Android с помощью Gradle . В созданном пакете приложений каталог корневого уровня теперь включает следующее:
-
ai-pack-name/manifest/AndroidManifest.xml
: настраивает идентификатор и режим доставки пакета AI. -
ai-pack-name/assets/your-model-directories
: Каталог, содержащий все ресурсы, поставляемые как часть пакета AI.
Gradle генерирует манифест для каждого пакета AI и выводит для вас каталог
assets/
.-
Настройка доставки во время установки
Пакеты AI, настроенные для установки во время установки, сразу же доступны при запуске приложения. Используйте Java AssetManager API для доступа к пакетам AI, обслуживаемым в этом режиме:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
Настройте быструю доставку и доставку по требованию
Чтобы загрузить пакеты AI с быстрой доставкой или доставкой по требованию, используйте библиотеку доставки AI Play.
Объявить зависимость от библиотеки доставки Play AI.
В файле build.gradle
вашего приложения объявите зависимость от библиотеки доставки Play AI:
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>
. Эта карта содержит состояние каждого запрошенного пакета ИИ с указанием его имени:
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()
в этом случае приведет к обновлению приложения. После обновления вам нужно будет снова запросить пакеты ИИ.
Ниже приведен пример реализации прослушивателя:
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; }
Настройка таргетинга на устройства
Вы можете следовать инструкциям по настройке таргетинга устройств , чтобы указать устройства или группы устройств, которые должны получать ваши пакеты AI.
Другие методы Play AI Delivery API
Ниже приведены некоторые дополнительные методы API, которые вы можете использовать в своем приложении.
Отменить запрос
Используйте cancel()
чтобы отменить активный запрос пакета AI. Обратите внимание, что этот запрос представляет собой операцию с максимальными усилиями.
Удалить пакет AI
Используйте removePack()
чтобы запланировать удаление пакета AI.
Получите местоположение нескольких пакетов AI.
Используйте getPackLocations()
для массового запроса статуса нескольких пакетов AI, который возвращает карту пакетов AI и их местоположений. Карта, возвращаемая функцией getPackLocations()
содержит запись для каждого пакета, который в данный момент загружен и обновлен.
Таргетинг на устройства
Таргетинг на устройства дает вам более точный контроль над тем, какие части вашего пакета приложений доставляются на определенные устройства. Например, вы можете гарантировать, что большая модель будет доставляться только на устройства с большим объемом оперативной памяти, или вы можете доставлять разные версии модели на разные устройства.
Вы можете настроить таргетинг на такие свойства устройства, как:
- Система на чипе
- Модель устройства
- Оперативная память устройства
- Возможности системы
Обзор необходимых шагов
Чтобы включить таргетинг на устройства, необходимо выполнить следующие действия:
- Определите группы устройств в XML-файле.
- Укажите, какие части вашего пакета должны относиться к каким группам устройств.
- [Необязательно] Проверьте свою конфигурацию локально.
- Загрузите свой пакет (содержащий XML-файл) в Google Play.
Проверьте версию плагина Android Gradle
Чтобы использовать таргетинг на устройства, убедитесь, что версия вашего плагина Android Gradle (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 ( эксклюзивный) : Максимально необходимый объем оперативной памяти (в байтах).
- include_device_ids : модели устройств, которые будут включены в этот селектор (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство соответствует любому идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
- исключенные_device_ids : модели устройств, которые будут исключены из этого селектора (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство не соответствует ни одному идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
require_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, одним из следующих способов:
Проверка отдельных устройств с помощью каталога устройств и поиск производителя и кода модели в местах, как показано в примере ниже (для Google Pixel 4a производителем является «Google», а код модели — «sunfish»).
Загрузка 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 по группам устройств, взяв существующие каталоги пакетов 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 установил бы для этого устройства, если бы эта версия приложения была доступна в тестовой или рабочей версии.
Ознакомьтесь с внутренними инструкциями по совместному использованию приложений .
Пакетный инструмент
Кроме того, вы можете создать APK-файлы с помощью bundletool
(1.18.0 или выше) и загрузить их на свое устройство. Выполните следующие действия, чтобы протестировать свое приложение локально с помощью Bundletool:
Создайте пакет приложений с помощью Android Studio или Bundletool.
Сгенерируйте APK с флагом
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
Подключите устройство и запустите
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 по запросу и Fast-follow не устанавливаются в виде APK-файлов.
Протестируйте и выпустите в Google Play
Мы рекомендуем вам полностью протестировать свое приложение в Google Play с помощью внутренней тестовой версии .
Сделав это, вы можете постепенно выпускать обновление приложения в рабочую среду с помощью поэтапного развертывания .
Пример приложения с использованием Play для искусственного интеллекта на устройстве
Свяжитесь со своим менеджером по работе с партнерами Google Play, чтобы получить доступ к нашему примеру приложения .
В нем показано, как использовать каждый из режимов доставки, а также настройку таргетинга на устройства. Чтобы начать, ознакомьтесь с разделом локального тестирования .
Оставьте отзыв
Участники программы раннего доступа должны сообщать о проблемах и оставлять отзывы. Вы можете обратиться к своему менеджеру по работе с партнерами Google Play или к команде Play for On-device AI.
Связанный контент
Узнайте больше о наборах приложений для Android и прочитайте ссылки на AI Delivery SDK .
,Введение
Play for On-device AI позволяет использовать преимущества пакетов Android App Bundle и Google Play для распространения пользовательских моделей машинного обучения, что позволяет повысить производительность модели без дополнительных затрат, уменьшив сложность экосистемы. Он позволяет вам публиковать в Play один артефакт, содержащий ваш код, ресурсы и модели машинного обучения, а также выбирать из нескольких режимов доставки и параметров таргетинга.
Преимущества
- Загрузите один артефакт публикации в Google Play и делегируйте Play хостинг, доставку, обновления и таргетинг без дополнительных затрат.
- Предоставляйте свои модели машинного обучения во время установки, быстрого выполнения или по требованию.
- Доставка во время установки может гарантировать, что при открытии вашего приложения будет присутствовать очень большая модель. Ваша модель будет установлена в виде APK.
- Быстрая доставка происходит автоматически в фоновом режиме после установки приложения. Пользователи могут открыть ваше приложение до того, как ваша модель будет полностью загружена. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Доставка по требованию позволяет запрашивать модель во время выполнения, что полезно, если модель требуется только для определенных пользовательских потоков. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Предоставляйте варианты моделей машинного обучения, ориентированные на конкретные устройства на основе модели устройства, свойств системы или оперативной памяти.
- Сохраняйте обновления приложений небольшими и оптимизированными благодаря автоматическому обновлению Play, что означает, что необходимо загружать только различия в файлах.
Соображения
- Используя Play для искусственного интеллекта на устройстве, вы соглашаетесь с условиями Соглашения о распространении программного обеспечения Google Play и Условиями использования пакета разработки программного обеспечения Play Core .
- Ожидается, что разработчики, участвующие в программе раннего доступа, оценят Play для искусственного интеллекта на устройстве и оставят отзыв в Google Play.
- Модели, загруженные Play for On-device AI, могут использоваться только приложением, которое загрузило модель. Модели не следует предлагать другим приложениям, например, через сервисное соединение.
- Отдельные пакеты AI могут иметь размер до 1,5 ГБ в зависимости от размера их сжатой загрузки. Максимальный совокупный размер любой версии вашего приложения, созданной из пакета приложений, составляет 4 ГБ.
- Для приложений размером более 1 ГБ необходимо установить минимальный уровень SDK 21 или выше.
- В ходе программы раннего доступа игра для искусственного интеллекта на устройстве может быть изменена.
Как использовать Play для искусственного интеллекта на устройстве
Игра для искусственного интеллекта на устройстве использует пакеты искусственного интеллекта. Вы упаковываете пользовательские модели, готовые к распространению, в пакеты AI в своем пакете приложений. Вы можете выбрать, будет ли пакет AI доставляться во время установки, в режиме быстрой загрузки или по требованию.
Упаковывая пакеты AI в пакет приложений, вы можете использовать все существующие инструменты Play для тестирования и выпуска, такие как тестовые версии и поэтапные внедрения, для управления распространением вашего приложения с помощью ваших пользовательских моделей.
Пакеты AI обновляются вместе с двоичным файлом приложения. Если ваша новая версия приложения не вносит изменений в пакет AI, процесс автоматического обновления Play гарантирует, что пользователю не придется повторно загружать его. Play просто скачает то, что изменилось, при обновлении приложения.
Пакеты AI содержат только модели. Java/Kotlin и собственные библиотеки не допускаются. Если вам нужно добавить библиотеки или код для запуска модели машинного обучения, переместите их в базовый модуль или функциональный модуль . Вы можете настроить свой функциональный модуль так, чтобы он имел те же настройки загрузки и таргетинга, что и пакет AI.
Используйте LiteRT и MediaPipe с пакетами AI.
Вы можете использовать LiteRT и MediaPipe с пакетами AI. Упакуйте свою модель в пакет AI, а затем получите к нему доступ, используя инструкции для пакетов, устанавливаемых во время установки, или для пакетов быстрого доступа и пакетов по требованию .
Дальнейшее чтение:
- Начало работы с LiteRT
- В примере приложения показано, как можно упаковать модель LiteRT в пакет AI и загрузить ее во время выполнения.
- Существует множество предварительно обученных моделей LiteRT , которые вы можете использовать в пакетах ИИ для начала работы.
- Начало работы с MediaPipe
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
.binarypb
) по их путям к файлам. - Для пакетов времени установки вы можете использовать AndroidAssetUtil.java .
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
Начните работу с пакетами AI
В общих чертах, вот как вы можете начать использовать Play для искусственного интеллекта на устройстве:
- Предоставьте идентификатор своей учетной записи разработчика Play в Google Play, чтобы присоединиться к EAP.
- Упакуйте свои модели в пакеты AI в пакете Android App Bundle и укажите, как следует доставлять пакеты AI.
- [Необязательно] Если вы хотите доставлять разные модели на разные устройства, вы можете настроить таргетинг на устройства для своих пакетов AI. Например, вы можете доставить пакет AI Pack A для конкретной модели устройства, пакет AI Pack B — для устройств с объемом оперативной памяти не менее 6 ГБ, а все остальные устройства могут не получать никакой модели.
- [Необязательно] Если вы используете доставку по требованию или ускоренную доставку, интегрируйте библиотеку доставки AI Play в свое приложение, чтобы загружать пакеты AI по мере необходимости.
- Протестируйте и опубликуйте пакет приложений в Google Play.
Укажите идентификатор своей учетной записи разработчика Play.
Поскольку эта функция находится в раннем доступе, ваша учетная запись разработчика должна быть внесена в список разрешенных, чтобы иметь доступ к Play для искусственного интеллекта на устройстве. Подтвердите идентификаторы учетных записей разработчика Play и названия пакетов приложений своему менеджеру по работе с партнерами Google Play или члену команды Play for On-device AI. Укажите, будете ли вы ориентировать свои модели на определенные устройства (это шаг 3 из предыдущего раздела). В настоящее время мы приглашаем избранных партнеров Google протестировать эту функцию.
Проверьте версию плагина Android Gradle
Чтобы использовать пакеты AI, убедитесь, что версия вашего плагина Android Gradle (AGP) не ниже 8.8. Эта версия поставляется с Android Studio Ladybug 2.
Извлеките свою модель в пакет AI.
Android Studio не требуется для следующих шагов.
- В каталоге верхнего уровня вашего проекта создайте каталог для пакета AI. Это имя каталога используется как имя пакета AI. Имена пакетов AI должны начинаться с буквы и могут содержать только буквы, цифры и символы подчеркивания.
В каталоге пакета 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 ]" } }
В файле приложения
build.gradle
проекта добавьте имя каждого пакета AI в вашем проекте, как показано ниже:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
В файле
settings.gradle
проекта включите все пакеты AI в вашем проекте, как показано ниже:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
Внутри вашего пакета AI создайте каталог
src/main/assets/
.Поместите свои модели в каталог
src/main/assets
. Здесь вы также можете создавать подкаталоги. Структура каталогов вашего приложения теперь должна выглядеть следующим образом:-
build.gradle
-
settings.gradle
-
app/
-
ai-pack-name/build.gradle
-
ai-pack-name/src/main/assets/your-model-directories
-
Добавьте код для загрузки и запуска ваших моделей. То, как вы это сделаете, будет зависеть от способа доставки ваших пакетов ИИ. См. инструкции по установке и быстрому выполнению/по требованию ниже.
[Необязательно] Настройте таргетинг на устройства , чтобы доставлять разные модели на разные устройства.
Создайте пакет приложений Android с помощью Gradle . В созданном пакете приложений каталог корневого уровня теперь включает следующее:
-
ai-pack-name/manifest/AndroidManifest.xml
: настраивает идентификатор и режим доставки пакета AI. -
ai-pack-name/assets/your-model-directories
: Каталог, содержащий все ресурсы, поставляемые как часть пакета AI.
Gradle генерирует манифест для каждого пакета AI и выводит для вас каталог
assets/
.-
Настройка доставки во время установки
Пакеты AI, настроенные для установки во время установки, сразу же доступны при запуске приложения. Используйте Java AssetManager API для доступа к пакетам AI, обслуживаемым в этом режиме:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
Настройте быструю доставку и доставку по требованию
Чтобы загрузить пакеты AI с быстрой доставкой или доставкой по требованию, используйте библиотеку доставки AI Play.
Объявить зависимость от библиотеки доставки Play AI.
В файле build.gradle
вашего приложения объявите зависимость от библиотеки доставки Play AI:
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>
. Эта карта содержит состояние каждого запрошенного пакета ИИ с указанием его имени:
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()
в этом случае приведет к обновлению приложения. После обновления вам нужно будет снова запросить пакеты ИИ.
Ниже приведен пример реализации прослушивателя:
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; }
Настройка таргетинга на устройства
Вы можете следовать инструкциям по настройке таргетинга устройств , чтобы указать устройства или группы устройств, которые должны получать ваши пакеты AI.
Другие методы Play AI Delivery API
Ниже приведены некоторые дополнительные методы API, которые вы можете использовать в своем приложении.
Отменить запрос
Используйте cancel()
чтобы отменить активный запрос пакета AI. Обратите внимание, что этот запрос представляет собой операцию с максимальными усилиями.
Удалить пакет AI
Используйте removePack()
чтобы запланировать удаление пакета AI.
Получите местоположение нескольких пакетов AI.
Используйте getPackLocations()
для массового запроса статуса нескольких пакетов AI, который возвращает карту пакетов AI и их местоположений. Карта, возвращаемая функцией getPackLocations()
содержит запись для каждого пакета, который в данный момент загружен и обновлен.
Таргетинг на устройства
Таргетинг на устройства дает вам более точный контроль над тем, какие части вашего пакета приложений доставляются на определенные устройства. Например, вы можете гарантировать, что большая модель будет доставляться только на устройства с большим объемом оперативной памяти, или вы можете доставлять разные версии модели на разные устройства.
Вы можете настроить таргетинг на такие свойства устройства, как:
- Система на чипе
- Модель устройства
- Оперативная память устройства
- Возможности системы
Обзор необходимых шагов
Чтобы включить таргетинг на устройства, необходимо выполнить следующие действия:
- Определите группы устройств в XML-файле.
- Укажите, какие части вашего пакета должны относиться к каким группам устройств.
- [Необязательно] Проверьте свою конфигурацию локально.
- Загрузите свой пакет (содержащий XML-файл) в Google Play.
Проверьте версию плагина Android Gradle
Чтобы использовать таргетинг на устройства, убедитесь, что версия вашего плагина Android Gradle (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 ( эксклюзивный) : Максимально необходимый объем оперативной памяти (в байтах).
- include_device_ids : модели устройств, которые будут включены в этот селектор (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство соответствует любому идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
- исключенные_device_ids : модели устройств, которые будут исключены из этого селектора (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство не соответствует ни одному идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
require_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, одним из следующих способов:
Проверка отдельных устройств с помощью каталога устройств и поиск производителя и кода модели в местах, как показано в примере ниже (для Google Pixel 4a производителем является «Google», а код модели — «sunfish»).
Загрузка 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 по группам устройств, взяв существующие каталоги пакетов 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 установил бы для этого устройства, если бы эта версия приложения была доступна в тестовой или рабочей версии.
Ознакомьтесь с внутренними инструкциями по совместному использованию приложений .
Пакетный инструмент
Кроме того, вы можете создать APK-файлы с помощью bundletool
(1.18.0 или выше) и загрузить их на свое устройство. Выполните следующие действия, чтобы протестировать свое приложение локально с помощью Bundletool:
Создайте пакет приложений с помощью Android Studio или Bundletool.
Сгенерируйте APK с флагом
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
Подключите устройство и запустите
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 по запросу и Fast-follow не устанавливаются в виде APK-файлов.
Протестируйте и выпустите в Google Play
Мы рекомендуем вам полностью протестировать свое приложение в Google Play с помощью внутренней тестовой версии .
Сделав это, вы можете постепенно выпускать обновление приложения в рабочую среду с помощью поэтапного развертывания .
Пример приложения с использованием Play для искусственного интеллекта на устройстве
Свяжитесь со своим менеджером по работе с партнерами Google Play, чтобы получить доступ к нашему примеру приложения .
В нем показано, как использовать каждый из режимов доставки, а также настройку таргетинга на устройства. Чтобы начать, ознакомьтесь с разделом локального тестирования .
Оставьте отзыв
Участники программы раннего доступа должны сообщать о проблемах и оставлять отзывы. Вы можете обратиться к своему менеджеру по работе с партнерами Google Play или к команде Play for On-device AI.
Связанный контент
Узнайте больше о наборах приложений для Android и прочитайте ссылки на AI Delivery SDK .
,Введение
Play for On-device AI позволяет использовать преимущества пакетов Android App Bundle и Google Play для распространения пользовательских моделей машинного обучения, что позволяет повысить производительность модели без дополнительных затрат, уменьшив сложность экосистемы. Он позволяет вам публиковать в Play один артефакт, содержащий ваш код, ресурсы и модели машинного обучения, а также выбирать из нескольких режимов доставки и параметров таргетинга.
Преимущества
- Загрузите один артефакт публикации в Google Play и делегируйте Play хостинг, доставку, обновления и таргетинг без дополнительных затрат.
- Предоставляйте свои модели машинного обучения во время установки, быстрого выполнения или по требованию.
- Доставка во время установки может гарантировать, что при открытии вашего приложения будет присутствовать очень большая модель. Ваша модель будет установлена в виде APK.
- Быстрая доставка происходит автоматически в фоновом режиме после установки приложения. Пользователи могут открыть ваше приложение до того, как ваша модель будет полностью загружена. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Доставка по требованию позволяет запрашивать модель во время выполнения, что полезно, если модель требуется только для определенных пользовательских потоков. Ваша модель будет загружена во внутреннюю память вашего приложения.
- Предоставляйте варианты моделей машинного обучения, ориентированные на конкретные устройства на основе модели устройства, свойств системы или оперативной памяти.
- Сохраняйте обновления приложений небольшими и оптимизированными благодаря автоматическому обновлению Play, что означает, что необходимо загружать только различия в файлах.
Соображения
- Используя Play для искусственного интеллекта на устройстве, вы соглашаетесь с условиями Соглашения о распространении программного обеспечения Google Play и Условиями использования пакета разработки программного обеспечения Play Core .
- Ожидается, что разработчики, участвующие в программе раннего доступа, оценят Play для искусственного интеллекта на устройстве и оставят отзыв в Google Play.
- Модели, загруженные Play for On-device AI, могут использоваться только приложением, которое загрузило модель. Модели не следует предлагать другим приложениям, например, через сервисное соединение.
- Отдельные пакеты AI могут иметь размер до 1,5 ГБ в зависимости от размера их сжатой загрузки. Максимальный совокупный размер любой версии вашего приложения, созданной из пакета приложений, составляет 4 ГБ.
- Для приложений размером более 1 ГБ необходимо установить минимальный уровень SDK 21 или выше.
- В ходе программы раннего доступа игра для искусственного интеллекта на устройстве может быть изменена.
Как использовать Play для искусственного интеллекта на устройстве
Игра для искусственного интеллекта на устройстве использует пакеты искусственного интеллекта. Вы упаковываете пользовательские модели, готовые к распространению, в пакеты AI в своем пакете приложений. Вы можете выбрать, будет ли пакет AI доставляться во время установки, в режиме быстрой загрузки или по требованию.
Упаковывая пакеты AI в пакет приложений, вы можете использовать все существующие инструменты Play для тестирования и выпуска, такие как тестовые версии и поэтапные внедрения, для управления распространением вашего приложения с помощью ваших пользовательских моделей.
Пакеты AI обновляются вместе с двоичным файлом приложения. Если ваша новая версия приложения не вносит изменений в пакет AI, процесс автоматического обновления Play гарантирует, что пользователю не придется повторно загружать его. Play просто скачает то, что изменилось, при обновлении приложения.
Пакеты AI содержат только модели. Java/Kotlin и собственные библиотеки не допускаются. Если вам нужно добавить библиотеки или код для запуска модели машинного обучения, переместите их в базовый модуль или функциональный модуль . Вы можете настроить свой функциональный модуль так, чтобы он имел те же настройки загрузки и таргетинга, что и пакет AI.
Используйте LiteRT и MediaPipe с пакетами AI.
Вы можете использовать LiteRT и MediaPipe с пакетами AI. Упакуйте свою модель в пакет AI, а затем получите к нему доступ, используя инструкции для пакетов, устанавливаемых во время установки, или для пакетов быстрого доступа и пакетов по требованию .
Дальнейшее чтение:
- Начало работы с LiteRT
- В примере приложения показано, как можно упаковать модель LiteRT в пакет AI и загрузить ее во время выполнения.
- Существует множество предварительно обученных моделей LiteRT , которые вы можете использовать в пакетах ИИ для начала работы.
- Начало работы с MediaPipe
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
.binarypb
) по их путям к файлам. - Для пакетов времени установки вы можете использовать AndroidAssetUtil.java .
- Для пакетов быстрого отслеживания и пакетов по требованию вы можете использовать AssetCache.java для загрузки ваших ресурсов (например, файлов
Начните работу с пакетами AI
В общих чертах, вот как вы можете начать использовать Play для искусственного интеллекта на устройстве:
- Предоставьте идентификатор своей учетной записи разработчика Play в Google Play, чтобы присоединиться к EAP.
- Упакуйте свои модели в пакеты AI в пакете Android App Bundle и укажите, как следует доставлять пакеты AI.
- [Необязательно] Если вы хотите доставлять разные модели на разные устройства, вы можете настроить таргетинг на устройства для своих пакетов AI. Например, вы можете доставить пакет AI Pack A для конкретной модели устройства, пакет AI Pack B — для устройств с объемом оперативной памяти не менее 6 ГБ, а все остальные устройства могут не получать никакой модели.
- [Необязательно] Если вы используете доставку по требованию или ускоренную доставку, интегрируйте библиотеку доставки AI Play в свое приложение, чтобы загружать пакеты AI по мере необходимости.
- Протестируйте и опубликуйте пакет приложений в Google Play.
Укажите идентификатор своей учетной записи разработчика Play.
Поскольку эта функция находится в раннем доступе, ваша учетная запись разработчика должна быть внесена в список разрешенных, чтобы иметь доступ к Play для искусственного интеллекта на устройстве. Подтвердите идентификаторы учетных записей разработчика Play и названия пакетов приложений своему менеджеру по работе с партнерами Google Play или члену команды Play for On-device AI. Укажите, будете ли вы ориентировать свои модели на определенные устройства (это шаг 3 из предыдущего раздела). В настоящее время мы приглашаем избранных партнеров Google протестировать эту функцию.
Проверьте версию плагина Android Gradle
Чтобы использовать пакеты AI, убедитесь, что версия вашего плагина Android Gradle (AGP) не ниже 8.8. Эта версия поставляется с Android Studio Ladybug 2.
Извлеките свою модель в пакет AI.
Android Studio не требуется для следующих шагов.
- В каталоге верхнего уровня вашего проекта создайте каталог для пакета AI. Это имя каталога используется как имя пакета AI. Имена пакетов AI должны начинаться с буквы и могут содержать только буквы, цифры и символы подчеркивания.
В каталоге пакета 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 ]" } }
В файле приложения
build.gradle
проекта добавьте имя каждого пакета AI в вашем проекте, как показано ниже:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
В файле
settings.gradle
проекта включите все пакеты AI в вашем проекте, как показано ниже:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
Внутри вашего пакета AI создайте каталог
src/main/assets/
.Поместите свои модели в каталог
src/main/assets
. Здесь вы также можете создавать подкаталоги. Структура каталогов вашего приложения теперь должна выглядеть следующим образом:-
build.gradle
-
settings.gradle
-
app/
-
ai-pack-name/build.gradle
-
ai-pack-name/src/main/assets/your-model-directories
-
Добавьте код для загрузки и запуска ваших моделей. То, как вы это сделаете, будет зависеть от способа доставки ваших пакетов ИИ. См. инструкции по установке и быстрому выполнению/по требованию ниже.
[Необязательно] Настройте таргетинг на устройства , чтобы доставлять разные модели на разные устройства.
Создайте пакет приложений Android с помощью Gradle . В созданном пакете приложений каталог корневого уровня теперь включает следующее:
-
ai-pack-name/manifest/AndroidManifest.xml
: настраивает идентификатор и режим доставки пакета AI. -
ai-pack-name/assets/your-model-directories
: Каталог, содержащий все ресурсы, поставляемые как часть пакета AI.
Gradle генерирует манифест для каждого пакета AI и выводит для вас каталог
assets/
.-
Настройка доставки во время установки
Пакеты AI, настроенные для установки во время установки, сразу же доступны при запуске приложения. Используйте Java AssetManager API для доступа к пакетам AI, обслуживаемым в этом режиме:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
Настройте быструю доставку и доставку по требованию
Чтобы загрузить пакеты AI с быстрой доставкой или доставкой по требованию, используйте библиотеку доставки AI Play.
Объявить зависимость от библиотеки доставки Play AI.
В файле build.gradle
вашего приложения объявите зависимость от библиотеки доставки Play AI:
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>
. Эта карта содержит состояние каждого запрошенного пакета ИИ с указанием его имени:
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()
в этом случае приведет к обновлению приложения. После обновления вам нужно будет снова запросить пакеты ИИ.
Ниже приведен пример реализации прослушивателя:
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; }
Настройка таргетинга на устройства
Вы можете следовать инструкциям по настройке таргетинга устройств , чтобы указать устройства или группы устройств, которые должны получать ваши пакеты AI.
Другие методы Play AI Delivery API
Ниже приведены некоторые дополнительные методы API, которые вы можете использовать в своем приложении.
Отменить запрос
Используйте cancel()
чтобы отменить активный запрос пакета AI. Обратите внимание, что этот запрос представляет собой операцию с максимальными усилиями.
Удалить пакет AI
Используйте removePack()
чтобы запланировать удаление пакета AI.
Получите местоположение нескольких пакетов AI.
Используйте getPackLocations()
для массового запроса статуса нескольких пакетов AI, который возвращает карту пакетов AI и их местоположений. Карта, возвращаемая функцией getPackLocations()
содержит запись для каждого пакета, который в данный момент загружен и обновлен.
Таргетинг на устройства
Таргетинг на устройства дает вам более точный контроль над тем, какие части вашего пакета приложений доставляются на определенные устройства. Например, вы можете гарантировать, что большая модель будет доставляться только на устройства с большим объемом оперативной памяти, или вы можете доставлять разные версии модели на разные устройства.
Вы можете настроить таргетинг на такие свойства устройства, как:
- Система на чипе
- Модель устройства
- Оперативная память устройства
- Возможности системы
Обзор необходимых шагов
Чтобы включить таргетинг на устройства, необходимо выполнить следующие действия:
- Определите группы устройств в XML-файле.
- Укажите, какие части вашего пакета должны относиться к каким группам устройств.
- [Необязательно] Проверьте свою конфигурацию локально.
- Загрузите свой пакет (содержащий XML-файл) в Google Play.
Проверьте версию плагина Android Gradle
Чтобы использовать таргетинг на устройства, убедитесь, что версия вашего плагина Android Gradle (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 ( эксклюзивный) : Максимально необходимый объем оперативной памяти (в байтах).
- include_device_ids : модели устройств, которые будут включены в этот селектор (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство соответствует любому идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
- исключенные_device_ids : модели устройств, которые будут исключены из этого селектора (максимум 10 000 идентификаторов устройств на группу) . Это свойство выполняется, если устройство не соответствует ни одному идентификатору устройства в списке.
- build_brand : Производитель устройства.
- build_device : код модели устройства.
require_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, одним из следующих способов:
Проверка отдельных устройств с помощью каталога устройств и поиск производителя и кода модели в местах, как показано в примере ниже (для Google Pixel 4a производителем является «Google», а код модели — «sunfish»).
Загрузка 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 по группам устройств, взяв существующие каталоги пакетов 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 установил бы для этого устройства, если бы эта версия приложения была доступна в тестовой или рабочей версии.
Ознакомьтесь с внутренними инструкциями по совместному использованию приложений .
Пакетный инструмент
Кроме того, вы можете создать APK-файлы с помощью bundletool
(1.18.0 или выше) и загрузить их на свое устройство. Выполните следующие действия, чтобы протестировать свое приложение локально с помощью Bundletool:
Создайте пакет приложений с помощью Android Studio или Bundletool.
Сгенерируйте APK с флагом
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
Подключите устройство и запустите
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 по запросу и Fast-follow не устанавливаются в виде APK-файлов.
Протестируйте и выпустите в Google Play
Мы рекомендуем вам полностью протестировать свое приложение в Google Play с помощью внутренней тестовой версии .
Сделав это, вы можете постепенно выпускать обновление приложения в рабочую среду с помощью поэтапного развертывания .
Пример приложения с использованием Play для искусственного интеллекта на устройстве
Свяжитесь со своим менеджером по работе с партнерами Google Play, чтобы получить доступ к нашему примеру приложения .
В нем показано, как использовать каждый из режимов доставки, а также настройку таргетинга на устройства. Чтобы начать, ознакомьтесь с разделом локального тестирования .
Оставьте отзыв
Участники программы раннего доступа должны сообщать о проблемах и оставлять отзывы. Вы можете обратиться к своему менеджеру по работе с партнерами Google Play или к команде Play for On-device AI.
Связанный контент
Узнайте больше о наборах приложений для Android и прочитайте ссылки на AI Delivery SDK .