従来のストレージ

Android 外部ストレージ HAL アイコン

Android は、不変の POSIX パーミッション クラスとモードを備えた大文字と小文字を区別しないファイル システムとして定義されている従来のストレージを備えたデバイスをサポートしています。従来のストレージの概念には、エミュレートされたポータブル ストレージが含まれます。ポータブル ストレージは、システムに採用されていない外部ストレージとして定義されているため、フォーマットも暗号化も特定のデバイスに結び付けられていません。従来の外部ストレージは、保存されたデータに対して最小限の保護を提供するため、システム コードは機密データを外部ストレージに保存しないでください。具体的には、構成ファイルとログ ファイルは、効果的に保護できる内部ストレージにのみ保存する必要があります。

マルチユーザー外部ストレージ

Android 4.2 以降、デバイスは複数のユーザーをサポートできるようになり、外部ストレージは次の制約を満たす必要があります。

  • 各ユーザーは、独自の分離されたプライマリ外部ストレージを持つ必要があり、他のユーザーのプライマリ外部ストレージにアクセスできてはなりません。
  • /sdcardパスは、プロセスが実行されているユーザーに基づいて、正しいユーザー固有のプライマリ外部ストレージに解決される必要があります。
  • Android/obbディレクトリ内の大きな OBB ファイルのストレージは、最適化として複数のユーザー間で共有される場合があります。
  • セカンダリ外部ストレージは、合成されたアクセス許可で許可されているパッケージ固有のディレクトリを除き、アプリによって書き込み可能であってはなりません。

この機能のデフォルトのプラットフォーム実装では、Linux カーネル名前空間を活用して、Zygote でフォークされたプロセスごとに分離されたマウント テーブルを作成し、バインド マウントを使用して、正しいユーザー固有のプライマリ外部ストレージをそのプライベート名前空間に提供します。

起動時に、システムは単一のエミュレートされた外部ストレージ FUSE デーモンをEMULATED_STORAGE_SOURCEにマウントしますが、これはアプリから隠されています。 Zygote がフォークした後、アプリの外部ストレージ パスが正しく解決されるように、FUSE デーモンの下から適切なユーザー固有のサブディレクトリをEMULATED_STORAGE_TARGETにバインド マウントします。アプリには他のユーザーのストレージ用のアクセス可能なマウント ポイントがないため、アプリを起動したユーザーのストレージにしかアクセスできません。

また、この実装では、共有サブツリー カーネル機能を使用して、マウント イベントをデフォルトのルート名前空間からアプリの名前空間に伝達します。これにより、ASEC コンテナーや OBB マウントなどの機能が正しく動作し続けることが保証されます。これは、rootfs を共有としてマウントし、Zygote 名前空間が作成されるたびにそれをスレーブとして再マウントすることによって行われます。

複数の外部ストレージ デバイス

Android 4.4 以降では、 Context.getExternalFilesDirs Context.getExternalFilesDirs()Context.getExternalCacheDirs() 、およびContext.getObbDirs() ) を通じて、複数の外部ストレージ デバイスがデベロッパーに表示されます。

これらの API を介して表示される外部ストレージ デバイスは、デバイスの半永久的な部分 (バッテリー コンパートメントの SD カード スロットなど) である必要があります。開発者は、これらの場所に保存されたデータが長期間にわたって利用できることを期待しています。このため、一時的なストレージ デバイス (USB 大容量ストレージ ドライブなど) は、これらの API を使用して表示しないでください。

WRITE_EXTERNAL_STORAGEパーミッションは、デバイス上のプライマリ外部ストレージへの書き込みアクセスのみを許可する必要があります。アプリは、合成されたアクセス許可で許可されているパッケージ固有のディレクトリを除き、セカンダリ外部ストレージ デバイスへの書き込みを許可してはなりません。このように書き込みを制限すると、アプリケーションのアンインストール時にシステムがファイルをクリーンアップできるようになります。

USB メディアのサポート

Android 6.0 は、USB フラッシュ ドライブなど、デバイスに短時間しか接続されないポータブル ストレージ デバイスをサポートしています。ユーザーが新しいポータブル デバイスを挿入すると、プラットフォームはそのデバイスのコンテンツをコピーまたは管理できるようにする通知を表示します。

Android 6.0 では、採用されていないデバイスはすべてポータブルと見なされます。ポータブル ストレージは短時間しか接続されないため、プラットフォームはメディア スキャンなどの負荷の高い操作を回避します。サードパーティ アプリは、ストレージ アクセス フレームワークを介してポータブル ストレージ上のファイルを操作する必要があります。プライバシーとセキュリティ上の理由から、直接アクセスは明示的にブロックされます。