私が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 コメントAdoptable Storageについて日本語で簡潔且つ技術的に書かれており勉強になりました。ありがとうございます。関連する別件で1点お聞きしたいのですが、Adoptable Storage環境でTWRPを使った場合、3.0では対応しているような英語圏でのコメントは見受けられるのですが情報お持ちでしょうか。
Reply赤星さま
Reply突然のコメントお許しください
私は 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まで
この記事のように表示させるにはどのよーな
コマンドを打てばいいのでしょうか
不躾なお願いで申し訳ないのですが
宜しくお願い致します。
Emoticon Emoticon