Configuración del dispositivo

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 incluyen nonremovable y encryptable .

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 ser vfat .
  • mnt_flags : Vold ignora este campo y debe establecerse en los defaults
  • fs_mgr_flags : Vold ignora cualquier línea en el fstab unificado que no incluya el indicador voldmanaged= en este campo. Esta bandera debe ir seguida de una etiqueta que describa la tarjeta y un número de partición o la palabra auto . Aquí hay un ejemplo: voldmanaged=sdcard:auto . Otros indicadores posibles son nonremovable , encryptable=sdcard , noemulatedsd y encryptable=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 cuando vold 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, y vold 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 servicios FUSE codificados se han eliminado de los archivos init.rc específicos del dispositivo y, en su lugar, se bifurcan dinámicamente desde vold 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 usando ext4 o f2fs 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.