Configuración del dispositivo

El almacenamiento externo se administra mediante una combinación del init vold y el servicio del sistema StorageManagerService. Montaje de de los volúmenes de almacenamiento externo físico son controlados por vold, que Realiza operaciones de etapa de pruebas para preparar el contenido multimedia antes de exponerlo a las apps.

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

Asignaciones de archivos

Para Android 4.2.2 y versiones anteriores, la vold.fstab específica del dispositivo El archivo de configuración define las asignaciones de dispositivos sysfs a activación del sistema de archivos puntos, y cada línea sigue este formato:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • label: Etiqueta para el volumen.
  • mount_point: Es la ruta de acceso del sistema de archivos en la que se debe activar el volumen.
  • partition: Número de partición (basado en 1) o “automático” para la primera partición que se pueda usar.
  • sysfs_path: Una o más rutas de acceso de sysfs a dispositivos que pueden proporcionar este soporte punto. Deben estar separadas por espacios y cada una debe comenzar con /.
  • flags: Es la lista de marcas opcionales separadas por comas, no debe contener /. Entre los valores posibles, se incluyen nonremovable y encryptable.

Para las versiones 4.3 y posteriores de Android, los distintos archivos fstab utilizados por init, vold y la recuperación se unificaron en el archivo /fstab.<device>. Para uso externo volúmenes de almacenamiento administrados por vold, las entradas deben tener con el siguiente formato:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src: Es una ruta de acceso en sysfs (generalmente 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 en el volumen. En el caso de las tarjetas externas, suele ser vfat.
  • mnt_flags: Vold ignora este campo y debe configurarse para defaults
  • fs_mgr_flags: Vold ignora cualquier línea en la fstab unificada que no incluyen la marca voldmanaged= en este campo. Esta marca debe estará seguida de una etiqueta que describe la tarjeta y un número de partición o la palabra auto Este es un ejemplo: voldmanaged=sdcard:auto. Otras marcas posibles son nonremovable, encryptable=sdcard, noemulatedsd y encryptable=userdata.

Detalles de configuración

Se controlan las interacciones de almacenamiento externo en el nivel del framework y por encima de él. 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), el de configuración de Terraform se dividen en dos categorías.

Android 5.x y versiones anteriores

La configuración de storage_list.xml específica del dispositivo , generalmente proporcionado a través de una superposición de frameworks/base, define la atributos y restricciones de los dispositivos de almacenamiento. El elemento <StorageList> contiene uno o más elementos <storage>, de los cuales se debe marcar exactamente uno primario. Entre los atributos de <storage>, se incluyen los siguientes:

  • mountPoint: Es la ruta de acceso del sistema de archivos de esta activación.
  • storageDescription: Es el recurso de cadenas que describe esta activación.
  • primary: Es verdadero si esta activación es el almacenamiento externo principal.
  • removable: Es verdadero si este soporte tiene medios extraíbles, como una tarjeta SD física. tarjeta.
  • emulated: Es verdadero si este soporte se emula y está respaldado por el almacenamiento interno. tal vez con un daemon FUSE.
  • mtp-reserve: Cantidad de MB de almacenamiento que MTP debe reservar de forma gratuita y almacenamiento de los datos. Solo se usa cuando el soporte se marca como emulado.
  • allowMassStorage: Es verdadero si este soporte se puede compartir mediante el 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 permisos respaldado por el almacenamiento interno. Una posible la proporciona el daemon del FUSE en system/core/sdcard, que puede agregarse 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 copia de seguridad y dest_path es el almacenamiento interno de copia de seguridad. punto de activación de destino.

Cuando configuras una secuencia de comandos init.rc específica del dispositivo, el EXTERNAL_STORAGE variable de entorno debe definirse como la ruta de acceso a la red y almacenamiento de los datos. 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 de la plataforma, se deben crear symlinks para que las rutas antiguas sigan funcionando.

Android 6.0

La configuración del subsistema de almacenamiento ahora se concentra archivo fstab específico del dispositivo y se cargaron varios archivos/variables históricos de configuración estática se quitaron 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 los detecta vold.
  • 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 su lugar, la separación de usuarios ahora se aplica con GID específicos del usuario, y el almacenamiento compartido principal se activa en el lugar mediante vold durante el tiempo de ejecución.
    • Los desarrolladores pueden seguir creando rutas de forma dinámica o estática según su caso de uso. Incluir el UUID en la ruta identifica cada tarjeta que se debe crear una ubicación 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 de FUSE codificados 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 la noción de y el almacenamiento adoptable. Para dispositivos con Android 6.0, cualquier medio físico que no sea adoptado 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 Tabla de particiones GUID que define dos particiones:

  • una pequeña partición de 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 funciones 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 utilice otro atributo. como encryptable=userdata. Por ejemplo, esta es 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 los tipos de sistemas de archivos antes de activarse, y los usuarios pueden optar por formatear el cuando el sistema de archivos no es compatible.