外部ストレージは、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
を使用して、マウントする前にファイルシステム タイプを検出します。ファイルシステムがサポートされていない場合、ユーザーはメディアのフォーマット処理を選択できます。