Adoptable Storage(API≧23、Android 6.0)が導入されて、SDカードの扱い方をユーザ側で指定できるようになりました。
「Adoptable Storage」について、まとめます。
※環境:Android Studio Narwhal | 2025.1.1 Patch 1
Adoptable Storage
Adoptable StorageはAPI≧23で導入された仕組みで、外部メモリーを取り込み、内部メモリーの一部のように動作させる機能です。
SDカードの使用開始時に、ユーザがSDカードの扱い方を、次の2つから選択できます。
扱い方 | 構成 | 特徴 |
---|---|---|
拡張ストレージ | ![]() | ・ストレージの容量を拡張するイメージ ・取り外しを想定しない使い方 ・フォーマットが発生 ・暗号化される(FDE or FBE) |
追加ストレージ (デフォルト) | ![]() | ・ストレージの数を追加するイメージ ・取り外しを想定する使い方 |
※デフォルト:Adaptable Storageの未使用時 ※FDE:フルディスク暗号化(Full-Disk Encryption)、API≦28 ※FBE:ファイルベースの暗号化( File-Based Encryption)、API≧29 |
SDカードスロットにSDカードが挿入されていると、ステータスバーにアイコンが表示されます。
このアイコンを起点に、選択画面へ移動できます。
拡張ストレージ
拡張ストレージは内部メモリーのストレージ容量を拡張するように、SDカードを扱います。
SDカードには、アンドロイドの標準アプリ(カメラなど)と密接に関連したメディアデータ(画像、動画など)が保存されます。
SDカードが取り外されると、標準アプリが使えません。従って、SDカードの取り外しを想定しない使い方です。
扱い方の選択
選択画面で、図のような操作を行います。


ディレクトリ構成
- dm-1 … 内部メモリー
- dm-2 … 外部メモリー(SDカード)
# df -a ※“-a”で重複したマウント元も表示 Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 2539468 1826036 713432 72% / tmpfs 1023364 468 1022896 1% /dev tmpfs 1023364 0 1023364 0% /mnt /dev/block/vde1 93016 41272 51744 45% /vendor /dev/block/dm-1 6094400 117740 5976660 2% /data /dev/block/dm-2 474580 624 473956 1% /mnt/expand/xxx /mnt/expand/xxx/media 474580 636 473944 1% /mnt/runtime/default/emulated /mnt/expand/xxx/media 474580 636 473944 1% /storage/emulated /mnt/expand/xxx/media 474580 636 473944 1% /mnt/runtime/read/emulated /mnt/expand/xxx/media 474580 636 473944 1% /mnt/runtime/write/emulated ※エミュレータ(API28)の「adb shell」で確認
- dm-34 … 内部メモリー
- dm-9 … 外部メモリー(SDカード)
# df -a ※“-a”で重複したマウント元も表示 Filesystem 1K-blocks Used Available Use% Mounted on /dev/block/dm-5 836572 771008 65564 93% / tmpfs 1006452 1260 1005192 1% /dev devpts 0 0 0 0% /dev/pts proc 0 0 0 0% /proc sysfs 0 0 0 0% /sys selinuxfs 0 0 0 0% /sys/fs/selinux tmpfs 1006452 0 1006452 0% /mnt ... tmpfs - - - - /storage /dev/block/dm-34 6082144 752616 5329528 13% /data tmpfs - - - - /linkerconfig /dev/block/dm-34 - - - - /data/user/0 ... /dev/block/dm-9 504812 116164 388648 24% /mnt/expand/2e7b2c2b-e6b9-4c5d-893e-d32119b535c0 /dev/block/dm-9 - - - - /data_mirror/data_ce/2e7b2c2b-e6b9-4c5d-893e-d32119b535c0 /dev/block/dm-9 - - - - /data_mirror/data_de/2e7b2c2b-e6b9-4c5d-893e-d32119b535c0 /dev/block/dm-9 - - - - /data_mirror/misc_ce/2e7b2c2b-e6b9-4c5d-893e-d32119b535c0 /dev/block/dm-9 - - - - /data_mirror/misc_de/2e7b2c2b-e6b9-4c5d-893e-d32119b535c0 /dev/fuse 504812 116164 388648 24% /mnt/installer/0/emulated /dev/fuse - - - - /mnt/androidwritable/0/emulated /dev/fuse - - - - /mnt/user/0/emulated /dev/fuse - - - - /storage/emulated ... ※エミュレータ(API33)の「adb shell」で確認
「storage」はOS(Android)のメモリー(RAM)上に作られたファイルシステムで、「/storage」にマウントされています。その下に、FUSEファイルシステムのemulatedがマウントされています。
FUSEはユーザモードで動作するファイルシステムです。メディアファイルに厳格なアクセス制御(誰に許可するか!)を行っています。
FUSEファイルシステムの配下になるのが、dm-9(SDカード上のファイルシステム)であると思われます。
個別ストレージ
個別ストレージはストレージの数を追加するように、SDカードを扱います。デフォルトの動作です。
SDカードには、様々な種類のデータが保存されます。
他のデバイス(携帯端末やパソコンなど)とデータの交換を行いたい場合は、SDカードを差し替えて行えます。従って、SDカードの取り外しを想定した使い方です。
扱い方の選択
選択画面で、図のような操作を行います。


