Introduzione
Play for On-device AI offre i vantaggi degli Android App Bundle e della distribuzione di Google Play alla distribuzione di modelli ML personalizzati, in modo da migliorare le prestazioni dei modelli con una minore complessità dell'ecosistema dei dispositivi senza costi aggiuntivi. Consente di pubblicare un singolo artefatto su Play contenente codice, asset e modelli ML e di scegliere tra diverse modalità di pubblicazione e opzioni di targeting.
Vantaggi
- Carica un singolo artefatto di pubblicazione su Google Play e delega a Play l'hosting, la distribuzione, gli aggiornamenti e il targeting senza costi aggiuntivi.
- Pubblica i tuoi modelli ML al momento dell'installazione, in rapida successione o on demand.
- La distribuzione in fase di installazione può garantire che un modello molto grande sia presente quando l'app viene aperta. Il modello verrà installato come APK.
- La pubblicazione rapida successiva avviene automaticamente in background dopo l'installazione dell'app. Gli utenti potrebbero aprire la tua app prima che il modello sia stato scaricato completamente. Il modello verrà scaricato nello spazio di archiviazione interno dell'app.
- La pubblicazione on demand ti consente di richiedere il modello in fase di runtime, il che è utile se il modello è necessario solo per determinati flussi utente. Il modello verrà scaricato nello spazio di archiviazione interno dell'app.
- Pubblica varianti dei tuoi modelli ML destinate a dispositivi specifici in base al modello di dispositivo, alle proprietà di sistema o alla RAM.
- Mantieni gli aggiornamenti delle app piccoli e ottimizzati con l'applicazione automatica di patch di Play, il che significa che devono essere scaricate solo le differenze nei file.
Considerazioni
- Utilizzando Play per l'AI on-device, accetti i termini del Contratto di distribuzione per gli sviluppatori di Google Play e dei Termini di servizio del kit di sviluppo software Play Core.
- I modelli scaricati da Play per l'AI on-device devono essere utilizzati solo dalle tue app. I modelli non devono essere offerti ad altre app.
- I singoli pacchetti di AI possono avere una dimensione massima di 1,5 GB, in base alle dimensioni di download compresse. La dimensione cumulativa massima dell'app di qualsiasi versione generata dal tuo app bundle è 4 GB.
- Le app di dimensioni superiori a 1 GB devono impostare il livello SDK minimo su 21 o superiore.
Come utilizzare Play per l'AI on-device
Play per l'AI on-device utilizza i pacchetti AI. Puoi raggruppare i modelli personalizzati pronti per la distribuzione nei pacchetti AI nel tuo app bundle. Puoi scegliere se il pacchetto AI deve essere pubblicato al momento dell'installazione, in modalità rapida successiva o on demand.
Se includi i pacchetti AI nell'app bundle, puoi utilizzare tutti gli strumenti di test e rilascio esistenti di Play, come i gruppi di test e le implementazioni in più fasi, per gestire la distribuzione dell'app con i tuoi modelli personalizzati.
I pacchetti AI vengono aggiornati insieme al binario dell'app. Se la nuova release dell'app non apporta modifiche a un pacchetto AI, la procedura di patching automatico di Play garantirà che l'utente non debba scaricarlo di nuovo. Google Play scaricherà solo le modifiche quando aggiornerà l'app.
I pacchetti AI contengono solo modelli. Le librerie Java/Kotlin e native non sono consentite. Se devi spedire librerie o codice per eseguire il modello ML, spostali nel modulo base o in un modulo di funzionalità. Puoi configurare il modulo delle funzionalità in modo che abbia le stesse impostazioni di download e targeting del pacchetto AI.
Utilizzare LiteRT e MediaPipe con i pacchetti AI
Puoi utilizzare LiteRT e MediaPipe con i pacchetti AI. Pacchettizza il modello in un pacchetto AI e poi accedi seguendo le istruzioni per i pacchetti al momento dell'installazione o per i pacchetti rapidi successivi e on demand.
Per approfondire:
- Inizia a utilizzare LiteRT
- L'app di esempio mostra come puoi creare un pacchetto di un modello LiteRT in un pacchetto AI e caricarlo in fase di runtime.
- Esistono molti modelli LiteRT preaddestrati che puoi utilizzare nei pacchetti AI per iniziare.
- Guida introduttiva a MediaPipe
- Per i pacchetti di aggiornamenti rapidi e on demand, puoi utilizzare
AssetCache.java
per caricare gli asset (ad es.
.binarypb
) in base ai percorsi dei file. - Per i pacchetti installati, puoi utilizzare AndroidAssetUtil.java.
- Per i pacchetti di aggiornamenti rapidi e on demand, puoi utilizzare
AssetCache.java
per caricare gli asset (ad es.
Inizia a utilizzare i pacchetti AI
A livello generale, ecco come iniziare a utilizzare Play per l'AI on-device:
- Pacchettizza i modelli in pacchetti di AI nell'Android App Bundle e specifica come devono essere distribuiti i pacchetti di AI.
- [Facoltativo] Se vuoi pubblicare modelli diversi su dispositivi diversi, puoi configurare il targeting per dispositivo per i tuoi pacchetti AI. Ad esempio, potresti distribuire il pacchetto AI A a un modello di dispositivo specifico, il pacchetto AI B ai dispositivi con almeno 6 GB di RAM e tutti gli altri dispositivi potrebbero non ricevere alcun modello.
- [Facoltativo] Se utilizzi la pubblicazione on demand o fast-follow, integra la libreria Play AI Delivery nella tua app per scaricare i pacchetti AI in base alle necessità.
- Testa e rilascia l'app bundle su Google Play.
Controllare la versione del plug-in Android per Gradle
Per utilizzare i pacchetti AI, assicurati che la versione del plug-in Android per Gradle (AGP) sia almeno 8.8. Questa versione è inclusa in Android Studio Ladybug 2.
Estrai il modello in un pacchetto AI
Android Studio non è necessario per i passaggi successivi.
- Nella directory di primo livello del progetto, crea una directory per il pacchetto AI. Questo nome di directory viene utilizzato come nome del pacchetto AI. I nomi dei pacchetti AI devono iniziare con una lettera e possono contenere solo lettere, numeri e trattini bassi.
Nella directory del pacchetto AI, crea un file
build.gradle
e aggiungi il seguente codice. Assicurati di specificare il nome del pacchetto AI e un solo tipo di consegna:// 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 ]" } }
Nel file
build.gradle
dell'app del progetto, aggiungi il nome di ogni pacchetto AI nel tuo progetto come mostrato di seguito:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
Nel file
settings.gradle
del progetto, includi tutti i pacchetti AI nel tuo progetto come mostrato di seguito:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
All'interno del pacchetto AI, crea una directory
src/main/assets/
.Inserisci i tuoi modelli nella directory
src/main/assets
. Qui puoi anche creare sottodirectory. La struttura di directory della tua app dovrebbe ora avere il seguente aspetto:build.gradle
settings.gradle
app/
ai-pack-name/build.gradle
ai-pack-name/src/main/assets/your-model-directories
Aggiungi il codice per caricare ed eseguire i modelli. La modalità dipende dalla modalità di invio dei pacchetti di IA. Consulta le istruzioni per install-time e fast-follow/on-demand di seguito.
[Facoltativo] Configura il targeting per dispositivo per pubblicare modelli diversi su dispositivi diversi.
Crea l'Android App Bundle con Gradle. Nell'app bundle generato, la directory di primo livello ora include quanto segue:
ai-pack-name/manifest/AndroidManifest.xml
: configura l'identificatore e la modalità di pubblicazione del pacchetto AIai-pack-name/assets/your-model-directories
: Directory che contiene tutti gli asset forniti come parte del pacchetto AI
Gradle genera il manifest per ogni pacchetto AI e restituisce la directory
assets/
per te.
Configurare la distribuzione al momento dell'installazione
I pacchetti AI configurati come install-time sono immediatamente disponibili all'avvio dell'app. Utilizza l'API Java AssetManager per accedere ai pacchetti AI pubblicati in questa modalità:
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("model-name");
Configurare la pubblicazione rapida successiva e on demand
Per scaricare i pacchetti AI con la distribuzione rapida o on demand, utilizza la libreria Play AI Delivery.
Dichiarare la dipendenza dalla libreria Play AI Delivery
Nel file build.gradle
della tua app, dichiara una dipendenza dalla libreria Play AI Delivery:
dependencies {
...
implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}
Verifica lo stato
Ogni pacchetto AI viene archiviato in una cartella separata nella memoria interna dell'app. Utilizza
il metodo
getPackLocation()
per determinare la cartella principale di un pacchetto AI. Questo metodo restituisce i
seguenti valori:
Valore restituito | Stato |
---|---|
Un oggetto AiPackLocation valido |
La cartella principale del pacchetto AI è pronta per l'accesso immediato all'indirizzo assetsPath() |
null |
Pacchetto AI sconosciuto o pacchetti AI non disponibili |
Ottenere informazioni sul download dei pacchetti di AI
Utilizza il metodo
getPackStates()
per determinare le dimensioni del download e se il pacchetto è già
in fase di download.
Task<AiPackStates> getPackStates(List<String> packNames)
getPackStates()
è un metodo asincrono che restituisce un Task<AiPackStates>
.
Il metodo
packStates()
di un oggetto AiPackStates
restituisce un Map<String, AiPackState>
. Questa
mappa contiene lo stato di ogni pacchetto AI richiesto, identificato dal nome:
Map<String, AiPackState> AiPackStates#packStates()
La richiesta finale è mostrata di seguito:
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; });
I seguenti
AiPackState
metodi forniscono le dimensioni del pacchetto AI, l'importo scaricato finora (se
richiesto) e l'importo già trasferito all'app:
Per ottenere lo stato di un pacchetto AI, utilizza il metodo
status()
, che restituisce lo stato come numero intero corrispondente a un campo costante
nella classe
AiPackStatus
. Un pacchetto AI non ancora installato ha lo stato
AiPackStatus.NOT_INSTALLED
.
Se una richiesta non va a buon fine, utilizza il metodo
errorCode()
, il cui valore restituito corrisponde a un campo costante nella
classe AiPackErrorCode
.
Installa
Utilizza il metodo
fetch()
per scaricare un pacchetto AI per la prima volta o chiamare l'aggiornamento di un pacchetto AI
per completare:
Task<AiPackStates> fetch(List<String> packNames)
Questo metodo restituisce un oggetto
AiPackStates
contenente un elenco di pacchetti e le relative dimensioni e stati di download iniziali.
Se un pacchetto AI richiesto tramite fetch()
è già in fase di download, viene restituito lo stato del download e non viene avviato alcun download aggiuntivo.
Monitorare gli stati di download
Devi implementare un
AiPackStateUpdateListener
per monitorare l'avanzamento dell'installazione dei pacchetti AI. Gli aggiornamenti di stato sono suddivisi
per pacchetto per supportare il monitoraggio dello stato dei singoli pacchetti di AI. Puoi
iniziare a utilizzare i pacchetti AI disponibili prima che tutti gli altri download per la tua richiesta siano
completati.
void registerListener(AiPackStateUpdateListener listener) void unregisterListener(AiPackStateUpdateListener listener)
Download di grandi dimensioni
Se il download supera i 200 MB e l'utente non è connesso al Wi-Fi, il download
non viene avviato finché l'utente non dà il proprio consenso esplicito a procedere con il
download utilizzando una connessione dati mobili. Allo stesso modo, se il download è di grandi dimensioni e
l'utente perde la connessione Wi-Fi, il download viene messo in pausa ed è necessario il consenso esplicito per
procedere utilizzando una connessione dati mobili. Un pacchetto in pausa ha lo stato
WAITING_FOR_WIFI
. Per attivare il flusso dell'interfaccia utente per chiedere il consenso all'utente, utilizza il metodo
showConfirmationDialog()
.
Tieni presente che se l'app non chiama questo metodo, il download viene messo in pausa e riprenderà automaticamente solo quando l'utente si riconnetterà a una rete Wi-Fi.
Conferma utente obbligatoria
Se un pacchetto ha lo stato REQUIRES_USER_CONFIRMATION
, il download non
procede finché l'utente non accetta la finestra di dialogo visualizzata con
showConfirmationDialog()
.
Questo stato può verificarsi quando l'app non viene riconosciuta da Google Play, ad esempio se è stata installata tramite sideload. Tieni presente che la chiamata
showConfirmationDialog()
in questo caso causerà l'aggiornamento dell'app. Dopo l'aggiornamento, dovrai
richiedere nuovamente i pacchetti AI.
Di seguito è riportato un esempio di implementazione di un 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; } } }
In alternativa, puoi utilizzare il metodo
getPackStates()
per ottenere lo stato dei download correnti.
AiPackStates
contiene l'avanzamento del download, lo stato del download ed eventuali codici di errore.
Accedere ai pacchetti AI
Puoi accedere a un pacchetto AI utilizzando le chiamate al file system dopo che la richiesta di download
raggiunge lo stato
COMPLETED
. Utilizza il metodo
getPackLocation()
per ottenere la cartella principale del pacchetto AI.
I pacchetti AI vengono memorizzati nella directory assets
all'interno della directory principale del pacchetto AI.
Puoi ottenere il percorso della directory assets
utilizzando il metodo pratico
assetsPath()
.
Per ottenere il percorso di un asset specifico, utilizza il seguente metodo:
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; }
Configurare il targeting per dispositivo
Puoi seguire le istruzioni per il targeting per dispositivo per specificare i dispositivi o i gruppi di dispositivi che devono ricevere i tuoi pacchetti di AI.
Altri metodi dell'API Play AI Delivery
Di seguito sono riportati alcuni metodi API aggiuntivi che potresti voler utilizzare nella tua app.
Annulla richiesta
Utilizza
cancel()
per annullare una richiesta di pacchetto AI attivo. Tieni presente che questa richiesta è un'operazione
di tipo best effort.
Rimuovere un pacchetto AI
Utilizza
removePack()
per pianificare la rimozione di un pacchetto AI.
Ottenere le posizioni di più pacchetti AI
Utilizza
getPackLocations()
per eseguire query sullo stato di più pacchetti AI collettivamente, restituendo una mappa dei pacchetti AI e delle relative posizioni. La mappa restituita da getPackLocations()
contiene una voce per ogni pacchetto attualmente scaricato e aggiornato.
Targeting per dispositivo
Il targeting per dispositivo ti offre un controllo più preciso sulle parti del bundle dell'app che vengono distribuite a dispositivi specifici. Ad esempio, potresti assicurarti che un modello di grandi dimensioni venga pubblicato solo sui dispositivi con RAM elevata oppure potresti pubblicare versioni diverse di un modello su dispositivi diversi.
Puoi scegliere come target le proprietà del dispositivo, ad esempio:
- System on chip
- Modello del dispositivo
- RAM del dispositivo
- Funzionalità di sistema
Panoramica dei passaggi richiesti
Per attivare il targeting per dispositivo:
- Definisci i gruppi di dispositivi in un file XML.
- Specifica quali parti del bundle devono essere inviate a quali gruppi di dispositivi.
- [Facoltativo] Testa la configurazione localmente.
- Carica il bundle (contenente il file XML) su Google Play.
Controllare la versione del plug-in Android per Gradle
Per utilizzare il targeting per dispositivo, assicurati che la versione del plug-in Android per Gradle (AGP) sia almeno 8.10.0. È incluso in Android Studio (Meerkat 2 e versioni successive). Scarica l'ultima versione stabile di Android Studio.
Attiva questa funzionalità nel plug-in Android per Gradle
Il targeting per dispositivo deve essere attivato in modo esplicito nel file gradle.properties
:
android.experimental.enableDeviceTargetingConfigApi=true
Crea un file XML di configurazione del targeting per dispositivo
Il file di configurazione del targeting dei dispositivi è un file XML in cui definisci i tuoi
gruppi di dispositivi personalizzati. Ad esempio, potresti definire un gruppo di dispositivi chiamato
qti_v79
che contenga tutti i dispositivi con il system 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>
Un gruppo di dispositivi è composto da un massimo di 5 selettori di dispositivi. Un dispositivo è incluso in un gruppo di dispositivi se soddisfa uno qualsiasi dei relativi selettori.
Un selettore di dispositivi può avere una o più proprietà del dispositivo. Un dispositivo viene selezionato se corrisponde a tutte le proprietà del dispositivo del selettore.
Se un dispositivo corrisponde a più gruppi, verrà visualizzato il contenuto del gruppo definito per primo nel file XML. L'ordine in cui definisci i gruppi nel file XML è l'ordine di priorità.
Se un dispositivo non corrisponde a nessun gruppo, riceverà il gruppo "altro" predefinito. Questo gruppo viene generato automaticamente e non deve essere definito in modo esplicito.
Proprietà del dispositivo disponibili
- device_ram: requisiti di RAM del dispositivo
- min_bytes (inclusivo): RAM minima richiesta (in byte)
- max_bytes (esclusivo): RAM massima richiesta (in byte)
- included_device_ids: modelli di dispositivo da includere in questo selettore
(massimo 10.000 device_id per gruppo). Questa proprietà è soddisfatta se il
dispositivo corrisponde a qualsiasi device_id nell'elenco.
- build_brand: produttore del dispositivo
- build_device: codice del modello di dispositivo
- excluded_device_ids: modelli di dispositivi da escludere in questo selettore
(massimo 10.000 device_id per gruppo). Questa proprietà viene soddisfatta se
il dispositivo non corrisponde a nessun device_id nell'elenco.
- build_brand: produttore del dispositivo
- build_device: codice del modello di dispositivo
required_system_features: funzionalità che un dispositivo deve avere per essere incluso in questo selettore (massimo 100 funzionalità per gruppo). Un dispositivo deve disporre di tutte le funzionalità di sistema in questo elenco per soddisfare questa proprietà.
Riferimento alle funzionalità di sistema
- name: Una funzionalità di sistema
forbidden_system_features: funzionalità che un dispositivo non deve avere per essere incluso in questo selettore (massimo 100 funzionalità per gruppo). Se un dispositivo dispone di una delle funzionalità di sistema in questo elenco, non soddisfa questa proprietà.
Riferimento alle funzionalità di sistema
- name: Una funzionalità di sistema
system on chip: system on chip da includere in questo selettore. Un dispositivo deve avere uno dei chip di questo elenco per soddisfare questa proprietà.
- manufacturer: System on chip manufacturer
- model: modello di system on chip
Ecco un esempio che mostra tutte le proprietà del dispositivo possibili:
<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>
Codici ufficiali del produttore e del modello del dispositivo
Puoi trovare la formattazione corretta per il produttore del dispositivo e il codice modello utilizzando il catalogo dei dispositivi su Google Play Console, in uno dei seguenti modi:
Ispezionando i singoli dispositivi utilizzando il catalogo dei dispositivi e trovando il codice del produttore e del modello nelle posizioni mostrate nell'esempio seguente (per Google Pixel 4a, il produttore è"Google" e il codice del modello è"sunfish").
Scaricando un file CSV dei dispositivi supportati e utilizzando Manufacturer e Model Code per i campi build_brand e build_device, rispettivamente.
Includi il file di configurazione del targeting per dispositivo nell'app bundle
Aggiungi quanto segue al file build.gradle
del modulo principale:
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
è il percorso del file di configurazione relativo al modulo principale. In questo modo, il file di configurazione viene incluso nel tuo
app bundle.
La clausola deviceGroup
garantisce che gli APK generati dal tuo bundle siano
divisi per gruppi di dispositivi.
Utilizzare il targeting per dispositivo per i pacchetti di AI
Puoi mantenere le dimensioni ottimizzate sui dispositivi distribuendo i modelli di grandi dimensioni solo ai dispositivi in grado di eseguirli.
Suddividi i pacchetti AI per gruppi di dispositivi prendendo le directory dei pacchetti AI esistenti create nell'ultimo passaggio e aggiungendo il suffisso alle cartelle appropriate (come descritto di seguito) con #group_myCustomGroup1, #group_myCustomGroup2 e così via. Quando utilizzi i pacchetti AI nella tua app, non dovrai indirizzare le cartelle per suffisso (in altre parole, il suffisso viene rimosso automaticamente durante il processo di build).
Dopo il passaggio precedente, il codice potrebbe avere il seguente aspetto:
...
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup1/
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup2/
...
In questo esempio, devi fare riferimento a ai-pack-name/assets/image-classifier/
senza suffissi.
I dispositivi in myCustomGroup1
riceveranno tutti gli asset in
image-classifier#group_myCustomGroup1/
, mentre i dispositivi in myCustomGroup2
riceveranno
tutti gli asset in image-classifier#group_myCustomGroup2/
.
I dispositivi che non appartengono a myCustomGroup1
o myCustomGroup2
riceveranno
un pacchetto ai-pack-name
vuoto.
Questo perché i dispositivi che non corrispondono a nessun gruppo di dispositivi riceveranno la
variante predefinita del pacchetto AI. Sono inclusi tutti gli elementi che non si trovano in una
directory con un #group_suffix
.
Dopo aver scaricato il pacchetto AI, puoi verificare se il tuo modello è presente utilizzando AssetManager per i pacchetti al momento dell'installazione o AiPackManager per i pacchetti fast-follow e on demand. Gli esempi per farlo sono mostrati per tutte le modalità di pubblicazione nell'app di esempio.
Utilizzare il targeting per dispositivo per i moduli delle funzionalità
Puoi anche utilizzare il targeting per dispositivo per i moduli delle funzionalità. Anziché suddividere i moduli delle funzionalità per gruppo di dispositivi, specifichi se l'intero modulo deve essere distribuito in base all'appartenenza al gruppo di dispositivi.
Per pubblicare un modulo delle funzionalità sui dispositivi che appartengono a myCustomGroup1
o
myCustomGroup2
, modifica il relativo 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>
Testare localmente
Prima di creare una release per il nuovo bundle, puoi eseguire test in locale con la condivisione interna delle app o Bundletool.
Condivisione interna delle app
La condivisione interna delle app ti consente di utilizzare un app bundle per generare rapidamente un URL che puoi toccare su un dispositivo locale per installare esattamente ciò che Google Play installerebbe per quel dispositivo se quella versione dell'app fosse pubblicata in un canale di test o di produzione.
Consulta le istruzioni per la condivisione interna delle app.
Bundletool
In alternativa, puoi generare APK utilizzando
bundletool
(1.18.0 o versioni successive) e caricarli
sul tuo dispositivo. Segui questi passaggi per testare la tua app localmente utilizzando
bundletool:
Crea il bundle dell'app con Android Studio o bundletool.
Genera APK con il flag
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
Collega un dispositivo ed esegui
bundletool
per caricare lateralmente gli 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
Limitazioni dei test locali con bundletool
Di seguito sono riportate le limitazioni dei test locali con bundletool:
- I
fast-follow
si comportano come ion-demand
. ovvero non verranno recuperati automaticamente quando l'app viene caricata in sideload. Gli sviluppatori devono richiederli manualmente all'avvio dell'app. Questa operazione non richiede modifiche al codice dell'app. - I pacchetti vengono recuperati dalla memoria esterna anziché da Play, quindi non puoi testare il comportamento del codice in caso di errori di rete.
- Il test locale non copre lo scenario di attesa del Wi-Fi.
- Gli aggiornamenti non sono supportati. Prima di installare una nuova versione della build, disinstalla manualmente la versione precedente.
Verifica che vengano installati gli APK corretti
Utilizza il seguente metodo per assicurarti che sul dispositivo vengano installati solo gli APK corretti
adb shell pm path {packageName}
Dovresti vedere qualcosa di simile a questo:
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
Tieni presente che in questo elenco vedrai solo gli APK creati da moduli delle funzionalità e pacchetti AI al momento dell'installazione. I pacchetti AI on demand e fast-follow non vengono installati come APK.
Testare e rilasciare su Google Play
Ti consigliamo di testare l'app end-to-end su Google Play con un gruppo di test interno.
Una volta fatto, puoi rilasciare in modo incrementale l'aggiornamento dell'app in produzione con le implementazioni graduali.
App di esempio che utilizza Play per l'AI on-device
Scarica l'app di esempio.
Mostra come utilizzare ciascuna modalità di pubblicazione e la configurazione del targeting per dispositivo. Per iniziare, consulta la sezione Test locali.
Contenuti correlati
Scopri di più sugli Android App Bundle e leggi i riferimenti per l'SDK AI Delivery.