Località di installazione dell'app

A partire dal livello API 8, puoi consentire l'installazione dell'applicazione sulla memoria esterna (ad esempio, la scheda SD del dispositivo). Questa è una funzionalità facoltativa che puoi dichiarare per la tua applicazione con l'attributo manifest android:installLocation. Se non dichiari questo attributo, l'applicazione verrà installata solo nella memoria interna e non potrà essere spostata nella memoria esterna.

Per consentire al sistema di installare l'applicazione nell'unità di archiviazione esterna, modifica il file manifest in modo da includere l'attributo android:installLocation nell'elemento <manifest>, specificando il valore "preferExternal" o "auto". Ad esempio:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >

Se dichiari "preferExternal", richiedi che la tua applicazione venga installata sulla memoria esterna, ma il sistema non garantisce che la tua applicazione verrà installata nella memoria esterna. Se la memoria esterna è piena, il sistema la installerà nella memoria interna. L'utente può anche spostare l'applicazione tra le due posizioni.

Se dichiari "auto", indichi che la tua applicazione potrebbe essere installata sulla memoria esterna, ma non hai una preferenza sul percorso di installazione. Il sistema deciderà dove installare la tua applicazione in base a diversi fattori. L'utente può anche spostare la tua applicazione tra le due posizioni.

Quando l'applicazione è installata sulla memoria esterna:

  • Non c'è alcun effetto sulle prestazioni dell'applicazione purché l'unità di archiviazione esterna sia montata sul dispositivo.
  • Il file .apk viene salvato nella memoria esterna, ma tutti i dati utente privati, i database, i file .dex ottimizzati e il codice nativo estratto vengono salvati nella memoria interna del dispositivo.
  • Il container univoco in cui è archiviata la tua applicazione è criptato con una chiave generata in modo casuale che può essere decriptata solo dal dispositivo da cui è stata installata in origine. Di conseguenza, un'applicazione installata su una scheda SD funziona su un solo dispositivo.
  • L'utente può spostare l'applicazione nella memoria interna tramite le impostazioni di sistema.

Avviso: quando l'utente consente all'archivio di massa USB di condividere file con un computer o smonta la scheda SD tramite le impostazioni di sistema, l'unità di archiviazione esterna viene smontata dal dispositivo e tutte le applicazioni in esecuzione sulla memoria esterna vengono immediatamente interrotte.

Compatibilità con le versioni precedenti

L'installazione dell'applicazione sull'unità di archiviazione esterna è disponibile soltanto sui dispositivi con livello API 8 (Android 2.2) o versioni successive. Le applicazioni esistenti create prima del livello API 8 verranno sempre installate nella memoria interna e non potranno essere spostate nell'unità di archiviazione esterna (nemmeno sui dispositivi con livello API 8). Tuttavia, se la tua applicazione è progettata per supportare un livello API inferiore a 8, puoi scegliere di supportare questa funzionalità per i dispositivi con livello API 8 o successivo ed essere comunque compatibile con i dispositivi che utilizzano un livello API inferiore a 8.

Per consentire l'installazione su unità di archiviazione esterna e mantenere la compatibilità con versioni precedenti al Livello API 8:

  1. Includi l'attributo android:installLocation con un valore di "auto" o "preferExternal" nell'elemento <manifest>.
  2. Lascia invariato l'attributo android:minSdkVersion (un valore inferiore a "8") e assicurati che il codice dell'applicazione utilizzi solo API compatibili con il livello in questione.
  3. Per compilare l'applicazione, modifica il target di build impostandolo sul livello API 8. Questo è necessario perché le librerie Android meno recenti non comprendono l'attributo android:installLocation e non compilano la tua applicazione quando è presente.

Quando l'applicazione è installata su un dispositivo con un livello API inferiore a 8, l'attributo android:installLocation viene ignorato e l'applicazione viene installata nella memoria interna.

Attenzione: anche se il markup XML come questo verrà ignorato dalle piattaforme precedenti, devi fare attenzione a non utilizzare API di programmazione introdotte nell'API di livello 8 quando il valore di minSdkVersion è inferiore a "8", a meno che tu non esegua il lavoro necessario per fornire la compatibilità con le versioni precedenti del tuo codice.

Applicazioni che NON devono essere installate su unità di archiviazione esterna

