El almacenamiento externo se administra mediante una combinación del servicio de init vold
y el servicio del sistema StorageManagerService
. vold
controla la activación de volúmenes de almacenamiento externo físico, que realiza operaciones de etapa de pruebas para preparar el contenido multimedia antes de exponerlo a las apps.
Nota: En Android 8.0, se cambió el nombre de la clase MountService
a StorageManagerService
.
Asignaciones de archivos
En Android 4.2.2 y versiones anteriores, el archivo de configuración vold.fstab
específico del dispositivo define las asignaciones de dispositivos sysfs a los puntos de activación del sistema de archivos, y cada línea sigue este formato:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: Es la etiqueta del volumen.mount_point
: Es la ruta de acceso del sistema de archivos en la que se debe activar el volumen.partition
: Es el número de partición (basado en 1) o "auto" para la primera partición utilizable.sysfs_path
: Una o más rutas de acceso de sysfs a dispositivos que pueden proporcionar este punto de activación. Separadas por espacios, y cada una debe comenzar con/
.flags
: Es una lista opcional de marcas separadas por comas que no debe contener/
. Los valores posibles sonnonremovable
yencryptable
.
En las versiones de Android 4.3 y posteriores, los diversos archivos fstab que usan init, vold y recovery se unificaron en el archivo /fstab.<device>
. Para los volúmenes de almacenamiento externos que administra vold
, las entradas deben tener el siguiente formato:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src
: Es una ruta de acceso en sysfs (por lo general, activada en /sys) al dispositivo que puede proporcionar el punto de activación. La ruta de acceso debe comenzar con/
.mount_point
: Es la ruta de acceso del sistema de archivos en la que se debe activar el volumen.type
: Es el tipo de sistema de archivos del volumen. En el caso de las tarjetas externas, por lo general, esvfat
.mnt_flags
:Vold
ignora este campo y se debe establecer endefaults
.fs_mgr_flags
:Vold
ignora las líneas del fstab unificado que no incluyen la marcavoldmanaged=
en este campo. A esta marca debe seguirle una etiqueta que describa la tarjeta y un número de partición o la palabraauto
. A continuación, se muestra un ejemplo:voldmanaged=sdcard:auto
. Otras marcas posibles sonnonremovable
,encryptable=sdcard
,noemulatedsd
yencryptable=userdata
.
Detalles de configuración
Las interacciones de almacenamiento externo a nivel del framework y superiores se controlan a través de StorageManagerService
. Debido a los cambios de configuración en Android 6.0 (como la eliminación de la superposición de recursos storage_list.xml), los detalles de configuración se dividen en dos categorías.
Android 5.x y versiones anteriores
El archivo de configuración storage_list.xml
específico del dispositivo, que generalmente se proporciona a través de una superposición frameworks/base
, define los atributos y las restricciones de los dispositivos de almacenamiento. El elemento <StorageList>
contiene uno o más elementos <storage>
, de los cuales exactamente uno debe estar marcado como principal. Los atributos <storage>
incluyen los siguientes:
mountPoint
: Es la ruta de acceso del sistema de archivos de esta activación.storageDescription
: Es un recurso de cadena que describe esta activación.primary
: Es verdadero si este activador es el almacenamiento externo principal.removable
: Es verdadero si este activador tiene medios extraíbles, como una tarjeta SD física.emulated
: Es verdadero si este activador se emula y se respalda con almacenamiento interno, posiblemente con un daemon de FUSE.mtp-reserve
: Es la cantidad de MB de almacenamiento que MTP debe reservar para el almacenamiento gratuito. Solo se usa cuando el activador está marcado como emulado.allowMassStorage
: Es verdadero si este activador se puede compartir a través del almacenamiento masivo USB.maxFileSize
: Es el tamaño máximo del archivo en MB.
Los dispositivos pueden proporcionar almacenamiento externo emulando un sistema de archivos sin distinción de mayúsculas ni minúsculas y sin permisos respaldado por el almacenamiento interno. El daemon de FUSE en system/core/sdcard
proporciona una posible implementación, que se puede agregar como servicio init.rc
específico del dispositivo:
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
En el que source_path
es el almacenamiento interno de respaldo y dest_path
es el punto de activación de destino.
Cuando configuras una secuencia de comandos init.rc
específica del dispositivo, la variable de entorno EXTERNAL_STORAGE
se debe definir como la ruta de acceso al almacenamiento externo principal. La ruta de acceso /sdcard
también debe resolverse en la misma ubicación, posiblemente a través de un symlink. Si un dispositivo ajusta la ubicación del almacenamiento externo entre actualizaciones de la plataforma, se deben crear symlinks para que las rutas de acceso anteriores sigan funcionando.
Android 6.0
La configuración del subsistema de almacenamiento ahora se concentra en el archivo fstab
específico del dispositivo, y se quitaron varios archivos o variables de configuración estáticos históricos para admitir un comportamiento más dinámico:
- Se quitó la superposición de recursos
storage_list.xml
y el framework ya no la usa. Los dispositivos de almacenamiento ahora se configuran de forma dinámica cuandovold
los detecta. - Se quitaron las variables de entorno
EMULATED_STORAGE_SOURCE/TARGET
, y Zygote ya no las usa para configurar puntos de activación específicos del usuario. En cambio, la separación de usuarios ahora se aplica con GID específicos del usuario, yvold
activa el almacenamiento compartido principal en el tiempo de ejecución.- Los desarrolladores pueden seguir compilando rutas de manera dinámica o estática según su caso de uso. Si incluyes el UUID en la ruta, se identificará cada tarjeta para que la ubicación sea más clara para los desarrolladores. (por ejemplo,
/storage/ABCD-1234/report.txt
es claramente un archivo diferente de/storage/DCBA-4321/report.txt
).
- Los desarrolladores pueden seguir compilando rutas de manera dinámica o estática según su caso de uso. Si incluyes el UUID en la ruta, se identificará cada tarjeta para que la ubicación sea más clara para los desarrolladores. (por ejemplo,
- Los servicios de FUSE codificados en el firmware se quitaron de los archivos
init.rc
específicos del dispositivo y, en su lugar, se bifurcan de forma dinámica desdevold
cuando es necesario.
Además de estos cambios de configuración, Android 6.0 incluye el concepto de almacenamiento adoptable. En el caso de los dispositivos con Android 6.0, cualquier contenido multimedia físico que no se adopte se considera portátil.
Almacenamiento adoptable
Para indicar un dispositivo de almacenamiento adoptable en fstab
, usa el atributo encryptable=userdata
en el campo fs_mgr_flags
. Esta es una definición típica:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Cuando se adopta un dispositivo de almacenamiento, la plataforma borra el contenido y escribe una tabla de particiones GUID que define dos particiones:
- una pequeña partición
android_meta
vacía que se reserva para uso futuro. El GUID del tipo de partición es 19A710A2-B3CA-11E4-B026-10604B889DCF. - una partición
android_ext
grande que se encripta con dm-crypt y se formatea conext4
of2fs
, según las capacidades del kernel El GUID del tipo de partición es 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Almacenamiento portátil
En fstab
, los dispositivos de almacenamiento con el atributo voldmanaged
se consideran portátiles de forma predeterminada, a menos que se defina otro atributo como encryptable=userdata
. Por ejemplo, esta es una definición típica para dispositivos USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
La plataforma usa blkid
para detectar tipos de sistemas de archivos antes de activarlos, y los usuarios pueden elegir formatear el contenido multimedia cuando el sistema de archivos no es compatible.