更快的儲存統計

在早期版本的 Android 中,系統會遍歷特定應用程式擁有的所有檔案來測量磁碟使用情況。在「設定」中向使用者顯示結果之前,這種手動測量可能需要幾分鐘的時間來計算。

此外,清除快取資料檔案的內部演算法僅查看所有應用程式的修改時間。這使得惡意應用程式可以透過將修改時間設定為遙遠的未來來不公平地偏向其他應用程序,從而降低整體用戶體驗。

為了改善這些體驗,Android 8.0 提供了利用 ext4 檔案系統的「配額」支援來幾乎立即返回磁碟使用統計資料。此配額功能還可以防止任何單一應用程式使用超過 90% 的磁碟空間或 50% 的索引節點,從而提高系統穩定性。

執行

配額功能是installd預設實作的一部分。當在特定檔案系統上啟用時, installd會自動使用配額功能。當正在測量的區塊設備上未啟用或不支援配額功能時,系統會自動且透明地恢復手動計算。

若要在特定區塊裝置上啟用配額支援:

  1. 啟用CONFIG_QUOTACONFIG_QFMT_V2CONFIG_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 都應傳回正確的值。

偵錯

測試應用程式使用唯一的素數來仔細分配磁碟空間區域的大小。調試這些測試時,請使用它來確定任何差異的原因。例如,如果測試失敗且增量為 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