外部ストレージは、vold init サービスと StorageManagerService システム サービスの組み合わせによって管理されます。物理外部ストレージ ボリュームのマウントは、ステージング オペレーションを実行してメディアをアプリに公開する前に準備する vold によって処理されます。
注: Android 8.0 では、MountService クラスの名前が StorageManagerService に変更されました。
ファイル マッピング
Android 4.2.2 以前では、デバイス固有の vold.fstab 構成ファイルによって sysfs デバイスからファイルシステムのマウントポイントへのマッピングが定義されます。各行の形式は次のとおりです。
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label: ボリュームのラベル。mount_point: ボリュームをマウントするファイルシステム パス。partition: パーティション番号(1 から始まります)。最初の使用可能なパーティションの場合は「auto」です。sysfs_path: このマウント ポイントを提供できるデバイスへの 1 つ以上の sysfs パス。スペースで区切られ、それぞれのパスは/で始まります。flags: フラグのカンマ区切りリスト(任意)。/を含めることはできません。 可能な値はnonremovableとencryptableです。
Android 4.3 以降では、init、vold、recovery で使用されるさまざまな fstab ファイルが /fstab.<device> ファイルに統合されました。vold によって管理される外部ストレージ ボリュームの場合、エントリの形式は次のとおりです。
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src: マウント ポイントを提供できるデバイスへのパス。(通常は /sys にマウントされる)sysfs の下にあります。パスは/で始まる必要があります。mount_point: ボリュームをマウントするファイルシステム パス。type: ボリューム上のファイルシステムのタイプ。外部カードの場合、通常はvfatです。mnt_flags:Voldはこのフィールドを無視します。defaultsに設定する必要があります。fs_mgr_flags:Voldは、このフィールドにvoldmanaged=フラグを含まない統合された fstab 内のすべての行を無視します。このフラグの後に、カードを記述するラベルと、パーティション番号またはautoを指定する必要があります。例:voldmanaged=sdcard:auto。 その他の可能なフラグは、nonremovable、encryptable=sdcard、noemulatedsd、encryptable=userdataです。
構成の詳細
フレームワーク レベル以上の外部ストレージ操作は、StorageManagerService を通じて処理されます。Android 6.0 における構成の変更(storage_list.xml リソース オーバーレイの削除など)により、構成の詳細は 2 つのカテゴリに分けられます。
Android 5.x 以前
デバイス固有の storage_list.xml 構成ファイル(一般的に frameworks/base オーバーレイを通じて提供される)により、ストレージ デバイスの属性と制約が定義されます。<StorageList> 要素には 1 つ以上の <storage> 要素が含まれ、そのうち 1 つだけをプライマリとしてマークする必要があります。<storage> 属性には以下が含まれます。
mountPoint: このマウントのファイルシステム パス。storageDescription: このマウントを記述する文字列リソース。primary: このマウントがプライマリ外部ストレージである場合は、true。removable: このマウントに物理 SD カードなどのリムーバブル メディアがある場合は、true。emulated: このマウントがエミュレートされ、内部ストレージにバッキングされている(通常は FUSE デーモンが使用されている)場合は、true。mtp-reserve: MTP が空きストレージ用に予約する必要があるストレージの MB 数。マウントがエミュレートされているとマークされている場合にのみ使用されます。allowMassStorage: このマウントが USB マスストレージ経由で共有できる場合は、true。maxFileSize: MB 単位の最大ファイルサイズ。
各デバイスは、内部ストレージにバッキングされたファイルシステムをエミュレートすることで外部ストレージを提供します。ファイルシステムでは、大文字と小文字の区別はなく、パーミッションの指定はありません。可能な実装の 1 つは、FUSE デーモンによって system/core/sdcard で提供される実装です。これはデバイス固有の init.rc サービスとして追加できます。
# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
class late_start
ここで、source_path はバッキング内部ストレージであり、dest_path はターゲット マウント ポイントです。
デバイス固有の init.rc スクリプトを構成する場合、EXTERNAL_STORAGE 環境変数をプライマリ外部ストレージへのパスとして定義する必要があります。また、/sdcard のパスも、通常はシンボリック リンクを使用して、同じ場所に解決する必要があります。デバイスがプラットフォームのアップデートの合間に外部ストレージの場所を調整する場合は、シンボリック リンクを作成して古いパスが機能し続けるようにする必要があります。
Android 6.0
ストレージ サブシステムの構成がデバイス固有の fstab ファイルに集約されました。また、いくつかの古い静的構成ファイルと変数が削除され、より動的な動作がサポートされるようになりました。
storage_list.xmlリソース オーバーレイが削除され、フレームワークで使用されなくなりました。 ストレージ デバイスは、voldによって検出されたときに動的に構成されるようになりました。EMULATED_STORAGE_SOURCE/TARGET環境変数が削除され、Zygote によってユーザー固有のマウント ポイントを構成するために使用されることがなくなりました。その代わりに、ユーザーの区分はユーザー固有の GID で実施され、プライマリ共有ストレージは実行時にvoldによって所定の場所にマウントされるようになりました。- デベロッパーは、自身のユースケースに応じて、引き続き動的または静的にパスを構築できます。UUID をパスに含めると、各カードが特定され、場所がデベロッパーにとってより明確になります(たとえば、
/storage/ABCD-1234/report.txtは明らかに/storage/DCBA-4321/report.txtとは異なるファイルです)。
- デベロッパーは、自身のユースケースに応じて、引き続き動的または静的にパスを構築できます。UUID をパスに含めると、各カードが特定され、場所がデベロッパーにとってより明確になります(たとえば、
- ハードコードされた FUSE サービスはデバイス固有の
init.rcファイルから削除されました。その代わりに、必要に応じてvoldから動的にフォークされます。
上記の構成の変更に加えて、Android 6.0 では Adoptable Storage という概念が導入されました。Android 6.0 デバイスでは、Adoptable Storage でない物理メディアはポータブル ストレージと見なされます。
Adoptable Storage
Adoptable Storage デバイスを fstab に表示するには、fs_mgr_flags フィールドの encryptable=userdata 属性を使用します。一般的な定義は次のとおりです。
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
ストレージ デバイスが Adoptable Storage として取り込まれると、プラットフォームはコンテンツを消去し、次の 2 つのパーティションを定義する GUID パーティション テーブルを書き込みます。
- サイズの小さな空の
android_metaパーティション。将来の使用のために予約されます。パーティション タイプの GUID は 19A710A2-B3CA-11E4-B026-10604B889DCF です。 - サイズの大きな
android_extパーティション。dm-crypt で暗号化され、カーネルの機能に応じてext4またはf2fsでフォーマットされます。パーティション タイプの GUID は 193D1EA4-B3CA-11E4-B075-10604B889DCF です。
ポータブル ストレージ
fstab では、voldmanaged 属性を持つストレージ デバイスは、encryptable=userdata のような別の属性が定義されていない限り、デフォルトでポータブルと見なされます。例として、USB OTG デバイスの一般的な定義を次に示します。
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults
voldmanaged=usb:auto
プラットフォームは blkid を使用して、マウントする前にファイルシステム タイプを検出します。ファイルシステムがサポートされていない場合、ユーザーはメディアのフォーマット処理を選択できます。