データ専用SIMとGalaxyNexus

 俗に言うセルスタンバイ問題とSPN、PLMNの二重表記をなんとかするだけ。

 

セルスタンバイ問題対応でよくあるregCodeToServiceStateのレスポンスを変更する方法だと 普通にボイスレジスト(CS)が拒否されても問題なし状態になってしまうので複数キャリアの切替や ローミング使用時に問題が発生するのであまりやりたくない。全体的に不親切なメモ。

やりたいこと

 データ専用SIM(持っているiijmio限定)が正しい通信状態になりセルスタンバイ問題が改善すること。
 
 「NTT DOCOMO/NTT DOCOMO」みたいなSPNとPLMNの二重表示は格好悪いので「NTT DOCOMO」表記にする。
 
 海外利用もあるのでローミングも問題なく行えること(海外SIMが正しく使えること)。表記も同じく。
 
 ソースからのコンパイルは時間もかかるので面倒(これ重要)なのでframework.jar修正でなんとかする。

 

下準備

framework.jarを端末から取得しておく。バックアップも必ず行う。

http://bl.oov.ch/2012/01/b-mobile-sim.html が参考になります。

理屈

Android Jelly Beans のコードを眺めていたら以下のようになっているみたい。
GsmServiceStateTracker.java Line.722 〜
  cm.getOperator //オペレータを探す
  cm.getDataRegistrationState //データ(PS)のレジスト
  cm.getVoiceRegistrationState //ボイス(CS)のレジスト
  cm.getNetworkSelectionMode //ネットワーク選択

GsmServiceStateTracker.java Line.639 〜 (getDataRegistrationStateの戻り処理内)
  newGPRSState = regCodeToServiceState(regState); //regState→ServiceStateに置換→変数へ
  mDataRoaming = regCodeIsRoaming(regState); //ローミングチェック

GsmServiceStateTracker.java Line.600 〜 (getVoiceRegistrationStateの戻り処理内)
  mGsmRoaming = regCodeIsRoaming(regState); //ローミングチェック
  newSS.setState (regCodeToServiceState(regState)); //regState→ServiceStateに置換→全体設定

ということでData側の都合に関わらずVoice側のサービス状況が優先されることになっています。 PSとCSとのレジスト関係はiij様のblog記事が詳しいです。http://techlog.iij.ad.jp/archives/487

対応

なんでsetStateの前あたりにデータ(PS)のサービス状況を確認して(CSに)採用してもらえば良さそうです。 具体的にはCSのregStateが13(拒否:緊急通話のみ)の時のみPSの状況がOKならCSでもregStateを1にします。

   if( regState == 13 ){ // 3 is "registration denied" / 13 = 3 + "emergency call"
       if( newSS.getState() == ServiceState.STATE_IN_SERVICE ){ // STATE_IN_SERVICE = 0
           regState = 1;
       }
   }

ソースからコンパイルしたいところですけどコンパイルに非常に時間がかかるのでsmali修正(GsmServiceStateTracker.smali)で

.line601の下に追記
    iget v0, v0, Lcom/android/internal/telephony/gsm/GsmServiceStateTracker;->newGPRSState:I
    move/from16 v14, v0
    const/16 v13, 0xd
    if-ne v9, v13, :cond_60f
    if-nez v14, :cond_60f
    const/4 v9, 0x1
    :cond_60f

あとはコンパイルし直してframework.jarをsystemに書き込むだけです。recovery起動で置換すればroot化しなくてもよいので楽です。

  adb reboot bootloader
  fastboot boot recovery-clockwork-5.5.0.2-maguro.img

  adb shell mount /data
  adb shell mount /system
  adb push framework.jar /data/
  adb shell mv /data/framework.jar /system/framework/framework.jar
  adb shell umount /data
  adb shell umount /system
  adb reboot

エラーがでたらバックアップから戻しましょう。

おまけ

「NTT DOCOMO/NTTDOCOMO」対策。SPNとPLMNが一緒だったらSPNを表示しないようにしているだけです。ジャンプ先のcond_f2は直後のジャンプに合わせて変えること。 GsmServiceStateTracker.java Line.521 〜

.line 513 以下適当な場所に
    invoke-static {v5, v1}, Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
    move-result v8
    if-nez v8, :cond_f2

以上

 

参考URI:

てくろぐ(iij):http://techlog.iij.ad.jp/archives/487

paste.bin:いろいろ