Androidのストレージ領域の取り扱いについて(Adoptable Storageとは)

23:00

私がAndroidの中身について触りだしたのが2012年後期モデルのXperia GXからですが、Androidのストレージ領域の扱いについて当時のモデルから今に至るまで何度か設計に変更がありました。

内蔵ストレージ

GXの頃は、内蔵ストレージ(=ユーザーが動画や音楽などを置いておく16GBやら32GBの場所=/sdcard)は、一つのeMMCチップ上で15番目のパーティションとして用意されていました。GXのパーティション構成は以下のようになっています。

Number  Start (sector)    End (sector)  Size       Code  Name

   1             256            4351   2.0 MiB     FFFF  TA

   2            4352            7423   1.5 MiB     FFFF  Boot

   3            7424           10495   1.5 MiB     FFFF  Boot2

   4           12288           53247   20.0 MiB    FFFF  Kernel

   5           53248           55295   1024.0 KiB  FFFF  TZ

   6           57344           63487   3.0 MiB     FFFF  modemst1

   7           65536           71679   3.0 MiB     FFFF  modemst2

   8           73728           79871   3.0 MiB     FFFF  fsg

   9           79872           90111   5.0 MiB     8300  ramdump

  10           90112          106495   8.0 MiB     8300  apps_log

  11          106496          139263   16.0 MiB    8300  FOTAKernel

  12          139264         2654207   1.2 GiB     8300  System

  13         2654208         3166207   250.0 MiB   8300  Cache

  14         3166208         7360511   2.0 GiB     8300  Userdata

  15         7360512        30535646   11.1 GiB    FFFF  SDCard


15番目の11.1GBでSDCardというラベルが貼ってあるものがそれですね。内蔵ストレージなのにSDカードというラベルもおかしな話ですが、初期のAndroidは内蔵ストレージ領域を持たず、外部SDカードにしか対応していなかった頃の名残です。その一つ前のUserdataが/dataとしてユーザーアプリなどの保存場所に使われるのですが、このパーティションは2GBしか割り振られていないので、Android 4.1.2の時代ならまだしも、Android 6.0のご時世でARTのoatファイルがスペースを取るようになると、すぐに空き容量が無くなります。

そういった問題を解決するためか、同じblueプラットフォームでも2013年前期に発売されたXperia SPあたりから、内蔵ストレージ用に専用のパーティションを用意することはなくなりました。
具体的には、上の表でいうところのUserdataとSDCardが統合されて、10GB以上の/data領域を確保できるようになったわけです。そして、今まで内蔵ストレージとして用意された領域(/sdcard)は、/data/media以下で扱われるようになりました。flashtoolでWipe Dataすると、内蔵ストレージも消えるのはこのためです。

言い換えると、ユーザーアプリをインストールする場所と音楽などのメディアを保存する場所が、同じ領域を共有するようになったわけですね。

ストレージの扱い

ストレージの扱いについては、かなり混迷を極めたといって良いでしょう。内蔵ストレージとSDカード用のマウントポイントも取っ散らかっていて、よくこれだけ作ったものだと思います。

/mnt/media_rw/sdcard0
/storage/sdcard0
/sdcard
/mnt/sdcard
/data/media
/storage/emulated

これらが全て同じ領域を指しているのだから面倒です。(厳密には、それぞれ役割があったり互換性のためだけにシンボリックリンクになっていたりします)

Android 6.0のAdoptable Storage

Android 6.0ではストレージのマウントを担当するVoldに大きな変更が加えられて、Adoptable Storageという概念が登場しました。

ユーザーへの利点は、外部SDカードを挿入したデバイス専用にフォーマットすることで、あたかも内蔵ストレージ(/sdcard)として利用することが出来る点です。

Xperia M4 Aquaの8GBモデルが、先の表のようなパーティション構成の結果、/data(+/data/media)領域が1.26GB程度になってしまったことでひんしゅくを買ったのは記憶に新しいですが、仮に128GBのmicroSDカードを(/data/media)としてフォーマットすれば、その分、インストールできるユーザーアプリは増えますし(/dataの使える領域が相対的に増える)、広大な領域を内蔵ストレージとして音楽などのメディアの保存に使えるわけです。

開発者への利点は、先に挙げたようなマウントポイントをすべて取り払うことができるようになったところです。Voldがダイナミックにストレージを扱うようになったので、fuseデーモンにマウントポイントを指定したり(storage_list.xml)、initプロセスで互換性のためにマウントポイントのシンボリックリンクを張る必要もなくなりました。

ただし、新しいVoldはXperia GXのような、内蔵ストレージ用にSDCardという専用のパーティションを持つようなデバイスのことは考慮していないようです。Google的にはいい加減新しい端末に乗り換えろということなのでしょう。この対応については、同じように内蔵ストレージ専用のパーティションを持つOPPO find 7用にCMのメンテナーが試行錯誤してくれています。

少々、専門的な話になったので、GXでの実用的な話は次のエントリに分けることにします。

<参考>
Adoptable Storage | Android Open Source Project

Sony cripples the ‘8GB’ Xperia M4 Aqua | Xperia Blog

Change Id7ec3ea4: vold: Support internal storage partitions | review.cyanogenmod Code Review


関連する記事

次の記事
« 前の投稿
前の記事
次の投稿 »

2 コメント

Write コメント
匿名
AUTHOR
2016年5月24日 12:26 delete

Adoptable Storageについて日本語で簡潔且つ技術的に書かれており勉強になりました。ありがとうございます。関連する別件で1点お聞きしたいのですが、Adoptable Storage環境でTWRPを使った場合、3.0では対応しているような英語圏でのコメントは見受けられるのですが情報お持ちでしょうか。

Reply
avatar
生獣
AUTHOR
2020年1月4日 14:08 delete

赤星さま

突然のコメントお許しください
私は xperia lt26w(so-03d)を所有しております
内部ストレージの構成を表示させたいのですが
各パーティションに名前が出てきません

root@android:/dev/block/platform/msm_sdcc.1 # cd by-name
sh: cd: /dev/block/platform/msm_sdcc.1/by-name: No such file or directory
2|root@android:/dev/block/platform/msm_sdcc.1 # ls -l
drwxr-xr-x root root 2019-12-31 14:26 by-num
lrwxrwxrwx root root 2019-12-31 14:26 mmcblk0 -> /dev/block/mmcblk0
lrwxrwxrwx root root 2019-12-31 14:26 mmcblk0p1 -> /dev/block/mmcblk0p1
lrwxrwxrwx root root 2019-12-31 14:26 mmcblk0p10 -> /dev/block/mmcblk0p10
lrwxrwxrwx root root 2019-12-31 14:26 mmcblk0p11 -> /dev/block/mmcblk0p11

こんな感じでmmcblk0p15まで
この記事のように表示させるにはどのよーな
コマンドを打てばいいのでしょうか
不躾なお願いで申し訳ないのですが
宜しくお願い致します。

Reply
avatar