Android всегда поддерживал внешние аксессуары для хранения данных (например, SD-карты), но исторически эти аксессуары ограничивались простым хранилищем файлов из-за их ожидаемого непостоянства и минимальной защиты данных, предлагаемой традиционным внешним хранилищем . В Android 6.0 появилась возможность использовать внешние носители данных в качестве внутреннего хранилища.
Когда используется внешний носитель, он форматируется и шифруется для одновременной работы только с одним устройством Android. Поскольку мультимедиа тесно привязано к устройству Android, на котором оно используется, оно может безопасно хранить как приложения, так и личные данные всех пользователей.
Когда пользователи вставляют новый носитель данных (например, SD-карту) в подходящее место, Android спрашивает их, как они хотят использовать носитель. Они могут выбрать носитель, который его форматирует и шифрует, или могут продолжать использовать его как есть для простого хранения файлов. Если они решат принять решение, платформа предлагает перенести содержимое основного общего хранилища (обычно смонтированного в /sdcard
) на недавно принятый носитель, освобождая ценное пространство во внутренней памяти. В отличие от традиционного хранилища, объем которого ограничен 2 ТБ из-за использования MBR , адаптируемое хранилище использует GPT и, следовательно, имеет ограничение на хранилище файлов ~ 9ZB.
Приложения можно размещать на принятых носителях только в том случае, если разработчик указал поддержку через атрибут android:installLocation
. Новые установки поддерживаемых приложений автоматически размещаются на устройстве хранения с наибольшим количеством свободного места, и пользователи могут перемещать поддерживаемые приложения между устройствами хранения в приложении «Настройки» . Приложения, перемещенные на принятый носитель, запоминаются при извлечении носителя и возвращаются при повторной вставке носителя.
Безопасность
Платформа случайным образом генерирует ключи шифрования для каждого принятого устройства и сохраняет их во внутренней памяти устройства Android. Это фактически делает принятый носитель таким же безопасным, как и внутреннее хранилище. Ключи связаны с принятыми устройствами на основе принятого GUID раздела.
Если устройство настроено на использование файлового шифрования (FBE) во внутренней памяти, то в используемом хранилище используется как FBE, так и шифрование метаданных . В противном случае в приемлемом хранилище используется полнодисковое шифрование (FDE).
Расположение на диске принятого устройства точно отражает внутренний раздел данных, включая метки SELinux и т. д. Если на устройстве Android поддерживается многопользовательский режим, принятое устройство хранения также поддерживает многопользовательский режим с тем же уровнем изоляции, что и внутреннее хранилище.
Поскольку содержимое принятого устройства хранения сильно привязано к устройству Android, которое его приняло, ключи шифрования не должны быть извлечены из родительского устройства, и, следовательно, устройство хранения не может быть смонтировано где-либо еще.
Если ваше устройство использует FBE, см. документацию FBE и документацию по шифрованию метаданных, чтобы узнать, как настроить FBE и шифрование метаданных на подходящем хранилище.
Производительность и стабильность
Во избежание случайной потери или повреждения данных следует рассматривать возможность использования только внешних носителей данных, находящихся в устойчивых местах, таких как слот внутри батарейного отсека или за защитной крышкой. В частности, никогда не следует рассматривать возможность использования 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