ソフトバンクが販売したXperia XZ(601SO)に挿入したmicro SDカード(以下簡単に「SDカード」)の内部ストレージ化を試みた。記憶領域が逼迫して動作が緩慢になっていて,それ以上アプリをインストールすることもできなくなりつつあったからだ。内部ストレージ化は2015年発表のAndroid 6 Marshmallowで導入されたAdoptable Storageの機能だが,実は今まで全く理解していなかった。自分の「最新」端末は2019年までKitkat (4.4)でAdoptable Storage機能はなかった。その後Oreo (8)(のちにPie (9)にアップグレード)のOppo R17 Neoになったが “ROM” が128GBもあるため,記憶領域不足に困ることがなかったからだ。
参考資料
参照したのは以下:
- “Xperia XZ F8332でアプリをSDカードに移動させる方法(内部ストレージ化の必要なし) – OREFOLDER” …タイトルで「内部ストレージ化の必要なし」と言ってるがそれはグローバルモデルの話で,日本のキャリアモデルではそれができず,SDカードの内部ストレージ化が必要。
- “AndroidでSDカードを内部ストレージ化してアプリを移動する方法! スマホの外部ストレージをフォーマットしよう“
- “マイクロSDカードを内部ストレージ化することに成功。でも・・・。!!の出来事が。 | ASUS ZenFone Max (M1) ZB555KL | 端末レビュー | レビュー | マイネ王“
- “Android Adoptable Storage – Viva La Vida” …技術的な話。
手抜きの試み
内部ストレージ化をするとSDカード内部が全て消去されてしまうということだったが,最初はバックアップを避けられないかと姑息なことを考えた。Windows上のディスク・パーティショニング・ソフトウェアでもともとSDカード上唯一存在したexFATパーティションのサイズを小さくし,残りの領域にExt4のパーティションを作っておけば,Androidが勝手に認識してくれないか,などと都合のいいことを考えたがそうはいかなかった。わかってみると,内部ストレージ化には2つのパーティションが必要なようなのでうまくいかなかったのは当然。フォーマットもどうもExt4ではないようだし。
なお,exFATパーティションのリサイズはどのディスク・パーティショニング・ソフトウェアでもできるわけではないようで,自分はそのためにDiskGenius (旧PartitionGuru)を使用した。結局それは無駄になったが。
作業手順
結局行った作業は以下:
- SDカードの内容をバックアップ
- “Xperia XZ F8332でアプリをSDカードに移動させる方法…– OREFOLDER” にあるようにPCからadbでSDカードの一部内部ストレージ化(コマンド履歴を末尾につけるが一部削除してあるのでそのつもりで)。
- バックアップをSDカードのexFATパーティションに書き戻す。
2. のキモとなるコマンドはsm partition disk:<ディスクID> mixed <割合>
だが,<割合>
は外部ストレージ(つまりexFATパーティション)として残す割合。最初,逆,つまり内部ストレージ化する領域の割合かと勘違いしてしまったため,うまくいってないのかと思ってしまった。
実は,このコマンドはついぞ成功しなかった。以下のどちらかのエラーが起こった:
- Error: java.lang.IllegalStateException: java.util.concurrent.TimeoutException: Thread Binder:1382_17 gave up waiting for partitionMixed after 180000ms
- Error: java.lang.IllegalStateException: command ‘124 volume partition disk:179,64 mixed 20’ failed with ‘null’
理由は突き止められなかったが,どうやらそれでも内部ストレージ化は成功したようだ。冒頭の図にあるように,内部ストレージ化のために新たにパーティションが2つ作成されていた。
一部リソースでは,sm set-force adoptable true
をその前に,sm set-force adoptable false
をその後に,それぞれ実行すべきだとしてあったのでそれにならった。これが必要だったのか,あるいは正しいことだったのかはわからない。
結果
SDカードの暗号化は無効状態で,SDカードに移動できるアプリを移動してみると,それらアプリは実用にならないほど動作が緩慢になった。ただ,”マイクロSDカードを内部ストレージ化することに成功。でも・・・。!!の出来事が。” の末尾に書いてあるのであろうことと同じことができた。不覚にもスクリーンショットを取り損ねたが,どうやらアプリなりシステムなりの一部をSDカードに移せたようだ。
「設定」アプリ→「ストレージとメモリ」→画面右上のメニューアイコンから「高度な設定」→「ストレージ」で得られる画面(右図)で「SDカード」をタップ。そこで得られる画面の右上のメニューアイコンをタップして表示されるメニューの最下部に「内部〇〇をSDカードに移動」のようなメニューアイテムがあり,それを選択することで少なくとも内部ストレージ中にあった何かが3GB弱「内部ストレージ化」されたSDカード内に移動されたようだ。
劇的に遅いSDカードの読み取り速度
アプリごとにSDカードへの移動した際には使い物にならなくなるのはSDカードの読み取り速度が遅いからだろうと思ってA1 Benchというアプリで測定してみた(右)。比較のため,Oppo R17 Neoでも測定してみた(左)。
見ての通り劇的な違い。同じSDカードを使用しての比較ではないので,SDカードの違いが差を生んでいる可能性はあるが,少なくともこのままではXperia XZではSDカードにアプリなりシステムが依存すると,全体のパフォーマンスが落ちるのは当然の結果。Xperia XZは2016年末頃に発売された。対して,R17 Neoは2018年末頃の発売。わずか2年ほどでここまでの差がついたのか?Xperia XZはその時点でのフラグシップ機だったのだろうと思うが,R17 Neoなど,最初からミドルレンジ機だったのに…。
Xperia XZで今まで使ってきたSDカード(右写真)は一応クラス10, UHS-Iということになっている。購入時にすぐベンチマークを測定していればよかった。
ただ,以下なんかを読むとXperia XZ自身の制約としてスピードが出ない可能性もあるようだ。
- “Why Sony limits SD card speed to about 30 MB/s? – Sony“
- “SD card read/write speed | XDA Developers Forums”
そもそもXperia XZはその所有者にとって既にメインの端末ではなくなっていてサブ端末になっていた。内部ストレージ化により,(本当の)内部からの何かしら(システム?)をSDカードに追いやることは成功し,アプリも追加できそうだ。少なくとも今のところ大きなパフォーマンスの問題は出ていないので,目的は達成できたとみなし,これ以上追求しないことにする。
Adbを利用したSDカードの内部ストレージ化
C:\Users\Yasuro>adb shell 601SO:/ $ sm list-disks disk:179,64 601SO:/ $ sm partition disk:179,64 mixed 20 Error: java.lang.IllegalStateException: java.util.concurrent.TimeoutException: Thread Binder:1382_17 gave up waiting for partitionMixed after 180000ms 601SO:/ $ sm partition disk:179,64 mixed 20 Error: java.lang.IllegalStateException: command '124 volume partition disk:179,64 mixed 20' failed with 'null' 1|601SO:/ $ sm has-adoptable true 601SO:/ $ sm list-volumes private:179,67 mounted fe4a00bf-3ebe-4d18-b265-6c8b5ddf1d10 private mounted null public:179,65 mounted 7BDF-0818 emulated mounted null emulated:179,67 unmounted null 1|601SO:/ $ sm list-volumes private mounted null public:179,65 unmounted null emulated mounted null 601SO:/ $ sm list-volumes private:179,67 mounted 76e8e6df-0665-44c0-8f81-341f176a7371 private mounted null public:179,65 mounted 7067-BEE7 emulated mounted null emulated:179,67 unmounted null 601SO:/ $ C:\Users\Yasuro>adb shell 127|601SO:/ $ sm set-force-adoptable false 601SO:/ $