신속한 저장소 통계

이전 버전의 Android에서는 시스템이 특정 앱에 의해 소유된 모든 파일을 순회하여 디스크 사용량을 측정했습니다. 이러한 수동 측정에는 설정에서 사용자에게 결과를 표시하기 전까지 몇 분의 컴퓨팅 시간이 소요될 수 있습니다.

또한 캐시된 데이터 파일을 지우기 위한 내부 알고리즘이 모든 앱에 걸쳐 수정된 시간만 감안했습니다. 따라서 악성 앱이 수정된 시간을 아주 먼 미래로 설정하고 해당 앱이 다른 앱보다 선호될 수 있도록 하여 전반적인 사용자 경험을 저하시킬 수 있었습니다.

이러한 경험을 개선하기 위해 Android 8.0은 ext4 파일 시스템의 '할당량' 지원을 활용하여 디스크 사용 통계를 거의 즉각적으로 반환합니다. 또한 이 할당량 기능은 단일 앱에서 디스크 공간의 90% 또는 inode의 50% 이상을 사용하지 못하도록 하여 시스템 안정성을 개선합니다.

구현

할당량 기능은 installd의 기본 구현의 일부입니다. installd는 특정 파일 시스템에 사용 설정되면 자동으로 할당량 기능을 사용합니다. 시스템은 할당량 기능이 사용 설정되지 않았거나 측정 중인 블록 기기에서 지원되지 않을 경우 수동 계산을 자동으로 투명하게 재개합니다.

특정 블록 기기에 할당량 지원을 사용 설정하는 방법은 다음과 같습니다.

  1. CONFIG_QUOTA, CONFIG_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