Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

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 los volúmenes de almacenamiento externo físico lo maneja vold , que realiza operaciones de preparación para preparar los medios antes de exponerlos a las aplicaciones.

Nota: En Android 8.0, se MountService el MountService clase StorageManagerService a StorageManagerService .

Asignaciones de archivos

Para Android 4.2.2 y vold.fstab 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 del 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 banderas separadas por comas, no debe contener / . Los valores posibles incluyen no nonremovable y encryptable .

Para las versiones 4.3 y posteriores de Android, los diversos archivos fstab utilizados por init, vold y recovery se unificaron en el archivo /fstab.<device> . Para los volúmenes de almacenamiento externo que son 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 : mount_point sistema de archivos donde se debe montar el volumen.
  • type : el tipo de sistema de archivos en el volumen. En el caso de 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 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 no 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 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.xy versiones anteriores

El archivo de configuración storage_list.xml específico del dispositivo, que normalmente se proporciona a través de una superposición de frameworks/base , define los atributos y las limitaciones de los dispositivos de almacenamiento. El elemento <StorageList> contiene uno o más elementos <storage> , exactamente uno de los cuales debe marcarse como principal. <storage> atributos de <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 primario.
  • removable : verdadero si este soporte tiene un medio extraíble, como una tarjeta SD física.
  • emulated : verdadero si este montaje se emula y está respaldado por almacenamiento interno, posiblemente usando un demonio FUSE.
  • mtp-reserve : número de MB de almacenamiento que MTP debería reservar para almacenamiento gratuito. Solo se usa cuando la montura está marcada como emulada.
  • allowMassStorage : verdadero si este montaje 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 permiso y sin distinción entre mayúsculas y minúsculas respaldado por almacenamiento interno. El demonio FUSE proporciona una posible implementación en system/core/sdcard , que se puede agregar como un servicio init.rc específico del init.rc :

# 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 init.rc , la variable de entorno EXTERNAL_STORAGE debe definirse como la ruta al almacenamiento externo primario. 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.

Android 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:

  • El storage_list.xml superposición de recursos se ha eliminado y ya no es utilizado por el marco. Los dispositivos de almacenamiento ahora se configuran dinámicamente cuando los detecta vold .
  • 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 del 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. La inclusión del 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 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 encryptable=userdata en el campo fs_mgr_flags . Aquí tienes 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 tipo de partición GUID 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 tipo de partición GUID es 193D1EA4-B3CA-11E4-B075-10604B889DCF.

Almacenamiento portátil

En el fstab , los dispositivos de almacenamiento con el atributo voldmanaged se consideran portátiles de forma predeterminada a menos que se encryptable=userdata otro atributo como encryptable=userdata . Por ejemplo, aquí hay una definición típica de 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 montarlos, y los usuarios pueden optar por formatear los medios cuando el sistema de archivos no es compatible.