Introdução
O Play para IA no dispositivo traz os benefícios dos Android App Bundles e do envio do Google Play para a distribuição de modelos ML personalizados. Assim, você pode melhorar a performance do modelo com menos complexidade do ecossistema sem custo financeiro extra. Ele permite que você publique um único artefato no Google Play contendo seu código, recursos e modelos de ML e escolha entre vários modos de entrega e opções de segmentação.
Vantagens
- Faça upload de um único artefato de publicação no Google Play e delegue a hospedagem, o envio, as atualizações e a segmentação para o Google Play sem custo financeiro extra.
- Envie seus modelos de ML no momento da instalação, em exibição rápida ou on demand.
- A entrega no momento da instalação pode garantir que um modelo muito grande esteja presente quando o app for aberto. Seu modelo será instalado como um APK.
- O envio rápido ocorre automaticamente em segundo plano depois que o app é instalado. Os usuários podem abrir o app antes que o modelo seja completamente transferido. O modelo será transferido para o espaço de armazenamento interno do app.
- O envio sob demanda permite que você solicite o modelo no momento da execução, o que é útil se o modelo for necessário apenas para determinados fluxos de usuários. O modelo será transferido para o espaço de armazenamento interno do app.
- Forneça variantes dos seus modelos de ML segmentadas para dispositivos específicos com base no modelo do dispositivo, nas propriedades do sistema ou na RAM.
- Mantenha as atualizações do app pequenas e otimizadas com o patch automático do Google Play, o que significa que apenas as diferenças nos arquivos precisam ser baixadas.
Considerações
- Ao usar a Play para IA no dispositivo, você concorda com os termos do Contrato de distribuição para desenvolvedores do Google Play e dos Termos de Serviço do kit de desenvolvimento de software da Play Core.
- Os desenvolvedores que participam do programa de acesso antecipado precisam avaliar o Google Play para IA no dispositivo e enviar feedback.
- Os modelos baixados pelo Google Play para a IA no dispositivo só podem ser usados pelo app que fez o download. Os modelos não podem ser oferecidos a outros apps, por exemplo, por uma conexão de serviço.
- Os pacotes de IA individuais podem ter até 1,5 GB, com base nos tamanhos de download compactados. O tamanho máximo cumulativo de qualquer versão do app gerada a partir do pacote é de 4 GB.
- Os apps com mais de 1 GB precisam definir o nível mínimo do SDK como 21 ou mais recente.
- Durante o programa de acesso antecipado, o Play para IA no dispositivo está sujeito a mudanças.
Como usar o Google Play para IA no dispositivo
O Google Play para IA no dispositivo usa pacotes de IA. Você empacota modelos personalizados prontos para distribuição em pacotes de IA no seu pacote de apps. É possível escolher se o pacote de IA será enviado no momento da instalação, em exibição rápida ou on demand.
Ao empacotar pacotes de IA com seu pacote de apps, você pode usar todas as ferramentas de teste e lançamento do Google Play, como faixas de teste e lançamentos em etapas, para gerenciar a distribuição do app com seus modelos personalizados.
Os pacotes de IA são atualizados junto com o binário do app. Se a nova versão do app não fizer alterações em um pacote de IA, o processo de correção automática do Google Play vai garantir que o usuário não precise fazer o download novamente. O Google Play só vai fazer o download do que foi alterado quando atualizar o app.
Os pacotes de IA só contêm modelos. Bibliotecas Java/Kotlin e nativas não são permitidas. Se você precisar enviar bibliotecas ou código para executar seu modelo de ML, mova-o para o módulo base ou um módulo de recurso. É possível configurar o módulo de recurso para que ele tenha as mesmas configurações de download e segmentação que o pacote de IA.
Usar o LiteRT e o MediaPipe com pacotes de IA
É possível usar o LiteRT e o MediaPipe com pacotes de IA. Empacote seu modelo em um pacote de IA e acesse usando as instruções para pacotes de instalação ou para pacotes de acompanhamento rápido e sob demanda.
Leia mais:
- Primeiros passos com o LiteRT
- O app de exemplo mostra como empacotar um modelo do LiteRT em um pacote de IA e fazer o carregamento no momento da execução.
- Há muitos modelos LiteRT pré-treinados que podem ser usados em pacotes de IA para começar.
- Primeiros passos com o MediaPipe
- Para pacotes de entrega rápida e sob demanda, use
AssetCache.java
para carregar seus recursos (por exemplo,
.binarypb
) pelos caminhos dos arquivos. - Para pacotes de instalação, use AndroidAssetUtil.java.
- Para pacotes de entrega rápida e sob demanda, use
AssetCache.java
para carregar seus recursos (por exemplo,
Começar a usar pacotes de IA
De maneira geral, confira como começar a usar o Google Play para IA no dispositivo:
- Informe o ID da sua conta de desenvolvedor do Google Play para participar do EAP.
- Empacotar seus modelos em pacotes de IA no Android App Bundle e especificar como os pacotes de IA precisam ser enviados.
- [Opcional] Se você quiser enviar modelos diferentes para dispositivos diferentes, é possível configurar a segmentação por dispositivo para seus pacotes de IA. Por exemplo, você pode enviar o pacote de IA A para um modelo de dispositivo específico, o pacote de IA B para dispositivos com pelo menos 6 GB de RAM, e todos os outros dispositivos podem receber nenhum modelo.
- [Opcional] Se você estiver usando o envio sob demanda ou rápido, integre a biblioteca Play AI Delivery ao seu app para fazer o download dos pacotes de IA conforme necessário.
- Teste e lance seu pacote de apps no Google Play.
Informe o ID da sua conta de desenvolvedor do Google Play
Como esse recurso está em acesso antecipado, sua conta de desenvolvedor precisa estar na lista de permissões para ter acesso ao Google Play para IA no dispositivo. Confirme os IDs de conta de desenvolvedor do Google Play e os nomes dos pacotes de apps para seu gerente de parcerias do Google Play ou um membro da equipe de IA no dispositivo. Especifique se você vai segmentar seus modelos para dispositivos específicos (esta é a etapa 3 da seção anterior). No momento, estamos convidando alguns parceiros do Google Play para testar esse recurso.
Verificar a versão do Plug-in do Android para Gradle
Para usar pacotes de IA, verifique se a versão do Plug-in do Android para Gradle (AGP) é pelo menos 8.8. Essa versão é empacotada com o Android Studio Ladybug 2.
Extrair o modelo em um pacote de IA
O Android Studio não é necessário para as etapas a seguir.
- No diretório de nível superior do projeto, crie um diretório para o pacote de IA. Esse nome de diretório é usado como o nome do pacote de IA. Os nomes de pacotes de IA precisam começar com uma letra e só podem conter letras, números e sublinhados.
No diretório do pacote de IA, crie um arquivo
build.gradle
e adicione o seguinte código. Especifique o nome do pacote de IA e apenas um tipo de entrega:// 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 ]" } }
No arquivo
build.gradle
do app do projeto, adicione o nome de cada pacote de IA, conforme mostrado abaixo:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
No arquivo
settings.gradle
do projeto, inclua todos os pacotes de IA, conforme mostrado abaixo:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
No pacote de IA, crie um diretório
src/main/assets/
.Coloque seus modelos no diretório
src/main/assets
. Você também pode criar subdiretórios nesse local. A estrutura de diretórios do seu app agora terá a seguinte aparência:build.gradle
settings.gradle
app/
ai-pack-name/build.gradle
ai-pack-name/src/main/assets/your-model-directories
Adicione código para carregar e executar seus modelos. A maneira de fazer isso depende do modo de entrega dos pacotes de IA. Confira as instruções para tempo de instalação e acesso rápido/sob demanda abaixo.
[Opcional] Configure a segmentação por dispositivo para veicular modelos diferentes em dispositivos diferentes.
Crie o Android App Bundle com o Gradle. No pacote de apps gerado, o diretório de nível raiz agora inclui o seguinte:
ai-pack-name/manifest/AndroidManifest.xml
: configura o identificador e o modo de entrega do pacote de IAai-pack-name/assets/your-model-directories
: diretório que contém todos os recursos enviados como parte do pacote de IA
O Gradle gera o manifesto para cada pacote de IA e gera o diretório
assets/
para você.
Configurar o envio no momento da instalação
Os pacotes de IA configurados como tempo de instalação ficam disponíveis imediatamente na inicialização do app. Use a API Java AssetManager para acessar pacotes de IA veiculados neste modo:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
Configurar o envio rápido e sob demanda
Para fazer o download de pacotes de IA com entrega rápida ou sob demanda, use a Biblioteca de Entrega Play AI.
Declarar dependência da biblioteca Play AI Delivery
No arquivo build.gradle
do app, declare uma dependência na biblioteca
Play AI Delivery:
dependencies {
...
implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}
Verificar status
Cada pacote de IA é armazenado em uma pasta separada no armazenamento interno do app. Use o
método
getPackLocation()
para determinar a pasta raiz de um pacote de IA. Esse método retorna os
seguintes valores:
Valor de retorno | Status |
---|---|
Um objeto AiPackLocation válido |
A pasta raiz do pacote de IA está pronta para acesso imediato em assetsPath() |
null |
Pacotes de IA desconhecidos ou indisponíveis |
Receber informações de download sobre pacotes de IA
Use o método
getPackStates()
para determinar o tamanho do download e se o pacote já está sendo
transferido por download.
Task<AiPackStates> getPackStates(List<String> packNames)
getPackStates()
é um método assíncrono que retorna um Task<AiPackStates>
.
O método
packStates()
de um objeto AiPackStates
retorna um Map<String, AiPackState>
. Esse
mapa contém o estado de cada pacote de IA solicitado, codificado pelo nome:
Map<String, AiPackState> AiPackStates#packStates()
A solicitação final é mostrada por:
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; });
Os métodos
AiPackState
abaixo fornecem o tamanho do pacote de IA, o valor transferido por download até o momento (se
solicitado) e o valor já transferido ao app:
Para saber o status de um pacote de IA, use o método
status()
, que retorna o status como um número inteiro que corresponde a um campo de
constante na classe
AiPackStatus
. Um pacote de IA que ainda não foi instalado tem o status
AiPackStatus.NOT_INSTALLED
.
Se uma solicitação falhar, use o método
errorCode()
,
cujo valor de retorno corresponde a um campo de constante na
classe
AiPackErrorCode
.
Instalar
Use o método
fetch()
para fazer o download de um pacote de IA pela primeira vez ou chame a atualização de um
pacote de IA para concluir:
Task<AiPackStates> fetch(List<String> packNames)
Esse método retorna um objeto
AiPackStates
contendo uma lista de pacotes e os estados e tamanhos iniciais de download deles.
Se um pacote de IA solicitado pelo fetch()
já estiver sendo feito, o status do
download será retornado e nenhum download adicional será iniciado.
Monitorar estados de download
Implemente um
AiPackStateUpdateListener
para monitorar o progresso da instalação de pacotes de IA. As atualizações de status são divididas
por pacote para auxiliar no monitoramento do status de pacotes de IA individuais. Você pode
começar a usar os pacotes de IA disponíveis antes que todos os outros downloads da sua solicitação sejam
concluídos.
void registerListener(AiPackStateUpdateListener listener) void unregisterListener(AiPackStateUpdateListener listener)
Downloads grandes
Se o download for maior que 200 MB e o usuário não estiver conectado ao Wi-Fi, o download
não será iniciado até que o usuário conceda explicitamente o consentimento para prosseguir com o
download usando uma conexão de dados móveis. Da mesma forma, se o download for grande e
o usuário perder a conexão ao Wi-Fi, o download será pausado e o consentimento explícito será necessário para
continuar usando uma conexão de dados móveis. Um pacote pausado tem o estado
WAITING_FOR_WIFI
. Para acionar o fluxo da IU para solicitar o consentimento do usuário, use
o
método
showConfirmationDialog()
.
Se o app não chamar esse método, o download será pausado e retomado automaticamente somente quando o usuário voltar a se conectar por Wi-Fi.
Confirmação do usuário necessária
Se um pacote tiver o status REQUIRES_USER_CONFIRMATION
, o download não
vai continuar até que o usuário aceite a caixa de diálogo mostrada com
showConfirmationDialog()
.
Esse status pode ocorrer quando o app não é reconhecido pelo Google Play, por exemplo, se ele
foi instalado por sideload. Chamar
showConfirmationDialog()
neste caso vai atualizar o app. Após a atualização, será necessário
solicitar os pacotes de IA novamente.
Este é um exemplo de implementação de um listener:
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; } } }
Se preferir, use o método
getPackStates()
para ver o status dos downloads atuais.
AiPackStates
contém o progresso do download, o status do download e todos os códigos de erro de falha.
Acessar pacotes de IA
É possível acessar um pacote de IA usando chamadas do sistema de arquivos depois que a solicitação de download
chega ao estado
COMPLETED
. Use o método
getPackLocation()
para acessar a pasta raiz do pacote de IA.
Os pacotes de IA são armazenados no diretório assets
dentro do diretório raiz do pacote de IA.
Você pode acessar o caminho para o diretório assets
usando o método de conveniência
assetsPath()
.
Use o método abaixo para acessar o caminho de um recurso específico:
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; }
Configurar a segmentação por dispositivo
Siga as instruções de segmentação por dispositivo para especificar os dispositivos ou grupos de dispositivos que vão receber seus pacotes de IA.
Outros métodos da API Play AI Delivery
Veja a seguir alguns métodos adicionais de API que podem ser usados no seu app.
Cancelar solicitação
Use
cancel()
para cancelar uma solicitação ativa de pacote de IA. Observe que essa solicitação é uma operação de melhor esforço.
Remover um pacote de IA
Use
removePack()
para programar a remoção de um pacote de IA.
Acessar locais de vários pacotes de IA
Use
getPackLocations()
para consultar o status de vários pacotes de IA em massa. Isso retorna um mapa de pacotes
de IA e os locais deles. O mapa retornado por getPackLocations()
contém uma
entrada para cada pacote que está atualmente salvo e atualizado.
Segmentação por dispositivo
A segmentação por dispositivo oferece um controle mais preciso sobre quais partes do pacote de apps são entregues a dispositivos específicos. Por exemplo, é possível garantir que um modelo grande seja entregue apenas para dispositivos com RAM alta ou enviar diferentes versões de um modelo para dispositivos diferentes.
É possível segmentar propriedades do dispositivo, como:
- System on chip
- Modelo do dispositivo
- RAM do dispositivo
- Recursos do sistema
Visão geral das etapas necessárias
Siga as etapas abaixo para ativar a segmentação por dispositivo:
- Defina os grupos de dispositivos em um arquivo XML.
- Especifique quais partes do pacote devem ser enviadas para quais grupos de dispositivos.
- [Opcional] Teste a configuração localmente.
- Faça upload do pacote (que contém o arquivo XML) para o Google Play.
Verificar a versão do Plug-in do Android para Gradle
Para usar a segmentação por dispositivo, verifique se a versão do Plug-in do Android para Gradle (AGP) é pelo menos 8.10.0-alpha01. Ele é empacotado com o Android Studio Meerkat 2, que está no canário.
Ativar esse recurso no Plug-in do Android para Gradle
A segmentação por dispositivo precisa ser ativada explicitamente no arquivo gradle.properties
:
android.experimental.enableDeviceTargetingConfigApi=true
Criar um arquivo XML de configuração de segmentação por dispositivo
O arquivo de configuração de segmentação por dispositivo é um arquivo XML em que você define seus
grupos de dispositivos personalizados. Por exemplo, você pode definir um grupo de dispositivos chamado
qti_v79
que contém todos os dispositivos com o sistema on-chip 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>
Um grupo de dispositivos é composto por até cinco seletores de dispositivo. Um dispositivo é incluído em um grupo se ele atende a qualquer um dos seletores.
Um seletor de dispositivo pode ter uma ou mais propriedades de dispositivo. Um dispositivo é selecionado se corresponder a todas as propriedades do dispositivo do seletor.
Se um dispositivo corresponder a vários grupos, será enviado o conteúdo do grupo definido primeiro no arquivo XML. A ordem em que você define grupos no arquivo XML é a ordem de prioridade.
Se um dispositivo não corresponder a nenhum grupo, ele vai receber o grupo padrão "Outros". Esse grupo é gerado automaticamente e não precisa ser definido explicitamente.
Propriedades do dispositivo disponíveis
- device_ram: requisitos de RAM do dispositivo
- min_bytes (inclusivo): mínimo de RAM necessária (em bytes).
- max_bytes (exclusivo): máximo de RAM necessária (em bytes).
- included_device_ids: os modelos de dispositivo que serão incluídos nesse seletor
(máximo de 10.000 device_ids por grupo). Essa propriedade é atendida se o
dispositivo corresponder a qualquer device_id na lista.
- build_brand: fabricante do dispositivo.
- build_device: código do modelo do dispositivo.
- excluded_device_ids: modelos de dispositivo a serem excluídos neste seletor
(máximo de 10.000 device_ids por grupo). Essa propriedade é atendida se o
dispositivo não corresponder a nenhum device_id na lista.
- build_brand: fabricante do dispositivo.
- build_device: código do modelo do dispositivo.
required_system_features: recursos que um dispositivo precisa ter para ser incluído por esse seletor (máximo de 100 recursos por grupo). Um dispositivo precisa ter todos os recursos do sistema nessa lista para atender a essa propriedade.
Referência de recursos do sistema
- name: um recurso do sistema.
forbidden_system_features: recursos que um dispositivo não pode ter para ser incluído por esse seletor (máximo de 100 recursos por grupo). Se um dispositivo tiver algum dos recursos do sistema nesta lista, ele não atenderá a essa propriedade.
Referência de recursos do sistema
- name: um recurso do sistema.
system-on-chip: system on chips a serem incluídos neste seletor. Um dispositivo precisa ter qualquer chip dessa lista para atender a essa propriedade.
- manufacturer: fabricante do system on chip
- model: modelo do sistema em chip
Confira um exemplo que mostra todas as propriedades possíveis do dispositivo:
<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>
Códigos oficiais do fabricante e do modelo do dispositivo
Para encontrar a formatação correta do fabricante do dispositivo e o código do modelo, use o catálogo de dispositivos no Google Play Console de uma das seguintes maneiras:
Inspeção dos dispositivos individuais usando o catálogo de dispositivos e encontrando o código do fabricante e do modelo nos locais, conforme mostrado no exemplo abaixo. No caso de um Google Pixel 4a, o fabricante é "Google" e o código do modelo é "sunfish".
Faça o download de um CSV dos dispositivos com suporte e use o código do fabricante e do modelo para os campos build_brand e build_device, respectivamente.
Incluir o arquivo de configuração de segmentação por dispositivo no pacote do app
Adicione o seguinte ao arquivo build.gradle
do módulo principal:
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
é o caminho do arquivo de configuração em relação ao
módulo principal. Isso garante que o arquivo de configuração seja empacotado com o
pacote de apps.
A cláusula deviceGroup
garante que os APKs gerados no pacote sejam
divididos por grupos de dispositivos.
Usar a segmentação por dispositivo nos seus pacotes de IA
Para manter o tamanho otimizado nos dispositivos, envie apenas os modelos grandes para dispositivos que podem executá-los.
Divida seus pacotes de IA por grupos de dispositivos usando os diretórios de pacotes de IA existentes criados na última etapa e postfixando as pastas adequadas (conforme descrito abaixo) com #group_myCustomGroup1, #group_myCustomGroup2 etc. Ao usar os pacotes de IA no seu app, não será necessário endereçar pastas por postfixo. Em outras palavras, o postfixo é removido automaticamente durante o processo de build.
Após a etapa anterior, a aparência do código será esta:
...
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup1/
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup2/
...
Neste exemplo, você referenciaria ai-pack-name/assets/image-classifier/
sem sufixos.
Os dispositivos em myCustomGroup1
vão receber todos os recursos em
image-classifier#group_myCustomGroup1/
, enquanto os dispositivos em myCustomGroup2
vão
receber todos os recursos em image-classifier#group_myCustomGroup2/
.
Os dispositivos que não pertencem a myCustomGroup1
ou myCustomGroup2
vão
receber um pacote ai-pack-name
vazio.
Isso acontece porque os dispositivos que não correspondem a nenhum grupo recebem a
variante padrão do pacote de IA. Isso inclui tudo o que não está em um
diretório com um #group_suffix
.
Depois de fazer o download do pacote de IA, você pode verificar se o modelo está presente usando o AssetManager para pacotes de instalação ou o AiPackManager para pacotes de acompanhamento rápido e sob demanda. Exemplos para fazer isso são mostrados para todos os modos de entrega no app de exemplo.
Usar a segmentação por dispositivo nos módulos de recursos
Também é possível usar a segmentação por dispositivo para módulos de recursos. Em vez de subdividir módulos de recursos por grupo de dispositivos, especifique se o módulo inteiro precisa ser enviado com base na associação ao grupo de dispositivos.
Para enviar um módulo de recurso a dispositivos que pertencem a myCustomGroup1
ou
myCustomGroup2
, modifique o 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>
Testar localmente
Antes de criar uma versão para o novo pacote, você pode testar localmente com o Compartilhamento interno de apps ou o Bundletool.
Compartilhamento interno de apps
O Compartilhamento interno de apps permite usar um pacote de apps para gerar rapidamente um URL que pode ser tocado em um dispositivo local para instalar exatamente o que o Google Play instalaria para esse dispositivo se essa versão do app estivesse ativa em uma faixa de teste ou de produção.
Confira as instruções sobre o compartilhamento interno de apps.
Bundletool
Como alternativa, é possível gerar APKs usando o
bundletool
(1.18.0 ou mais recente) e fazer o sideload
deles no dispositivo. Siga estas etapas para testar o app localmente usando o
bundletool:
Crie o pacote de apps com o Android Studio ou o bundletool.
Gere APKs com a sinalização
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
Conecte um dispositivo e execute
bundletool
para transferir os APKs por sideload:# 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
Limitações dos testes locais com o bundletool
Confira a seguir as limitações dos testes locais com o bundletool:
- Os pacotes
fast-follow
se comportam como pacoteson-demand
. Ou seja, eles não serão buscados automaticamente quando o app for transferido por sideload. Os desenvolvedores precisam solicitá-los manualmente quando o app for iniciado. Isso não exige nenhuma mudança no código do app. - Os pacotes são buscados do armazenamento externo em vez do Play. Por isso, não é possível testar como o código se comporta em caso de erros de rede.
- Os testes locais não abrangem o cenário "Aguardando Wi-Fi".
- Atualizações não são compatíveis. Antes de instalar uma nova versão do seu build, desinstale manualmente a versão anterior.
Verificar se os APKs corretos estão sendo instalados
Use o método a seguir para garantir que apenas os APKs corretos sejam instalados no dispositivo
adb shell pm path {packageName}
Você verá um código como este:
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
Nesta lista, você só vai encontrar APKs feitos de módulos de recursos e pacotes de IA ativados no momento da instalação. Os pacotes de IA sob demanda e de acompanhamento rápido não são instalados como APKs.
Testar e lançar no Google Play
Recomendamos que você teste seu app do início ao fim no Google Play com uma faixa de teste interno.
Depois disso, você pode lançar a atualização do app de forma incremental para a produção com lançamentos graduais.
Exemplo de app que usa o Google Play para IA no dispositivo
Entre em contato com seu gerente de parcerias do Google Play para ter acesso ao app de exemplo.
Ele demonstra como usar cada um dos modos de entrega, bem como a configuração de segmentação por dispositivo. Consulte a seção Testes locais para começar.
Enviar feedback
Os participantes do programa de acesso antecipado precisam informar problemas e enviar feedback. Entre em contato com seu gerente de parcerias do Google Play ou com a equipe de IA no dispositivo do Google Play.
Conteúdo relacionado
Saiba mais sobre os Android App Bundles e leia as referências do SDK de entrega de IA.