Quando l'utente consente all'archivio di massa USB di condividere file con il proprio computer (o smonta o rimuove in altro modo l'unità di archiviazione esterna), qualsiasi applicazione installata sulla memoria esterna e attualmente in esecuzione viene interrotta. Il sistema non riconosce l'applicazione finché l'archiviazione di massa non viene disabilitata e l'unità di archiviazione esterna non viene reinstallata sul dispositivo. Oltre a terminare l'applicazione e renderla non disponibile per l'utente, questo può interrompere alcuni tipi di applicazioni in modo più serio. Affinché l'applicazione funzioni in modo coerente come previsto, non consentire l'installazione dell'applicazione sulla memoria esterna se questa utilizza una delle seguenti funzionalità, a causa delle conseguenze citate quando la memoria esterna viene smontata:

Servizi
L'esecuzione di Service viene terminata e non viene riavviata quando l'unità di archiviazione esterna viene rimontata. Le applicazioni associate a questo servizio possono essere registrate per l'intent di trasmissione ACTION_EXTERNAL_APPLICATIONS_AVAILABLE, che avvisa tutte le applicazioni che non sono installate su un'unità di archiviazione esterna quando quelle installate su un'unità di archiviazione esterna diventano di nuovo disponibili per il sistema. Dopo aver ricevuto questa trasmissione, le applicazioni possono tentare di associarsi al tuo servizio.
Servizi di allarme
Le tue sveglie registrate con AlarmManager verranno annullate. Devi registrare di nuovo manualmente eventuali allarmi quando rimonti l'unità di archiviazione esterna.
Motori del metodo di input
L'IME verrà sostituito dall'IME predefinito. Quando l'unità di archiviazione esterna viene rimontata, l'utente può aprire le impostazioni di sistema per attivare di nuovo l'IME.
Sfondi animati
Lo sfondo animato in esecuzione verrà sostituito dallo sfondo animato predefinito. Quando la memoria esterna viene rimontata, l'utente può selezionare di nuovo lo sfondo animato.
Widget di app
Il widget per l'app verrà rimosso dalla schermata Home. Quando l'unità di archiviazione esterna viene reinstallata, l'utente non potrà selezionare il tuo widget app fino a quando il sistema non ripristina l'applicazione home (di solito non prima del riavvio del sistema).
Gestori degli account
Gli account creati con AccountManager scompariranno finché la memoria esterna non verrà rimontata.
Adattatori di sincronizzazione
Il tuo AbstractThreadedSyncAdapter e tutte le relative funzionalità di sincronizzazione non funzioneranno finché l'unità di archiviazione esterna non verrà rimontata.
Amministratori dispositivo
Verranno disattivati DeviceAdminReceiver e tutte le sue funzionalità di amministrazione, il che può avere conseguenze imprevedibili sulla funzionalità del dispositivo, che potrebbe persistere dopo il rimontaggio dell'unità di archiviazione esterna.
Ricevitori di trasmissione in ascolto di "avvio completato"
Il sistema invia la trasmissione ACTION_BOOT_COMPLETED prima che la memoria esterna venga montata sul dispositivo. Se la tua applicazione è installata su una memoria esterna, non potrà mai ricevere questo annuncio.

Se la tua applicazione utilizza una delle funzionalità elencate sopra, non dovresti consentire l'installazione dell'applicazione su unità di archiviazione esterna. Per impostazione predefinita, il sistema non consente all'applicazione di installare l'applicazione nell'unità di archiviazione esterna, quindi non devi preoccuparti delle applicazioni esistenti. Tuttavia, se hai la certezza che la tua applicazione non dovrebbe mai essere installata nella memoria esterna, devi chiarire questo concetto dichiarando android:installLocation con il valore "internalOnly". Anche se questo non cambia il comportamento predefinito, l'applicazione dichiara esplicitamente che l'applicazione deve essere installata solo nella memoria interna e serve a ricordare a te e agli altri sviluppatori che questa decisione è stata presa.

Applicazioni che dovrebbero essere installate su unità di archiviazione esterna

In parole povere, tutto ciò che non utilizza le funzionalità elencate nella sezione precedente è sicuro se installato su un'unità di archiviazione esterna. I giochi di grandi dimensioni sono più comunemente i tipi di applicazioni che dovrebbero consentire l'installazione su unità di archiviazione esterna, perché in genere i giochi non forniscono servizi aggiuntivi quando inattivi. Se l'unità di archiviazione esterna non è più disponibile e un processo di gioco viene interrotto, non dovrebbe esserci alcun effetto visibile quando lo spazio di archiviazione diventa di nuovo disponibile e l'utente riavvia il gioco (supponendo che il gioco abbia salvato correttamente lo stato durante il normale Ciclo di vita dell'attività).

Se la tua applicazione richiede diversi megabyte per il file APK, dovresti valutare con attenzione se abilitare l'installazione dell'applicazione nella memoria esterna, in modo che gli utenti possano risparmiare spazio nella memoria interna.

Per ulteriori informazioni correlate, consulta: <manifest>