以前のバージョンの Android では、ディスク使用量を測定する際に、システムが特定のアプリに帰属するすべてのファイルを走査していました。このような手動での測定では、計算が完了し設定画面でユーザーに結果が表示されるまでに数分を要する場合がありました。
また、キャッシュされたデータファイルを消去する内部アルゴリズムでは、すべてのアプリの変更時刻のみを確認していました。したがって、悪意のあるアプリが変更時刻を大幅に先の時刻に設定し、公平性を損なう手法により他のアプリより有利な状況を得ることで、ユーザー エクスペリエンスが全体的に低下するおそれがありました。
このような事態を改善するため、Android 8.0 では、ext4 ファイルシステムでサポートされている割り当て機能を利用して、ディスク使用量の統計情報がほぼ即座に返されるようにしています。また、この割り当て機能では、1 つのアプリがディスク容量の 90% 超または i ノードの 50% 超を使用しないようにすることで、システムの安定性も改善されます。
実装
割り当て機能は、installd
のデフォルト実装に含まれています。installd
は、特定のファイルシステムで有効にされると、自動的に割り当て機能を使用します。割り当て機能が有効になっていないか、測定対象のブロック デバイスでサポートされていない場合、システムは自動的、透過的に手動計算を再開します。
特定のブロック デバイスで割り当てのサポートを有効にするには:
- カーネル オプション
CONFIG_QUOTA
、CONFIG_QFMT_V2
、CONFIG_QUOTACTL
を有効にします。 - fstab ファイルの userdata パーティションに
quota
オプションを追加します。/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 以降のみです。他のファイルシステムまたは古いカーネル バージョンで割り当てを有効にする場合は、デバイス メーカーで統計情報の正確性を厳密にテストする必要があります。
特別なハードウェア サポートは必要ありません。
検証
各種の CTS テストが StorageHostTest
に用意されており、公開の 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