更快地获得存储统计信息

在早期版本的 Android 中,系统会遍历特定应用拥有的所有文件以测量磁盘使用情况。此手动测量过程可能需要几分钟的计算时间,然后才能在“设置”中向用户显示结果。

此外,清除缓存数据文件的内部算法仅查看所有应用的修改时间。这使得恶意应用可以通过将修改时间设置在遥远的未来以使其不当地拥有高于其他应用的优先级,从而降低整体用户体验。

为了提升这些体验,Android 8.0 会询问是否利用 ext4 文件系统的“配额”支持来几乎即时地返回磁盘使用情况统计信息。此配额功能还可以防止任何单个应用使用超过 90% 的磁盘空间或 50% 的索引节点,从而提高系统的稳定性。

实现

配额功能是 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