KitKat e le memorie SD esterne, facciamo chiarezza
Quote:
Originariamente inviato da lo Staff
Premessa di partecipazione al thread:
L'utente StarKnight, nella spiegazione qui sotto, è stato molto dettagliato, quindi vi chiediamo di leggerla con molta attenzione, evitando di postare domande alle quali ci sono già delle risposte
Inoltre, onde evitare di appesantire il topic con lamentele sterili del tipo
"Io cambio telefono; Ma google che vuole?; Che schifezza di aggiornamento; Etc..Etc.."!
Vi chiediamo di evitarle, così da poter discutere sulla nuova impostazione ed eventuali novità in merito.
Ringraziamo per la collaborazione a mantenere vivo lo scopo del thread.
Poiché leggo un po' ovunque di persone che hanno aggiornato a KitKat (per ora con ROM non ufficiali) e non riescono più ad accedere in scrittura alla propria scheda SD esterna apro questo thread per fare un po' di chiarezza. Lo apro in questa sezione perché riguarda trasversalmente tutti i modelli di S4 (Google Edition inclusa) e riguarderà anche quelli venduti da noi quando usciranno i firmware ufficiali per l'Italia e gli utenti inizieranno a fare l'aggiornamento ignari di come sono cambiate le cose.
Inizio spiegando come Android fin dalle sue origini considera gli spazi di memorizzazione.
Fin dalla prima versione (1.0) esistono sostanzialmente due memorie: Interna ed esterna.
La prima è esclusivamente interna al dispositivo ed è, solitamente, limitata a qualche centinaio di MB. Tecnicamente parlando è la partizione dati (/data) ed è quella in cui solitamente vengono installate le applicazioni, in particolar modo quelle che hanno parti di codice che dev'essere sempre disponibile fin dall'avvio (services, widgets, live wallpaper ecc...). In essa le applicazioni possono anche salvare dei file tenendo però conto che lo spazio a disposizione è abbastanza limitato.
La seconda nei primi dispositivi Android era costituita dall'eventuale scheda SD esterna e per questo motivo mediante un link simbolico è stata comunemente resa accessibile alle applicazioni sotto il path "/sdcard". Con l'evoluzione degli smarthpone i produttori hanno iniziato ad integrarla nei dispositivi (i famosi 16Gb/32Gb/64Gb) non più rimovibile ma agli occhi di Android e delle applicazioni essa è come se fosse ancora una memoria "esterna". Sotto di essa le applicazioni sono solite memorizzare i dati "pesanti" quali mappe dei navigatori, foto, video, registrazioni sonore, documenti e quant'altro. Esiste una speciale directory al suo interno che si chiama "Android" sotto la quale ciascuna applicazione dispone di uno spazio "personale" per memorizzare i propri file privati (file), dati emporanei (cache) o dati di altro tipo solitamente di grosse dimensioni (obb) e che si presume non siano accessibili alle altre applicazioni.
Fin dalle API 1.0 l'accesso in scrittura alla memoria interna da parte delle applicazioni è sempre stato limitato al solo spazio dedicato all'applicazione stessa (/data/data/nome.della.applicazione/) mentre in lettura salvo avere i permessi di root è limitato ad una manciata di file e directory pubblicamente accessibili in lettura e null'altro.
L'accesso in scrittura alla (eventule) memoria esterna era anch'esso limitato alla sola directory destinata all'app (/sdcard/Android/data/nome.della.applicazione/) ma le applicazioni possono richiedere due particolari permessi: WRITE_EXTERNAL_STORAGE e READ_EXTERNAL_STORAGE per poter scrivere e leggere (o solo leggere) qualsiasi file in essa presente.
Alcuni produttori hanno poi iniziato a fornire l'accesso ad altre memorie "esterne" quali schede SD o dispositivi USB connessi tramite cavetto OTG. L'accesso a tali memorie non è mai stato molto chiaro da parte di Google che, per ragioni difficilmente comprensibili ma si suppone legate ai suoi servizi di cloud, non ha mai amato le schede SD e i dispositivi di memorizzazione esterni agli smartphone. Le specifiche di Android in tal senso hanno sempre fatto riferimento ad un particolare permesso: WRITE_MEDIA_STORAGE senza il quale nessuna applicazione dovrebbe poter accedere in scrittura a suddetti dispositivi. Peccato che tale permesso possa venire concesso solo alle applicazioni di sistema (per intenderci quelle di base più quelle fornite dai singoli produttori). Per consentire anche alle altre applicazioni (Dropbox, Tom Tom, file manager, programmi vari) di accedervi in scrittura i singoli produttori fa cui Samsung hanno arbitrariamente deciso di concedere tale permesso alle applicazioni che richiedono il permesso di WRITE_EXTERNAL_STORAGE e che, ricordo, stando a Google dovrebbe essere limitato alla sola memoria esterna "integrata" e non a quelle rimovibili.
Questo fino all'arrivo di KitKat...
Con KitKat sempre per ragioni poco logiche e comprensibili Google ha praticamente ordinato a tutti i produttori di dispositivi Android di attenersi rigorosamente ad una regola: il permesso di WRITE_EXTERNAL_STORAGE deve concedere l'accesso in scrittura solo alla prima memoria esterna (quella integrata per intenderci) e non a quelle esterne. E con quelle esterne, direte voi ?
Fin dalle prime API esistono due metodi a disposizione degli sviluppatori per sapere quali sono gli spazi "riservati" dal sistema alle proprie applicazioni (quindi non pubblici). Questi sono principalmente "getFilesDir" per la memoria interna e "getExternalFilesDir" per la prima memoria esterna (/sdcard). Sotto tali percorsi le applicazioni possono sempre scrivere e leggere i propri dati senza richiedere permessi particolari. Le altre applicazioni non possono accedervi e quando un'app viene rimossa anche i propri dati vengono rimossi. Con KitKat sono state introdotte nuove API fra cui "getExternalFilesDirs" (notare il plurale) che funziona esattamente come "getExternalFilesDir" ma anziché un solo percorso fornisce più percorsi uno per ciascuna memoria "esterna". Le regole rimangono invariate, solo sotto tali percorsi privati le applicazioni potranno scrivere e leggere i propri file. Questo include, quindi, anche le memorie SD esterne. Tutti gli altri file presenti in tali memorie SD esterne potranno ancora essere letti ma non si potrà ne cancellarli ne modificarli o crearne di nuovi.
Per semplicità riassumerò quindi i vari casi:
Dispositivi con firmware < 4.4 (precedenti a KitKat)
- Le applicazioni di sistema o fornite dal produttore (es. App Archivio) possono accedere in lettura e scrittura a tutte le memorie sia interne che esterne ad esclusione dei file di sistema, quelli privati delle singole app o protetti.
- Le applicazioni non di sistema (non importa se pre-installate come Dropbox o installate dallo Store) possono:
- Accedere in lettura e scrittura alla memoria interna solo nel proprio spazio personale, come restituito dal metodo "getFilesDir"
- Accedere in lettura e scrittura alla memoria esterna principale (integrata) solo nel proprio spazio personale, come restituito dal metodo "getExternalFilesDir", oppure accedere in lettura e scrittura a qualsiasi file tranne quelli privati/protetti se richiedono i permessi "READ_EXTERNAL_STORAGE" o "WRITE_EXTERNAL_STORAGE"
- Accedere in lettura e scrittura alla scheda SD esterna a qualsiasi file tranne quelli privati/protetti se richiedono i permessi "READ_EXTERNAL_STORAGE" o "WRITE_EXTERNAL_STORAGE" (come arbitrariamente deciso dai singoli produttori fra cui Samsung)
Dispositivi con firmware >= 4.4 (da KitKat in poi salvo ulteriori cambiamenti)
- Le applicazioni di sistema o fornite dal produttore (es. App Archivio) possono accedere in lettura e scrittura a tutte le memorie sia interne che esterne ad esclusione dei file di sistema, quelli privati delle singole app o protetti.
- Le applicazioni non di sistema (non importa se pre-installate come Dropbox o installate dallo Store) possono:
- Accedere in lettura e scrittura alla memoria interna solo nel proprio spazio personale, come restituito dal metodo "getFilesDir"
- Accedere in lettura e scrittura alla memoria esterna principale (integrata) solo nel proprio spazio personale, come restituito dal metodo "getExternalFilesDir", oppure accedere in lettura e scrittura a qualsiasi file tranne quelli privati/protetti se richiedono i permessi "READ_EXTERNAL_STORAGE" o "WRITE_EXTERNAL_STORAGE"
- Accedere in lettura e scrittura alla scheda SD esterna solo nel proprio spazio personale, come restituito dal nuovo metodo "getExternalFilesDirs" mentre l'accesso a qualsiasi altro file pubblico o privato che sia è consentito solo in lettura. Non esistono, ad oggi, permessi che possono essere richiesti da tali applicazioni per aggirare questa pesante limitazione!!!
La conseguenza più ovvia è che programmi come Sygic che fino ad oggi hanno fatto uso di una propria directory chiamata Sygic sotto la root della memoria che si intende usare potranno funzionare solo se questa si troverà nella memoria interna mentre su quella SD esterna avranno solo accesso in lettura. Per continuare a funzionare dovranno memorizzare i propri dati (es. mappe) esclusivamente nel proprio spazio privato (/storage/extSdCard/Android/data/nome.della.applicazione/) e da nessun'altra parte. Così come un programma di fotoritocco che aprirà una foto che avete salvato sulla SD esterna non potrà modificarla e salvarla nella stessa posizione ma dovrà chiedervi una nuova posizione nella memoria interna.
Spero ora di aver chiarito meglio la (poco piacevole) situazione e se aggiornerete a KitKat anche con firmware ufficiali saprete a cosa andate incontro. Inutile protestare con Samsung... le decisioni le ha prese Google ed i produttori possono scegliere o di continuare a fare di testa loro consentendo accesso non ristretto alle SD esterne (magari altre marche faranno così) oppure rispettare le richieste di Google. Ovviamente chi se ne frega della garanzia può sempre andare di rooting ed in rete già esistono soluzioni per "ripristinare" il comportamento precedente a KitKat.
AL SECONCO POST TROVATE UNA SERIE DI DOMANDE/RISPOSTE AI DUBBI PIU' COMUNI SU QUESTO ARGOMENTO, LEGGETELE CON ATTENZIONE PRIMA DI FARE DOMANDE
KitKat e le memorie SD esterne, facciamo chiarezza
FAQ
Alcune domande Frequenti
Vi metto qui di seguito un elenco di domande/risposte ai dubbi più comuni inerenti questo argomento così da evitare che il topic si riempia con le stesse domande.
D: Ho un Galaxy S4 originale mai modificato. Il problema riguarderà anche me installando la ROM di KitKat ufficiale ?
R: Sì. La direttiva è partita da Google e Samsung sembra averla recepita con tutti gli aggiornamenti a KitKat. Ciò non toglie che in futuro con aggiornamenti Samsung o Google stessa decidano di tornare sui propri passi o, meglio ancora, implementare nuovi permessi per concedere libero accesso alle applicazioni che ne fanno richiesta.
D: Ho le mie foto/musiche/documenti sulla scheda SD esterna. Con KitKat le mie applicazioni funzioneranno ancora?
R: Se le applicazioni devono solo leggere tali dati sì, funzioneranno come sempre. Nel momento in cui, però, avessero la necessità di spostare, modificare o creare nuovi file verrebbe loro negata tale funzionalità a meno che questo non avvenga nel proprio spazio privato assegnato da Android. Applicazioni che gestiscono dati che non necessitano di essere condivisi con altre applicazioni (es. le mappe dei navigatori, le textures e i livelli in 3D dei giochi ecc...) potrebbero salvare tali dati nel proprio spazio privato, i rispettivi autori dovranno adeguarle in tal senso.
D: Potrò continuare a salvare le mie foto sulla scheda SD esterna ?
R: Sì ma solo usando l'applicazione "Fotocamera" di Samsung fornita con l'S4. Qualsiasi altra applicazione che scatta foto o registra video scaricata dallo Store potrà farlo solo nella memoria interna oppure nel proprio spazio privato della SD Esterna ma in quest'ultimo caso altre applicazioni non sarebbero in grado ne di vederle ne di modificarle.
D: Ho sentito di alcune applicazioni quali "ES File Explorer" che riescono a scrivere sulle SD esterne, hanno trovato un metodo?
R: Non è ben chiaro come alcuni sviluppatori abbiano aggirato il problema ma qualunque sia il metodo usato non è un metodo previsto da Google e come tutti gli exploit potrebbe non funzionare su tutte le rom o dopo eventuali aggiornamenti.
D: Per liberare spazio spostavo le mie applicazioni sulla SD esterna, con KitKat non potrò più farlo?
R: La possibilità di spostare parzialmente o interamente il codice eseguibile ed annessi dati (immagini, stili, stringhe di testo ed altro) necessari al funzionamento delle applicazioni è un'operazione gestita dal sistema operativo stesso che Google ha introdotto con Froyo e rimosso negli smartphone più recenti in quanto la memoria estesa interna è divenuta quella di default dove installare le applicazioni. Samsung ha re-introdotto questa funzionalità già con i primi aggiornamenti del 4.2 per gli S4. Poiché gestita da Android continua a funzionare con le stesse modalità ed i limiti di sempre (alcune app non possono essere spostate o solo una parte di esse per ragioni tecniche che non sto a spiegarvi in questa sede).
D: Questa limitazione riguarda anche le memorie ed i dispositivi esterni (es. macchine fotografiche) connessi tramite cavetto USB OTG ?
R: No, i dispositivi di memorizzazione USB connessi tramite cavetto OTG continueranno ad essere liberamente accessibili sia in lettura che scrittura da qualsiasi applicazione. La limitazione riguarda solo la memoria esterna MicroSD inserita nel dispositivo.
D: Se collego il mio S4 al PC tramite cavo USB vedrò ancora la SD esterna ?
R: Sì, essendo una funzione gestita da Android rimane tutto come prima. Potrai continuare a vedere tutte le cartelle ed i file così come potrai modificarli, spostarli o cancellarli.
D: Del Knox e della garanzia non sono interessato. Con il rooting o una rom custom 4.4 avrò lo stesso problema?
R: Le rom custom con KitKat stanno già provvedendo (o hanno provveduto come la Cyano) a ripristinare pieno accesso alla scheda SD. Rimanendo a quelle ufficiali Samsung mediante rooting si possono ripristinare i vecchi permessi ma l'operazione presenta ancora qualche inconveniente. Questo non è il thread in cui parlare di modding ma sui forum come XDA vi sono thread dedicati a questo argomento.
D: Sembra essere tutto poco chiaro ed in rete se ne parla poco. Esiste qualcosa di ufficiale?
R: Sì. Sebbene all'argomento non sembra sia stato dato (ancora) il giusto peso Google definisce in maniera precisa ed ufficiale sul sito per gli sviluppatori quali sono le regole a cui devono attenersi. Lo trovate (in lingua inglese) QUI. In particolare leggete il paragrafo "Multiple external storage devices".