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

В более ранних версиях 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