Более быстрое хранение статистики

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

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

Чтобы улучшить эти возможности, Android 8.0 предлагает использовать поддержку «квот» файловой системы ext4 для почти мгновенного возврата статистики использования диска. Эта функция квот также повышает стабильность системы, не позволяя одному приложению использовать более 90% дискового пространства или 50% индексных дескрипторов.

Выполнение

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

Чтобы включить поддержку квот на конкретном блочном устройстве:

  1. Включите параметры ядра CONFIG_QUOTA , CONFIG_QFMT_V2 и CONFIG_QUOTACTL .
  2. Добавьте параметр 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