ディレクトリ構成
- dm-1 … 内部メモリー
- /dev/block/vold/public:253,80 … 外部メモリー(SDカード)
# df -a ※“-a”で重複したマウント元も表示 Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 2539468 1826036 713432 72% / tmpfs 1023364 464 1022900 1% /dev tmpfs 1023364 0 1023364 0% /mnt /dev/block/vde1 93016 41272 51744 45% /vendor /dev/block/dm-1 6094400 106256 5988144 2% /data /data/media 6094400 111724 5982676 2% /mnt/runtime/default/emulated /data/media 6094400 111724 5982676 2% /storage/emulated /data/media 6094400 111724 5982676 2% /mnt/runtime/read/emulated /data/media 6094400 111724 5982676 2% /mnt/runtime/write/emulated /dev/block/vold/public:253,80 522228 40 522188 1% /mnt/media_rw/0000-0000 /mnt/media_rw/0000-0000 522228 40 522188 1% /mnt/runtime/default/0000-0000 /mnt/media_rw/0000-0000 522228 40 522188 1% /storage/0000-0000 /mnt/media_rw/0000-0000 522228 40 522188 1% /mnt/runtime/read/0000-0000 /mnt/media_rw/0000-0000 522228 40 522188 1% /mnt/runtime/write/0000-0000 ※エミュレータ(API28)の「adb shell」で確認
- dm-34 … 内部メモリー
- /dev/block/vold/public:253,81 … 外部メモリー(SDカード)
# df -a ※“-a”で重複したマウント元も表示 Filesystem 1K-blocks Used Available Use% Mounted on /dev/block/dm-5 836572 771008 65564 93% / tmpfs 1006452 1256 1005196 1% /dev devpts 0 0 0 0% /dev/pts proc 0 0 0 0% /proc sysfs 0 0 0 0% /sys selinuxfs 0 0 0 0% /sys/fs/selinux tmpfs 1006452 0 1006452 0% /mnt ... tmpfs - - - - /storage /dev/block/dm-34 6082144 897776 5184368 15% /data tmpfs - - - - /linkerconfig /dev/block/dm-34 - - - - /data/user/0 ... /dev/fuse 6082144 897776 5184368 15% /mnt/installer/0/emulated /dev/fuse - - - - /mnt/androidwritable/0/emulated /dev/fuse - - - - /mnt/user/0/emulated /dev/fuse - - - - /storage/emulated ... /dev/block/vold/public:253,81 523072 448 522624 1% /mnt/media_rw/3551-0E11 /dev/fuse 523072 448 522624 1% /mnt/installer/0/3551-0E11 /dev/fuse - - - - /mnt/androidwritable/0/3551-0E11 /dev/fuse - - - - /mnt/user/0/3551-0E11 /dev/fuse - - - - /storage/3551-0E11 /dev/block/vold/public:253,81 - - - - /mnt/pass_through/0/3551-0E11 ※エミュレータ(API33)の「adb shell」で確認
「storage」はOS(Android)のメモリー(RAM)上に作られたファイルシステムで、「/storage」にマウントされています。その下に、FUSEファイルシステムのemulatedがマウントされています。
FUSEはユーザモードで動作するファイルシステムです。メディアファイルに厳格なアクセス制御(誰に許可するか!)を行っています。
FUSEファイルシステムの配下になるのが、/data/media(内部メモリーの一部)であると思われます。
関連記事: