在舊版 Android 中,系統會遍歷特定應用程式擁有的所有檔案,以評估磁碟使用量。這項手動測量作業可能需要幾分鐘的時間才能完成,之後才會在「設定」中向使用者顯示結果。
此外,清除快取資料檔案的內部演算法只會查看所有應用程式的修改時間。這讓惡意應用程式可以設定在很久以後的修改時間,藉此不公平地偏袒自己,進而降低整體使用者體驗。
為改善這些體驗,Android 8.0 提供 ext4 檔案系統的「配額」支援功能,幾乎可立即傳回磁碟使用率統計資料。這項配額功能還可防止任何單一應用程式使用超過 90% 的磁碟空間或 50% 的 inode,進而提升系統穩定性。
實作
配額功能是 installd
預設實作的一部分。installd
在特定檔案系統上啟用後,會自動使用配額功能。如果所測量區塊裝置未啟用或不支援配額功能,系統會自動且透明地恢復手動計算。
如要在特定區塊裝置上啟用配額支援功能,請按照下列步驟操作:
- 啟用
CONFIG_QUOTA
、CONFIG_QFMT_V2
和CONFIG_QUOTACTL
核心選項。 - 在 fstab 檔案中,將
quota
選項新增至 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 都應傳回正確的值。
偵錯
測試應用程式會使用大小為質數的獨特值,仔細分配磁碟空間區域。在偵錯這些測試時,請使用這項資訊判斷任何差異的原因。舉例來說,如果測試失敗且差異為 11 MB,請檢查 Utils.useSpace()
方法,確認 11 MB 的 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