Androidのセルスタンバイ問題をソース側で修正してみる

投稿者: | 2012年11月1日

Androidのセルスタンバイ問題はAndroidを使い始めた初期に気にはしていたのですが、docomoのデータ専用simを使うようになってすっかり忘れていました。先月からdocomoのデータ専用simをやめてIIJmioの高速モバイル/Dを使うようになったのでまたこの問題に再会。

今更ながら修正箇所を確認したので、対応のための暫定コードを足してみました。
ちなみにずいぶん前に行った修正はこれですが、これではアプリしかだませず、電池もちの改良には至りませんでした。今回はもっと下層です。

セルスタンバイ対策といえばこちら、
Android + データ専用 SIM での動作修正パッチ [ブローヴちゃん]
年の初め頃にパッチが出ていることは見かけていたのですが、その頃は特に問題もなかったのであまりよく見ていませんでした。

思い出して上記サイトのパッチで何をしているのか確認してみようと見に行ったところ以下のサイトへのリンクが追加されていました。
アンテナピクト問題・セルスタンバイ問題とは何か [てくろぐ]
こちらでiijの技術者の方により、ほぼ原因だと思われることが書かれています。

サービスの接続動作について書いてあることをまとめると、以下のことが原因ではないかということです。
・CS(音声サービス)のRegistrationとPS(データサービス)のRegistrationが両方OKになれば接続OK判定される。
・音声通話可能なMVNOのsimの場合はCS/PSともにOK
・データ専用simの場合はPSはOKだがCSがNG
・ただしdocomo自身が出しているデータ専用simはCS/PSともOKになる
・NGの場合にはRegistration出来るまでリトライし続ける

これを見る限りでは、(docomoのデータ専用simは例外として)音声/データ両方利用可能な(問題の発生しない)simであれば、基本的にPSとCSのRegistration状態は同じになると考えても大丈夫そう? ならばPSの状態をCSの判定時にも使ってやれば良いのではないかと思い、処理を追加したのが以下のファイルです。
GsmServiceStateTracker.java
ソースのベースはAOSPのandroid-4.1.2_r1ブランチです。

L92付近
PSの状態を保持する変数を追加

    //Add for MVNO sim
    private int mDataRegState = -1;

L603付近
CSは常にNG状態(3または13)になっているはずなので、CSの状態判定部分に前回のPSの状態を使用する。
PSがOKの状態であればついでに「緊急通報のみ」状態も回避されます。

                case EVENT_POLL_STATE_REGISTRATION:

                     (略)

                    //Add for MVNO sim
                    if((regState == 3 || regState == 13) && (mDataRegState == 1 || mDataRegState == 5)) {
                        regState = mDataRegState;
                    }

                    mGsmRoaming = regCodeIsRoaming(regState);
                    newSS.setState (regCodeToServiceState(regState));

                    if (regState == 10 || regState == 12 || regState == 13 || regState == 14) {
                        mEmergencyOnly = true;
                    } else {
                        mEmergencyOnly = false;
                    }

L647付近
PSの状態はここで取得した物を保持。

                case EVENT_POLL_STATE_GPRS:

                     (略)

                    newGPRSState = regCodeToServiceState(regState);
                    mDataRoaming = regCodeIsRoaming(regState);
                    mNewRilRadioTechnology = type;
                    newSS.setRadioTechnology(type);

                    //Add for MVNO sim
                    mDataRegState = regState;

                break;

JCROMに上記変更を入れてビルドし、GalaxyNexusにてIIJmioのsimで動作確認したところセルスタンバイ問題は発生せず。「緊急通報のみ」にもなりません。

次の日にこの変更を適用したROMを書き込んだGalaxyNexusを1日使ってみました。(ほとんど持って歩いただけ)
結果、12時間で電池の消費は20%程度。朝100%なのを確認して持って出て20時頃に帰宅して再度確認したときに電池は残り81%でした。
ただし今日はほとんど画面は見ていないのでまだ数日使ってテストしてみる必要があります。

国内のMVNOでないsimを使う場合には入れない方が良い修正なので、公開するようなカスタムROMには入れられないと思いますが、個人でビルドする場合には有効かもしれません。
私としてはこの変更をXperiaPに入れたいのですが、カスタムROMをビルドする方法がないのが残念。
とりあえずXperiaPには先のパッチを利用させてもらうことにしようと思います。

コメントを残す

メールアドレスが公開されることはありません。