Configuración del dispositivo

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

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, es vfat.
  • mnt_flags: Vold ignora este campo y se debe establecer en defaults.
  • fs_mgr_flags: Vold ignora las líneas del fstab unificado que no incluyen la marca voldmanaged= en este campo. A esta marca debe seguirle una etiqueta que describa la tarjeta y un número de partición o la palabra auto. A continuación, se muestra 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 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 cuando vold 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, y vold 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 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 desde vold 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 con ext4 o f2fs, 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.