Приемлемое хранилище

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

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

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

Приложения можно размещать на принятых носителях только в том случае, если разработчик указал поддержку через атрибут 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