更快的存儲統計

在早期版本的 Android 中,系統會遍歷特定應用程序擁有的所有文件來測量磁盤使用情況。在將結果顯示給“設置”中的用戶之前,這種手動測量可能需要幾分鐘的時間來計算。

此外,清除緩存數據文件的內部算法僅查看所有應用程序的修改時間。這允許惡意應用程序通過將修改時間設置在遙遠的未來來不公平地偏愛自己而不是其他應用程序,從而降低整體用戶體驗。

為了改善這些體驗,Android 8.0 提供了利用 ext4 文件系統的“配額”支持來幾乎立即返回磁盤使用統計信息。此配額功能還通過防止任何單個應用程序使用超過 90% 的磁盤空間或 50% 的 inode 來提高系統穩定性。

執行

配額功能是installd的默認實現的一部分。 installd在特定文件系統上啟用時會自動使用配額功能。當正在測量的塊設備上未啟用或不支持配額功能時,系統會自動透明地恢復手動計算。

要在特定塊設備上啟用配額支持:

  1. 啟用CONFIG_QUOTACONFIG_QFMT_V2CONFIG_QUOTACTL內核選項。
  2. quota選項添加到 fstab 文件中的 userdata 分區:
    /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 都應返回正確的值。

調試

測試應用程序使用大小的唯一質數仔細分配磁盤空間區域。在調試這些測試時,使用它來確定任何差異的原因。例如,如果測試失敗,增量為 11MB,請檢查Utils.useSpace()方法以查看 11MB blob 是否存儲在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