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

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

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

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

Реализация

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

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

  1. Включите параметры ядра CONFIG_QUOTA, CONFIG_QFMT_V2 и CONFIG_QUOTACTL.
  2. Добавьте параметр quota в раздел userdata в файле 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 или более поздней версии. Если вы включаете эту функцию в других файловых системах или в более ранних версиях ядра, производители устройств должны проверить ее и убедиться, что статистика собирается корректно.

Не требуется специальная поддержка оборудования.

Проверка

В CTS есть тесты в разделе StorageHostTest, которые используют общедоступные 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