Conservazione

Icona HAL di archiviazione esterna Android

Android si è evoluto nel tempo per supportare un'ampia varietà di tipi e funzionalità di dispositivi di archiviazione. Tutte le versioni di dispositivi di supporto Android con storage tradizionale , che include archiviazione portatile e emulato. Archiviazione portatile può essere fornita da supporti fisici, come una scheda SD o USB, che è per la memorizzazione / trasferimento file di dati temporanei. Il supporto fisico può rimanere con il dispositivo per un lungo periodo di tempo, ma non è legato al dispositivo e può essere rimosso. Le schede SD sono disponibili come memoria portatile da Android 1.0; Android 6.0 ha aggiunto il supporto USB. Stoccaggio emulato è fornito esponendo una porzione di memoria interna attraverso un livello di emulazione ed è disponibile da Android 3.0.

A partire dal Android 6.0, Android supporta stoccaggio adottabile , che è fornito da supporti fisici, come una scheda SD o USB, che viene crittografato e formattato a comportarsi come memoria interna. L'archiviazione adottabile può memorizzare tutti i tipi di dati dell'applicazione.

permessi

L'accesso alla memoria esterna è protetto da varie autorizzazioni Android. A partire dal Android 1.0, l'accesso in scrittura è protetto con il WRITE_EXTERNAL_STORAGE permesso. A partire dal Android 4.1, l'accesso in lettura è protetto con il READ_EXTERNAL_STORAGE permesso.

A partire da Android 4.4, il proprietario, il gruppo e le modalità dei file su dispositivi di archiviazione esterni sono ora sintetizzati in base alla struttura delle directory. In questo modo le applicazioni per gestire le loro directory pacchetto-specifiche su storage esterno senza richiedere che detengono l'ampio WRITE_EXTERNAL_STORAGE permesso. Ad esempio, l'applicazione con nome del pacchetto com.example.foo può ora accedere liberamente Android/data/com.example.foo/ su dispositivi di archiviazione esterni senza permessi. Queste autorizzazioni sintetizzate vengono ottenute avvolgendo i dispositivi di archiviazione non elaborati in un demone FUSE.

A partire dal 10 Android, le applicazioni che bersaglio Android 9 e più basso di default allo stoccaggio legacy, e può optare per lo stoccaggio isolati. Le applicazioni che bersaglio Android 10 e di default per lo stoccaggio isolati possono temporaneamente optare fuori di esso. Utilizzare il manifesto attributo requestLegacyExternalStorage , che controlla il modello di archiviazione, per modificare lo stato di default.

Dal momento che entrambe READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE permessi sono morbidi con restrizioni, se il programma di installazione non ha whitelist l'applicazione, i controlli di autorizzazione accesso solo alle collezioni fonetiche e visive, senza accesso alla scheda SD. Questo vale anche se l'app richiede l'archiviazione legacy. Per ulteriori informazioni su entrambe le restrizioni dure e morbide restrizioni, vedi duri e molli in restrizioni Android 10 .

Se il programma di installazione ha autorizzato l'autorizzazione, un'app in esecuzione in modalità legacy ottiene il comportamento di autorizzazione non isolato. L'autorizzazione controlla l'accesso alla scheda SD e le raccolte sonore e visive. Ciò accade quando l'app ha come target Android 9 o versioni precedenti e non attiva l'archiviazione isolata, oppure si rivolge ad Android 10 e si disattiva.

Lo stato della whitelist può essere specificato solo al momento dell'installazione e non può essere modificato finché l'app non è stata installata.

Per ulteriori informazioni sull'impostazione della READ_EXTERNAL_STORAGE autorizzazione, vedere setWhitelistedRestrictedPermissions() nella PackageInstaller.SessionParams di classe.

Autorizzazioni di runtime

Android 6.0 introduce una nuova permessi di esecuzione modello in cui le applicazioni richiedono capacità quando necessario in fase di esecuzione. Poiché il nuovo modello include i READ/WRITE_EXTERNAL_STORAGE i permessi, le esigenze piattaforma per l'accesso allo storage concessione dinamicamente senza uccidere o riavviare le applicazioni già in esecuzione. Lo fa mantenendo tre viste distinte di tutti i dispositivi di archiviazione montati:

  • /mnt/runtime/default è dimostrato di applicazioni con autorizzazioni speciali di conservazione, e per lo spazio dei nomi radice dove adbd e altri componenti del sistema vivono.
  • /mnt/runtime/read è indicata per applicazioni con READ_EXTERNAL_STORAGE (Set LEGACY_STORAGE per Android 10)
  • /mnt/runtime/write è indicata per applicazioni con WRITE_EXTERNAL_STORAGE

Al momento del fork di Zygote, creiamo uno spazio dei nomi di montaggio per ogni app in esecuzione e leghiamo il montaggio della vista iniziale appropriata in posizione. Più tardi, quando i permessi di esecuzione vengono concesse, vold salta nel namespace supporto di applicazioni già in esecuzione e monta legano la vista aggiornata in posizione. Tieni presente che i downgrade delle autorizzazioni comportano sempre l'interruzione dell'app.

Il setns() funzionalità utilizzata per implementare questa funzione richiede almeno Linux 3.8, ma le patch sono state backport successo a Linux 3.4. Il PermissionsHostTest di test CTS può essere utilizzato per verificare il comportamento del kernel corretto.