Configuración del dispositivo

El almacenamiento externo se administra mediante una combinación del servicio vold init y el servicio del sistema StorageManagerService . El montaje de volúmenes físicos de almacenamiento externo está a cargo de vold , que realiza operaciones de preparación para preparar los medios antes de exponerlos a las aplicaciones.

Nota: En Android 8.0, se cambió el nombre de la clase MountService a StorageManagerService .

Asignaciones de archivos

Para Android 4.2.2 y versiones anteriores, el archivo de configuración vold.fstab específico del dispositivo define las asignaciones de los dispositivos sysfs a los 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 separada por comas de banderas, no debe contener / . Los valores posibles incluyen nonremovable y encryptable .

Para las versiones de Android 4.3 y posteriores, los diversos archivos fstab utilizados por init, vold y recovery se unificaron en el archivo /fstab.<device> . Para los 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 (generalmente 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, esto 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 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 . Otras marcas posibles son nonremovable , encryptable=sdcard , noemulatedsd y encryptable=userdata .

Detalles de configuración

Las interacciones de almacenamiento externo en y por encima del nivel del marco se manejan a través 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 anteriores

El archivo de configuración storage_list.xml específico del dispositivo, generalmente proporcionado a través de una superposición de frameworks/base , define los atributos y las 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 montaje 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 esta montura se puede compartir a través del almacenamiento masivo USB.
  • maxFileSize : tamaño máximo de archivo en MB.

Los dispositivos pueden proporcionar almacenamiento externo al emular 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 las 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áticos históricos para admitir un comportamiento más dinámico:

  • La superposición de recursos storage_list.xml se eliminó y el marco ya no la usa. Los dispositivos de almacenamiento ahora se configuran dinámicamente cuando los detecta vold .
  • Las variables de entorno EMULATED_STORAGE_SOURCE/TARGET se eliminaron y Zygote ya no las usa para configurar puntos de montaje específicos del usuario. En su lugar, ahora se aplica la separación de usuarios con GID específicos de usuario, y vold monta el almacenamiento compartido principal en su lugar durante el 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 de forma rígida 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 con 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 , use el atributo encryptable=userdata en el campo fs_mgr_flags . He aquí 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 gran partición android_ext que está encriptada 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 usa 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.