Android 4.2.1 からの MVNO データ専用SIM

※現在ではこのページの方法より Xposed Installer + docomo MVNO Sim Patcher による手法がよりオススメです。

Android 4.2.1 から、オフィシャルで修正が入ったため定数を改ざんする必要がなくなりました。
今後はもっと簡単で安全に MVNO のデータ専用 SIM が使えるようになりました。

ただしこの修正は config_voice_capable が false の時だけ適用されるため、通常 true になっていると思われる普通の Android スマートフォンでは有効になりません。
Nexus7 の 3G 対応版などでは上手く動きそうな予感がします。

スマートフォン環境でも使えるようにするには、結局 root 権限が要求される操作が必要になります。
簡単で安全にはなりましたがゆるふわではないです。

以下、Galaxy Nexus に JOP40D を入れて試した時の記録です。
他のメーカーの端末でも 4.2.1 以降なら流用できる可能性があると思います。

1. /system/vendor/overlay/framework/framework-res.apk を作る
必要になるファイルは用意しておきました
実際に使うのはこの zip の中にある framework-res.apk のみです。
フォルダの中に入っているファイルを使えば aapt で全く同じ apk が生成できるはずです。

2. adb で apk を転送する
「別に adb じゃなくても適当なファイラー使えばいいんだろ」って思ってやったら途中で必要になると思いますので、adb 使ったほうがいいと思います。
adb root
adb remount
adb shell mkdir -p /system/vendor/overlay/framework
adb shell chmod 755 /system/vendor/overlay /system/vendor/overlay/framework
adb push framework-res.apk /system/vendor/overlay/framework/
adb shell chmod 644 /system/vendor/overlay/framework/framework-res.apk
adb reboot
adb reboot によって端末が再起動します。

3. ロック画面になるまで待つ
再起動してロック画面まで待ちます。
この時ロック画面を解除して端末を操作しても /data/resource-cache/vendor@overlay@framework@framework-res.apk@idmap のパーミッションが 600 になっていて読み取り失敗し、色々なアプリがクラッシュしまくります。
なので、端末からの操作は一旦諦めてそのまま adb で以下のコマンドを入力して、該当ファイルを読める状態にします。
adb shell chmod 644 /data/resource-cache/vendor@overlay@framework@framework-res.apk@idmap
adb reboot
以上で面倒な操作は終わりです。
この再起動後は普通に端末が操作できると思います。

非常に簡単でしたね。
なんか足りない手順あったら教えて下さい。

4. バンド選択とか諸々
今やその端末は電話的なものではなくなったので、「電話」アプリはなくなりました。
「*#*#4636#*#*」も入力する画面がなくなったので、こういう感じのアプリを使いましょう。
設定画面自体にはアクセスできます(端末が対応しているなら)。

5. 戻す時
/system/vendor/overlay/framework/framework-res.apk
/data/resource-cache/vendor@overlay@framework@framework-res.apk@idmap
この2つを消して再起動すれば元に戻ります。

----

電話アプリが使えなくなるので Android 標準の SIP 通話とかはアクセスできなくなるかも知れませんが、CSipSimple を起動するとダイアル用の画面とかは自前で用意してくれているようなので、もしかしたらその辺利用すれば普通に使えるのかも知れません(試してない)。

あんまり Android に詳しいわけではないので config_voice_capable を変更することによる影響範囲とかはよくわかっていませんが、何か困ることがあったら追って報告します。

osa さんにご協力頂いて、この辺まで色々スムーズに調査できました。
ありがとうございます。

2013-01-08 追記 ----

電話機能を潰したくない場合の話

※以下の方法は Android 4.3 以降では実装箇所が変わっているので注意。
 Xposed モジュールが導入簡単でオススメ。

config_voice_capable が false の時だけ適用されるという動作を逆に変更して、true の時だけ動くようにしてしまうのが多分一番簡単に電話機能を残し処理もあまり変えずに変更できる方法じゃないかと思ってます。
実際に試してはいないものの、多分こんな感じで GsmServiceStateTracker.smali の中で
.line 702
.local v13, voice_capable:Z
if-nez v13, :cond_86

.line 702
.local v13, voice_capable:Z
if-eqz v13, :cond_86
のように(lineの値はROMによって違うでしょうが voice_capable:Z がいい目印になるはず)、if-nez を if-eqz に差し替えれば挙動が逆になって config_voice_capable が true の時にだけ適用されるようになるんじゃないかと思ってます。