В более ранних версиях 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.java
adb shell /data/nativetest64/installd_utils_test/installd_utils_test
adb shell /data/nativetest64/installd_cache_test/installd_cache_test
adb shell /data/nativetest64/installd_service_test/installd_service_test