Внедряемый накопитель

В Android всегда поддерживались внешние накопители, например SD-карты. Однако раньше они использовались только для хранения файлов, поскольку не обеспечивали надежную защиту данных и могли быть извлечены в любой момент. В Android 6.0 появилась возможность адаптировать внешние носители данных, чтобы они работали как внутреннее хранилище.

При этом он форматируется и шифруется, чтобы работать только с одним устройством Android за раз. Поскольку медиаконтент тесно связан с устройством Android, на котором он был создан, на нем можно безопасно хранить как приложения, так и личные данные всех пользователей.

Когда пользователь вставляет новый носитель информации (например, SD-карту) в подходящий разъем, Android спрашивает, как он хочет использовать носитель. Они могут принять носитель, отформатировать и зашифровать его или продолжить использовать его как есть для простого хранения файлов. Если пользователь согласится, платформа предложит перенести содержимое основного общего хранилища (обычно смонтированного в /sdcard) на новое устройство, освободив ценное пространство во внутренней памяти. В отличие от традиционного хранилища, которое ограничено 2 ТБ из-за использования MBR, в адаптивном хранилище используется GPT, поэтому оно может вместить до 9 ЗБ.

Приложения можно размещать на принятых носителях данных, только если разработчик указал поддержку с помощью атрибута android:installLocation. Новые установки поддерживаемых приложений автоматически размещаются на устройстве хранения с наибольшим количеством свободного места, а пользователи могут перемещать поддерживаемые приложения между устройствами хранения в приложении Настройки. Приложения, перенесенные на съемный носитель, сохраняются, когда носитель извлекается, и возвращаются, когда он вставляется обратно.

Безопасность

Платформа случайным образом генерирует ключи шифрования для каждого объединенного устройства и сохраняет их во внутренней памяти устройства Android. Это делает объединенный носитель таким же безопасным, как и внутренняя память. Ключи связываются с принятыми устройствами на основе GUID принятого раздела.

Если на устройстве настроено шифрование на основе файлов (FBE) во внутреннем хранилище, то при использовании переносимого хранилища применяется как FBE, так и шифрование метаданных. В противном случае для переносимого хранилища используется полное шифрование диска (FDE).

Структура данных на внедряемом накопителе практически полностью повторяет структуру раздела с внутренними данными, включая метки SELinux и т. д. Если устройство Android поддерживает добавление пользователей, то внедряемый накопитель также поддерживает его с тем же уровнем изоляции, что и внутренняя память устройства.

Поскольку содержимое такого устройства хранения данных тесно связано с устройством Android, которое его приняло, ключи шифрования не должны извлекаться из родительского устройства, и поэтому устройство хранения данных нельзя подключить к другому устройству.

Если на вашем устройстве используется шифрование на основе файлов, ознакомьтесь с документацией по шифрованию на основе файлов и документацией по шифрованию метаданных, чтобы узнать, как настроить шифрование на основе файлов и шифрование метаданных на переносимом хранилище.

Производительность и стабильность

Чтобы избежать случайной потери или повреждения данных, в качестве внешних накопителей следует использовать только те, которые находятся в надежных местах, например в слоте внутри батарейного отсека или за защитной крышкой. В частности, USB-устройства, подключенные к телефону или планшету, никогда не должны рассматриваться для переноса. Распространенным исключением является внешний USB-накопитель, подключенный к устройству типа телевизора, поскольку обычно телевизор устанавливается в устойчивом месте.

Когда пользователь подключает новый накопитель, платформа проводит тестирование и сравнивает его производительность с производительностью внутреннего хранилища. Если скорость работы внешнего накопителя значительно ниже, чем у внутреннего, платформа предупреждает пользователя о возможном снижении производительности. Этот тест был разработан на основе фактического поведения ввода-вывода популярных приложений Android. В настоящее время реализация AOSP только предупреждает пользователей о превышении одного порогового значения, но производители устройств могут адаптировать это дальше, например полностью отклонять адаптацию, если карта работает очень медленно.

Устройства, используемые в качестве внутренней памяти, должны быть отформатированы с файловой системой, которая поддерживает разрешения POSIX и расширенные атрибуты, например ext4 или f2fs. Для оптимальной производительности рекомендуется использовать файловую систему f2fs для флеш-накопителей.

При периодическом обслуживании в режиме ожидания платформа отправляет команду FI_TRIM на принятые носители так же, как и на внутреннее хранилище. Текущая спецификация SD-карт не поддерживает команду DISCARD, но вместо нее ядро использует команду ERASE, которую прошивка SD-карты может использовать для оптимизации.

Тестирование

Чтобы проверить, работает ли переносимое хранилище, запустите следующий тест CTS:

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

Чтобы проверить поведение USB-накопителей и SD-карт, когда у устройства нет встроенного слота или когда USB-разъем используется для активного подключения adb, выполните следующие действия:

adb shell sm set-virtual-disk true