Come Android gestisce lo storage per le applicazioni (e la sd-card)

Su un dispositivo Android possiamo trovare due tipi di memorie: quelle interne, che sono parte integrante del dispositivo, e quelle esterne, che sono rimovibili dall’utente, anche a caldo. gli sviluppatori di Android decisero che la memoria interna del dispositivo dovesse essere sempre gestita dal sistema e dalle app, impedendo all’utente di intervenire direttamente sul file system. L’utente avrebbe piuttosto organizzato i suoi file in una eventuale memoria esterna, la maggior parte delle volte una sdcard. Una scheda SD può essere facilmente rimossa e collegata ad un PC, per gestire musica, fotografie, documenti, etc…

Le memorie esterne possono anche essere molteplici, ma il dispositivo ne riconoscerà una come “primaria”, e solitamente è una scheda sd. Per questo la memoria esterna primaria viene montata in /sdcard.

La memoria interna è divisa in più partizioni. Molte servono ad Android (/system, /cache, /boot…), ma quella che ci interesse serve principalmente per ospitare le applicazioni: /data.

Quando il sistema installa un’applicazione, il file system viene popolato in questo modo:

  • In /data/app/ viene copiato l’apk;
  • In /data/dalvik-cache/ viene creata una directory per la cache della JVM relativa all’applicazione;
  • Viene creata la directory /data/data/<id_app>, in cui saranno scritti e letti i dati privati dell’applicazione: database, file, cache, preferenze…
  • Viene creata la directory /data/data/<id_app>/lib/ per ospitare alcune librerie esterne all’apk.

Quando si va in Impostazioni > “Gestione Applicazioni”, queste directory vengono “pesate”, e viene presentato un riepilogo che comprende in particolare queste due voci:

  • Applicazione: include il peso dell’apk, della dalvik-cache, e della directory lib;
  • Dati: include /data/data/<id_app>, escludendo naturalmente la directory lib;

Inoltre è presente il pulsante “Cancella dati”, che elimina tutto il contenuto di /data/data/<id_app>/, eccetto la directory lib.

Ora torniamo alla directory dei dati: questa è protetta con permessi tali che solo la sua applicazione può leggere e scrivere al suo interno. Le altre applicazioni, compresi i file manager, non possono accedervi, almeno finché non acquisiscono i permessi di root. In questo modo viene aumentata la sicurezza del sistema, perché un’app non può interferire con i dati privati di un’altra app.

E se invece un’applicazione volesse condividere uno o più file con altre applicazioni, oppure volesse permettere all’utente di copiare un file al di fuori del dispositivo? Ad esempio, se un browser ha scaricato un pdf, e volesse permettere ad un’altra app di aprirlo in lettura? L’idea degli sviluppatori di Android è di utilizzare in questi casi la memoria esterna, che è appunto dedicata a tutto ciò che può essere “condiviso”, tra le app e con l’utente.

Questo crea il problema: se nel dispositivo non è installata una sd-card? Ebbene, l’applicazione non avrà modo di condividere i suoi file. Ci sono alcune soluzioni, per esempio lanciare un Intent che permette all’app ricevente di aprire uno stream, ma sono più complicate e limitate di un semplice file aperto in lettura.

Per aggirare questa limitazione spesso (ma non sempre) i produttori di dispositivi “ingannano” il sistema: creano un’ulteriore partizione sulla memoria interna, e la fanno montare su /sdcard. Il sistema la utilizzerà come se fosse una memoria esterna “primaria”. Questo ovviamente rompe l’idea originaria di avere su memoria rimovibile i dati gestiti dall’utente, ma permette di avere un dispositivo pienamente funzionante fin dall’inizio.

Se il dispositivo ha molta memoria interna, questa soluzine non è un problema. Ma se la memoria dovesse essere limitata? Ad esempio una memoria interna da 8GB solitamente viene divisa in una partizione “sdcard” da 4GB,  una partizione “data” da 2GB, e il resto per il sistema operativo.

Il fatto che “/sdcard” sia di soli 4GB non è un problema, perché l’utente può decidere di affiancargli una vera sdcard (che, paradossalmente, verrà montata su /media/extSdcard, cioè “scheda sd esterna“). Ma il problema sono i 2GB di /data, che devono bastare per gli apk, la cache della jvm e i dati privati delle app! Appena si inizia ad installare un po’ di app, soprattutto quelle che scrivono molti file in locale, la memoria finirà, creando problemi.

Fortunatamente nelle versioni più recenti di Android esiste un modo per migliorare la situazione. Nella schermata di gestione delle app è presente un pulsante “sposta su scheda SD”. Questa funzione sposta l’apk e la directory lib in /sdcard, mentre i dati e la dalvik-cache rimangono su memoria interna. Non è molto, ma può bastare per dare respiro alla memoria interna.

Dopo aver spostato un’app su scheda SD, nel riepilogo dell’app sarà valorizzata anche la voce “Scheda SD”, che riporterà appunto il peso di apk e lib. La voce “Applicazione” sarà ancora valorizzata, perché riporterà il peso della dalvik-cache. Purtroppo non sono ancora riuscito a decifrare il significato di “Applicazione memoria USB”  e “Cache”.

Quindi, per concludere, se volete acquistare un dispositivo Android, ma siete incerti sulla quantità di memoria, potete cercare di capire quanto è grande la partizione /data (con un po’ di fortuna si trova su internet, oppure provando direttamente il dispositivo e andando in Impostazioni > Memoria). Se siete fortunati il produttore non avrà creato la seconda partizione per /sdcard, lasciando quindi che questa partizione sia la vera sdcard, quindi avrete molta più memoria per le applicazioni!

Per completezza vi lascio con le statistiche dell’uso della memoria interna prese dal mio Samsung GT-I9070:

  • /data/app: 380MB
  • /data/dalvik-cache: 350MB
  • /data/data: 620MB
  • Totale apk installati (compresi quelli su sdcard): 73