PD10 3G版という名の中華パッドでデータ専用SIMを使えるか?

経緯に興味ない、結論だけ見たいという人はこちら

Freelander PD10 3Gというものを買ってしまった。
この名前はどちらかというと世界向けで、本場では「神行者」というらしい。いわゆる中華パッドである。
7インチ液晶、静電式、GPS、Bluetoothとこの手の製品の中でも比較的豊富な機能に加え、3G SIMが2枚装着可能という高機能ぶり。
これで安いデータ通信専用SIMでもとりつければ、どこでもネットが見られて便利かもと思った次第。
しかしそこは中華パッド、そんなに簡単にはいかないのであった。
このメモは、よくわからない製品を安さにつられて買うといろいろ苦労(あるいは無駄な散財)するという、教訓を忘れないための記録である。

とりあえず最初の段階

届いたばかりのPD10をみてみる。
ショップのうたい文句通り最初から日本語化されており、日本語入力も問題なくできる。フォントもきれい。これはショップごとのサービスなので、誰でもではないのは要注意
ただブラウザ開くと、見慣れないページが山ほどブックマーク登録されていた。どうやら中国系では人気のページっぽい。
まぁ、この辺はさすが中華パッドということでご愛敬。

さっそくb-mobile系のSIMを契約してきて取り付けてみると、SIMが認識されDOCOMO 3Gの名前が・・・。
「おっ、これはすんなりいくか?」と期待したが、よくみると「選択したネットワーク(DOCOMO 3G)が利用できません」とのこと。
WEBでもAndroidスマーホフォンでデータ専用SIMはすんなり使えないとの情報が多いので、この辺は「やはり」としか。

みんながやってるパッチを試す

とりあえずWEBで「セルピクト問題」の対策としてスタンダードになっているパッチを試してみる。 が、状況変わらず。

ちょっと難しい手段を試す

ソースレベルでパッチ当てという記事があったので、それを試してみる。
smaliに逆アセンブルされたコードをみながら、該当ポイントを探すと・・・
なんか行番号(青字部)がえらく違うのが気になるが、それらしき部分を発見。
とりあえずそれっぽく書いてみた(赤字が追加部)。概要としては音声サービスへの登録コードが3または13(16進で0xd)のとき、登録コードに1が返ってきたフリをさせる。
GsmServiceStateTracker.smali (4.0.4r1.1のはず、10690行目付近)
.line 776
:cond_16e
:goto_16e
:try_start_16e
move-object/from16 v0, p0

const/16 v13, 0x3
if-eq v9, v13, :kaizou
const/16 v13, 0x0d
if-eq v9, v13, :kaizou

goto :kaizou_skip
:kaizou

const/4 v9, 0x1

:kaizou_skip
するとSIMマークが△と!のマークから接続済アイコンに・・・
きたぁぁぁぁぁぁぁ・・・と思ったら、相変わらずポップアップの中では「利用できない」との表示。
どうやら頭ではわかっても体がついて行かないとか、そんな感じになっているっぽい。

ソースコードに手を出すも・・・

OSのバージョンはbuild.propから4.0.4r1.1であることがわかっているので、急遽Ubuntu環境を構築。 ソースのビルドをやってみた。
できあがったjarファイルの数々・・・。

このできあがったファイルに差し替えてもちゃんと動作するならば、ソースレベルのでの解析とパッチ当てはやりやすくなるだろう。

いきなり全部というのもあれなので、まずはできあがったframework.jarからGsmServiceStateTracker.classのみ取り出して、それを既存のframework.jarに突っ込んでみる。
起動はするものの「telephoneyでエラーが発生して云々」とのポップアップが出っぱなしになった。
仕方がないので、framework.jarを丸ごと入れてみると・・・起動しない。adbでlogcatしてみると、libcでSEGVが発生しているらしい。
えーい!仕方がない!!と、すべてのjar&odexをぶっ込むと・・・起動せず。慌ててバックアップから戻す。

ログから追いかける限り、どうももとのclassにあって差し替えたclassにない関数が呼ばれているらしい。
バージョンが微妙に違うのか?

双子の悪夢

ソースがだめとなると、現存するsmaliを改造するほかないわけであらためてlogcatとsmaliをにらめっこ。
関係ありそうな文言をググったりソースを探したり。すると・・・。
gemini○○というログが散見することに気がつく。
たしかにsmaliの中にもgeminiというフォルダが存在する。
ところがこれに関してはググってもほとんど情報がない。それどころか公式ソースにはそんなもの入ってないことに気がつく。
そういえばsmaliの行番号(.line xxxx)と実際のソースの行番号が離れていたっけ・・・。

どうやらSoCメーカーであるMediatekによって、カスタムされたもののようだ。
なんらかの独自処理が(それも大幅に)されていて、Androidのオリジナル以外にサービスの接続状態を判定する部分が存在するということか。

名前からするに、デュアルSIMを制御するための追加ライブラリがあって、それが組み込まれているとみた。
調べてみると、Mediatekがチップとともにソリューションとしてライブラリ/ドライバ組み込み済みでOSを提供しているらしい。余計なことを・・・。
作る側からすれば安上がりなんだろうが、使う側からすると中身への手出しのハードルはぐんと上がる。

振り出しに戻った感があるが、あらためて調査開始。

さすがに中華系のチップセット用ライブラリの情報は少ない。
そんな中で関係ありそうなページを発見。
なんだよ「getServiceStateGemini」って。
呼び出し方を見る限り、それぞれのSIMスロットについて個別にステータスを管理しているらしい。

探して見つかるのは断片的なものだけで、ソースがすべてそろったものはない。
ソースもないのに解析できるのか?

何故か使えた日


