El almacenamiento externo se gestiona mediante una combinación del servicio vold
init y el servicio del sistema StorageManagerService
. El montaje de volúmenes de almacenamiento físico externo lo maneja vold
, que realiza operaciones de preparación para preparar los medios antes de exponerlos a las aplicaciones.
Nota: En Android 8.0, la clase MountService
pasó a llamarse StorageManagerService
.
Asignaciones de archivos
Para Android 4.2.2 y versiones anteriores, el archivo de configuración vold.fstab
específico del dispositivo define asignaciones desde dispositivos sysfs a puntos de montaje del sistema de archivos, y cada línea sigue este formato:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label
: Etiqueta para el volumen. -
mount_point
: ruta del sistema de archivos donde se debe montar el volumen. -
partition
: Número de partición (basado en 1), o 'auto' para la primera partición utilizable. -
sysfs_path
: una o más rutas sysfs a dispositivos que pueden proporcionar este punto de montaje. Separados por espacios y cada uno debe comenzar con/
. -
flags
: Lista opcional de indicadores separados por comas, no debe contener/
. Los valores posibles incluyennonremovable
yencryptable
.
Para las versiones 4.3 y posteriores de Android, los distintos archivos fstab utilizados por init, vold y recovery se unificaron en el archivo /fstab.<device>
. Para volúmenes de almacenamiento externo administrados por vold
, las entradas deben tener el siguiente formato:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
-
src
: una ruta en sysfs (normalmente montada en /sys) al dispositivo que puede proporcionar el punto de montaje. La ruta debe comenzar con/
. -
mount_point
: ruta del sistema de archivos donde se debe montar el volumen. -
type
: el tipo de sistema de archivos en el volumen. Para tarjetas externas, suele servfat
. -
mnt_flags
:Vold
ignora este campo y debe establecerse en losdefaults
-
fs_mgr_flags
:Vold
ignora cualquier línea en el fstab unificado que no incluya el indicadorvoldmanaged=
en este campo. Esta bandera debe ir seguida de una etiqueta que describa la tarjeta y un número de partición o la palabraauto
. Aquí hay un ejemplo:voldmanaged=sdcard:auto
. Otros indicadores posibles sonnonremovable
,encryptable=sdcard
,noemulatedsd
yencryptable=userdata
.
Detalles de configuración
Las interacciones de almacenamiento externo en el nivel del marco y por encima se manejan a través de StorageManagerService
. Debido a 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 anteriores
El archivo de configuración storage_list.xml
específico del dispositivo, generalmente proporcionado a través de una superposición frameworks/base
, define los atributos y restricciones de los dispositivos de almacenamiento. El elemento <StorageList>
contiene uno o más elementos <storage>
, exactamente uno de los cuales debe marcarse como principal. Los atributos <storage>
incluyen:
-
mountPoint
: ruta del sistema de archivos de este montaje. -
storageDescription
: recurso de cadena que describe este montaje. -
primary
: verdadero si este montaje es el almacenamiento externo principal. -
removable
: verdadero si este soporte tiene medios extraíbles, como una tarjeta SD física. -
emulated
: verdadero si este montaje está emulado y está respaldado por almacenamiento interno, posiblemente usando un demonio FUSE. -
mtp-reserve
: número de MB de almacenamiento que MTP debe reservar para almacenamiento gratuito. Solo se usa cuando el montaje está marcado como emulado. -
allowMassStorage
: verdadero si este soporte se puede compartir mediante almacenamiento masivo USB. -
maxFileSize
: tamaño máximo de archivo en MB.
Los dispositivos pueden proporcionar almacenamiento externo emulando un sistema de archivos sin permisos y que no distingue entre mayúsculas y minúsculas respaldado por almacenamiento interno. Una posible implementación la proporciona el demonio FUSE en system/core/sdcard
, que se puede agregar como un 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
Donde source_path
es el almacenamiento interno de respaldo y dest_path
es el punto de montaje de destino.
Al configurar un script init.rc
específico del dispositivo, la variable de entorno EXTERNAL_STORAGE
debe definirse como la ruta al almacenamiento externo principal. La ruta /sdcard
también debe resolverse en la misma ubicación, posiblemente a través de un enlace simbólico. Si un dispositivo ajusta la ubicación del almacenamiento externo entre actualizaciones de la plataforma, se deben crear enlaces simbólicos para que las rutas antiguas sigan funcionando.
Androide 6.0
La configuración del subsistema de almacenamiento ahora se concentra en el archivo fstab
específico del dispositivo y se han eliminado varios archivos/variables de configuración estática histórica para admitir un comportamiento más dinámico:
- La superposición de recursos
storage_list.xml
se eliminó y el marco ya no la utiliza. Los dispositivos de almacenamiento ahora se configuran dinámicamente cuandovold
los detecta. - Las variables de entorno
EMULATED_STORAGE_SOURCE/TARGET
se han eliminado y Zygote ya no las utiliza para configurar puntos de montaje específicos del usuario. En cambio, la separación de usuarios ahora se aplica con GID específicos de cada usuario, yvold
monta el almacenamiento compartido primario en su lugar en tiempo de ejecución.- Los desarrolladores pueden continuar creando rutas de forma dinámica o estática según su caso de uso. Incluir el UUID en la ruta identifica 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 a/storage/DCBA-4321/report.txt
.)
- Los desarrolladores pueden continuar creando rutas de forma dinámica o estática según su caso de uso. Incluir el UUID en la ruta identifica cada tarjeta para que la ubicación sea más clara para los desarrolladores. (Por ejemplo,
- Los servicios FUSE codificados se han eliminado de los archivos
init.rc
específicos del dispositivo y, en su lugar, se bifurcan dinámicamente desdevold
cuando es necesario.
Además de estos cambios de configuración, Android 6.0 incluye la noción de almacenamiento adoptable. Para los dispositivos Android 6.0, cualquier medio físico que no se adopte se considera portátil.
Almacenamiento adoptable
Para indicar un dispositivo de almacenamiento adoptable en fstab
, utilice el atributo encryptable=userdata
en el campo fs_mgr_flags
. Aquí hay 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 está reservada para uso futuro. El GUID del tipo de partición es 19A710A2-B3CA-11E4-B026-10604B889DCF. - una partición
android_ext
grande que está cifrada usando dm-crypt y formateada usandoext4
of2fs
dependiendo de 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, aquí hay una definición típica para dispositivos USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
La plataforma utiliza blkid
para detectar tipos de sistemas de archivos antes del montaje, y los usuarios pueden optar por formatear los medios cuando el sistema de archivos no es compatible.