В более ранних версиях Android система просматривала все файлы, принадлежащие определенному приложению, для измерения использования диска. Вычисление этого ручного измерения может занять несколько минут, прежде чем результаты будут отображены пользователям в настройках.
Кроме того, внутренний алгоритм очистки кэшированных файлов данных учитывал только время изменения во всех приложениях. Это позволяло вредоносным приложениям ухудшать общее впечатление от пользователя, устанавливая измененное время в далеком будущем, чтобы несправедливо отдавать предпочтение другим приложениям.
Чтобы улучшить эти возможности, Android 8.0 предлагает использовать поддержку «квот» файловой системы ext4 для почти мгновенного возврата статистики использования диска. Эта функция квот также повышает стабильность системы, не позволяя одному приложению использовать более 90% дискового пространства или 50% индексных дескрипторов.
Выполнение
Функция квот является частью реализации installd по умолчанию. installd автоматически использует функцию квот, если она включена в определенной файловой системе. Система автоматически и прозрачно возобновляет расчет вручную, когда функция квоты не включена или не поддерживается на измеряемом блочном устройстве.
Чтобы включить поддержку квот на конкретном блочном устройстве:
- Включите параметры ядра
CONFIG_QUOTA,CONFIG_QFMT_V2иCONFIG_QUOTACTL. - Добавьте параметр
quotaв раздел пользовательских данных в файле fstab:/dev/block/platform/soc/624000.ufshc/by-name/userdata /data ext4 noatime,nosuid,nodev,barrier=1,noauto_da_alloc latemount,wait,check,formattable,fileencryption=ice,quota
Опцию fstab можно безопасно включать или отключать на существующих устройствах. Во время первой загрузки после изменения параметра fstab fsmgr принудительно выполняет проход fsck для обновления всех структур данных квот, что может привести к тому, что первая загрузка может занять немного больше времени. Последующие загрузки не будут затронуты.
Поддержка квот была протестирована только на ext4 и Linux 3.18 или выше. При включении в других файловых системах или в более старых версиях ядра производители устройств несут ответственность за тестирование и проверку правильности статистики.
Никакой специальной аппаратной поддержки не требуется.
Валидация
В StorageHostTest есть тесты CTS, которые используют общедоступные API для измерения использования диска. Ожидается, что эти API будут возвращать правильные значения независимо от того, включена или отключена поддержка квот.
Отладка
Тестовое приложение тщательно распределяет области дискового пространства, используя уникальные простые числа для определения размера. При отладке этих тестов используйте это, чтобы определить причину любых несоответствий. Например, если тест не пройден с разницей в 11 МБ, проверьте метод Utils.useSpace() и убедитесь, что большой двоичный объект размером 11 МБ был сохранен в getExternalCacheDir() .
Существуют также некоторые внутренние тесты, которые могут быть полезны для отладки, но для их прохождения может потребоваться отключение проверок безопасности:
runtest -x frameworks/base/services/tests/servicestests/ \ src/com/android/server/pm/InstallerTest.javaadb shell /data/nativetest64/installd_utils_test/installd_utils_testadb shell /data/nativetest64/installd_cache_test/installd_cache_testadb shell /data/nativetest64/installd_service_test/installd_service_test