Almacenamiento adoptable

Android siempre admitió accesorios de almacenamiento externo (como tarjetas SD), pero estos accesorios se limitaron históricamente al almacenamiento de archivos simple debido a su impermanencia esperada y a la protección de datos mínima que se ofrecía al almacenamiento externo tradicional. Android 6.0 introdujo la capacidad de adoptar medios de almacenamiento externo para que actúen como almacenamiento interno.

Cuando se adopta un medio de almacenamiento externo, se formatea y encripta para que solo funcione con un dispositivo Android a la vez. Debido a que el contenido multimedia está fuertemente vinculado al dispositivo Android que lo adoptó, puede almacenar de forma segura apps y datos privados para todos los usuarios.

Cuando los usuarios insertan un nuevo medio de almacenamiento (como una tarjeta SD) en una ubicación adoptable, Android les pregunta cómo quieren usar el medio. Pueden optar por adoptar el contenido multimedia, que lo formatea y encripta, o pueden seguir usándolo tal como está para el almacenamiento de archivos simple. Si deciden adoptarlo, la plataforma ofrece migrar el contenido de almacenamiento compartido principal (por lo general, activado en /sdcard) al nuevo contenido multimedia, lo que libera espacio valioso en el almacenamiento interno. A diferencia del almacenamiento tradicional, que se limita a 2 TB debido al uso de MBR, el almacenamiento adoptable usa GPT y, por lo tanto, tiene un límite de almacenamiento de archivos de alrededor de 9 ZB.

Las apps se pueden colocar en medios de almacenamiento adoptados solo cuando el desarrollador indicó compatibilidad a través del atributo android:installLocation. Las instalaciones nuevas de apps compatibles se colocan automáticamente en el dispositivo de almacenamiento con más espacio libre, y los usuarios pueden mover apps compatibles entre dispositivos de almacenamiento en la app de Configuración. Las apps que se mueven al contenido multimedia adoptado se recuerdan mientras se expulsa el contenido multimedia y se vuelven a mostrar cuando se vuelve a insertar.

Seguridad

La plataforma genera claves de encriptación de forma aleatoria para cada dispositivo adoptado y las almacena en el almacenamiento interno del dispositivo Android. Esto hace que el contenido multimedia adoptado sea tan seguro como el almacenamiento interno. Las claves se asocian con los dispositivos adoptados según el GUID de la partición adoptada.

Si el dispositivo está configurado para usar la encriptación basada en archivos (FBE) en su almacenamiento interno, el almacenamiento adoptable usa FBE y encriptación de metadatos. De lo contrario, el almacenamiento adoptable usa la encriptación de disco completo (FDE).

El diseño en el disco del dispositivo adoptado refleja de cerca la partición de datos interna, incluidas las etiquetas de SELinux, etcétera. Cuando se admite la función multiusuario en el dispositivo Android, el dispositivo de almacenamiento adoptado también admite la función multiusuario con el mismo nivel de aislamiento que el almacenamiento interno.

Debido a que el contenido de un dispositivo de almacenamiento adoptado está fuertemente vinculado al dispositivo Android que lo adoptó, las claves de encriptación no se deben poder extraer del dispositivo principal y, por lo tanto, el dispositivo de almacenamiento no se puede activar en ningún otro lugar.

Si tu dispositivo usa FBE, consulta la documentación de FBE y la documentación de encriptación de metadatos para obtener información sobre cómo configurar FBE y la encriptación de metadatos en el almacenamiento adoptable.

Rendimiento y estabilidad

Solo se deben considerar para la adopción los medios de almacenamiento externos en ubicaciones estables, como una ranura dentro de un compartimiento de batería o detrás de una cubierta protectora, para evitar la pérdida o corrupción accidental de datos. En particular, los dispositivos USB conectados a un teléfono o una tablet nunca deben considerarse para su adopción. Una excepción común sería una unidad USB externa conectada a un dispositivo tipo TV, ya que, por lo general, toda la TV se instala en una ubicación estable.

Cuando un usuario adopta un nuevo dispositivo de almacenamiento, la plataforma ejecuta una comparativa y compara su rendimiento con el almacenamiento interno. Si el dispositivo adoptado es mucho más lento que el almacenamiento interno, la plataforma le advierte al usuario que es posible que la experiencia se vea afectada. Esta comparativa se derivó del comportamiento real de E/S de las apps populares para Android. Actualmente, la implementación de AOSP solo advertirá a los usuarios más allá de un solo umbral, pero los fabricantes de dispositivos pueden adaptar esto aún más, por ejemplo, rechazar la adopción por completo si la tarjeta es extremadamente lenta.

Los dispositivos adoptados deben estar formateados con un sistema de archivos que admita permisos y atributos extendidos de POSIX, como ext4 o f2fs. Para obtener un rendimiento óptimo, se recomienda el sistema de archivos f2fs para dispositivos de almacenamiento basados en memoria flash.

Cuando se realiza el mantenimiento inactivo periódico, la plataforma emite FI_TRIM al contenido multimedia adoptado, al igual que lo hace para el almacenamiento interno. La especificación actual de la tarjeta SD no admite el comando DISCARD, pero el kernel recurre al comando ERASE, que el firmware de la tarjeta SD puede usar con fines de optimización.

Prueba

Para probar que el almacenamiento adoptable funcione, ejecuta esta prueba de CTS:

cts-tradefed run commandAndExit cts-dev \
    -m CtsAppSecurityHostTestCases \
    -t android.appsecurity.cts.AdoptableHostTest

Para verificar el comportamiento de las unidades USB y las tarjetas SD cuando un dispositivo no tiene una ranura integrada o cuando se usa el conector USB para una conexión adb activa, usa lo siguiente:

adb shell sm set-virtual-disk true