さてどうしたものかと思っていたが、ひょんなことから使えるときがきた。
デュアルSIMの動作について調べようとあれこれしていたら、ふとしたタイミングにアンテナが立った瞬間があった。
WiFiを有効にしていなくても、遅くはあるがGoogleがみられるではないか。
猛烈に感動したのもつかの間、主電源をオフ/オンすると使えなくなった。
直前にやったことを思い返し、どうやったら接続できるのか試行錯誤してみた結果、おおむねわかってきたのは以下のこと。

まだまだ長期運用してみないことにはわからないが、現時点では上記さえ理解していれば使えそうである。

まだまだ不安定


うまく使えるようになったと喜んだのもつかの間、またつながらなくなった。
一日うまく電波が拾えているときもあれば、何度やってもつながらない日もある。
今日もだめだったと家に帰ってACアダプタつないだらつながった、とか。

総じて家にいるときの方がすんなりつながりやすい(というか出先で再起動してつながったためしがない)ので、ACアダプタとか電波局とかそういった条件があるのかも。

最近、海外のフォーラムでMediatekがらみのソースコードが相次いで見つかっているようなので、こいつから何とかならないか思案中。

ファーム更新


ファームウェアを2012/10/12版に更新。状況は変わらない。
最近、つながった試しがないので、以前うまくいったのは偶然というかむしろ異常だったんじゃないかという気がしてきた。

再びコード改造を試す


バージョンアップしてもGSM関連のファイルは変更ない様子。
Android SDKと差し替え実験をあれこれしてみた結果、接続状態の監視をPhone.apkもやってそうな雰囲気。
実際、回線の選択画面(「DOCOMO 3G」とか「Softbank」とか表示される)はPhone.apkが提供しているように見える。

PD10に入っているPhone.apkはMediatek独自カスタマイズとしてServiceStateを取得するのに「~Gemini」を呼び出している。

それはさておき、最初のコード改造で「緊急通報のみ」がServiceStateに記録されないようにしたはずなのに、なぜPhoneのステータス表示では「緊急通報のみ」と表示さえるのかが気になった。
緊急通報のみかどうかを管理しているのがServiceStateだけじゃない、ということを示しているからだ。

で、引き続きコードをにらめっこした結果、以下のコード部分を改造することにした。
GsmServiceStateTracker.smali 2090行目付近
.line 1454
.local v2, state:I

and-int/lit8 v3, v2, 0x12
move v2, v3

and-int/lit8 v3, v2, 0x1

if-nez v3, :cond_3b
この辺は、onRestrictedStateChangedという関数の中でradioのステータスを確認している。
後続の処理で、radiostate(v2)にRIL_RESTRICTED_STATE_CS_EMERGENCYが含まれているかがチェックされている。
今回の改造ではそのチェックの前にradiostateを、RIL_RESTRICTED_STATE_CS_NOMALとRIL_RESTRICTED_STATE_PS_ALLしか含まれないようにしている。

やってみた結果は、やはり変わらず。
ログからみると、一見登録成功したんでひたすら接続を試みて失敗して、を繰り返している感じ。アンテナマークも虫眼鏡付き(アンテナ探し中)のまま。これじゃバッテリが持たない。
どうしてサービス状態を管理している唯一であるはずのクラスを改造して、それと違う結果が表示されるのかがわからん。
どこかほかにも、管理している場所やステータスを書き換えている場所があるような気がしてならない。

あきらめる

関連しそうなシステムアプリケーションのソースコード(というかsmali)をみてみたが、関連しそうなところが至る所にある反面、これという核心部分を見つけるには至らず・・・。
時間をかけるだけ無駄、という結論に至った。

買ってからいうのも何だが、7インチクラスは思ってたより大きくて、長い時間持ち続けると手首が痛くなるという問題もあり、3G使って外で使うにはもともと不向きだったかなぁ、という思いもあり。
やっぱ外で使うなら普通のスマホサイズだよね、ということでテザリングできるような4インチ以下のものをもう一個買おうという気になった。
もちろんSoCにMediatek製を使用したものはいくらよさげでも問答無用でスルーしたことはいうまでもない。
買った

Amazonあたりを探していて気がつくのは、カタログスペックの割に安いと思う製品はみんなMediatekのSoCを採用しているということ。
これだけ安い製品を提供して競争しようとするメーカーがOSに手を入れるとも思えないので、きっと供給側(Mediatek)が直さない限りこの問題は解決しないだろう。
よくわからない人がこういった製品を買ってしまって、同じような苦労をするのかと思うと、もうちょっとどうにかならないのかとも思う。
せめてソースが公開されていれば、まだ対処できるのに。

結論


Freelander PD10 3Gでは、データ専用SIM(おそらくb-mobile, イオン, IIJ等)は使えない。
おなじカスタムOSを使用しているであろうMediatek製SoCを採用している中華パッド、中華スマホも同様の可能性が高い。
逆に音声通話付きのSIMであればWEBでも使用実績があるようなので、検討の余地あり。
掲示板とかでイオンSIM使えたという人がいるが、おそらく音声通話付きのSIMの話なので要注意。

画面でかいといろいろできて遊ぶ余地は広がるからこれはこれで楽しい。ただ3G版は買う必要ないけどね。

追記


こういった問題が多いことはキャリア側も認識しているのか、対策した(?)SIMカードが現れた。
上でも書いたとおりボイスサービスが使用できないSIMだから使えないのであれば、SMSサービスだけ提供して見かけ上ボイスサービスがあるように応答してくれれば使える確率は高いように思う。
いまさらあえて自分が試そうとは思わないが、パッドを騙すためだけに音声通話付きSIMを契約しようとしていた人には朗報かと。

インデックスに戻る