GALAXY NEXUS(4.1 JellyBean)でのセルスタンバイ問題


さて、前回の投稿からずいぶん間が空き季節が変わってしまいました。

最近FactoryImageが公開されたGALAXY NEXUS用のJellyBeanのイメージを、手持ちのSC-04Dに入れました。
「そんなに変わらないだろう」と思っていたのですが、入れてみたらヌルサク具合にもうICSには戻れなくなってしまいました。
私はそんなGALAXY NEXUS(SC-04D)にIIJmioのSIMを入れて使っているのですが、このようなデータ専用SIMを入れると発生する問題としてセルスタンバイ問題というのがあります。
今日はそれをうまく解決できたときの話をしようと思います。

セルスタンバイ問題とは

よくある携帯キャリアで契約をした場合、音声通信とデータ通信が両方使用できるSIMをもらうことができます。
しかしながら、日本通信(b-mobile)などのデータ通信のみしか使用できないSIMの場合、音声通信の回線が使用できないようになっており端末側で音声通信が圏外と認識されてしまい、アンテナピクトイメージが圏外の状態を表示します。

この状態でも正しくAPNの設定を行えばデータ通信を行うことは可能です。
しかし圏外の状態の場合、携帯端末は電波をより頻繁に探すためバッテリの消耗がより激しくなります。
それがセルスタンバイ問題と呼ばれる現象です。
実際に端末「設定→電池」からもその様子を見ることができます。
(写真を撮り忘れました…)

ICSを使っている頃からこの現象はあったのですが、特に電池の減りが早いという印象もなかったため放っておいたのですが、バッテリが余分に使われていると思うと何かもったいないので対策をしてみようと思ったというところです。

セルスタンバイ問題の解決方法

解決策は、音声回線との圏内・圏外の判定をしないようにし、データ通信が可能ならば圏内とするようにすることで圏外の状態にならないようにします。

そのための方法を検索をするとみなさん同じことで悩んでいて、様々なサイトがヒットしました。
特にこちらではスクリプトが用意を作っておられたようで「これで簡単に…!」と思ったらWindowsのバッチファイルでした。

しかし特にWindowsに特化した処理があるわけでもありませんでしたので、Macで動くようにシェルスクリプトを作成しました。
fix_cellstandby.sh

このコマンドをたたけば必要なプログラムをダウンロードしてきたうえで端末にセルスタンバイ問題を解決するパッチを当てることができます。

動作環境

  • JellyBeanのFactoryImageが適用されて何もいじっていないGALAXY NEXUS(SC-04D)であること
  • adbで端末と接続できる状態であること
  • Clockwork mod recoveryなどで起動し、/system,/dataを自由にマウントできる状態にできること

adbでの接続環境を整えるあたりやClockworkで起動する手順などについては長くなるので省略します。

利用にあたり注意

この手順を行ったことによるデータの消失や端末の破損、文鎮化などが発生した場合でも、一切責任はおいません。自己責任で実行をお願いします。

スクリプト動作手順

まず、上記リンクからfix_cellstandby.shをダウンロードし、ダウンロードしたディレクトリで下記を実行します。
そのとき端末とはadb経由で接続できる状態にしておいてください。

 $ sh fix_cellstandby.sh

実行すると必要なプログラムをダウンロード、パッチの適用などを行ってくれます。
しかし、これだけではダメで最後は/system内のファイルを書き換える必要があります。
そのため、端末をClockworkなどで立ち上げ/systemと/data領域をマウントしたうえで、下記コマンドを実行します。
(すいません、横に長いですが1行です)

 $ adb shell "cp /data/local/tmp/framework.odex /system/framework/framework.odex.new && mv /system/framework/framework.odex /system/framework/framework.odex.original && mv /system/framework/framework.odex.new /system/framework/framework.odex && sync && reboot"

これで端末が起動し、アンテナピクトが圏内を表示できれば成功です。

もし、起動しなくなったら/system/framework/framework.odex.originalを戻すか、FactoryImageを適用しなおしてください。

最後に

やはりアンテナピクトがあるとちゃんと動いている感があって気持ちがいいものですね。
バッテリの持ちがどうなったかというのはまだ長く使っていないのでわかりません。
何か明らかに変わった!とかがあったらまたここに追記しようと思います。

ちなみにこの方法だと音声通信の部分の圏内・圏外判定をごまかしているので音声も使えるSIMを差し込んだときに思いもよらないエラーが発生するかもしれません。
なので、音声通信も行う場合は純な状態のFactoryImageを使用する方が良いでしょう。

また、このスクリプトはMacOS 10.8 Mountain LionとGALAXY NEXUS(SC-04D)でしか動作確認をしていません。
「他の端末でも動いたよ!」とか言うのがあったらぜひ連絡をいただけるとうれしいです。

参考サイト

あわせて読みたい

13件のフィードバック

  1. tome より:

    こんにちは。
    ブログを楽しく拝見させて頂きます。

    質問なのですが、
    「端末をClockworkなどで立ち上げ/systemと/data領域をマウントしたうえで、下記コマンドを実行します。」
    というところがうまくいきません。

    もう少し具体的にご説明頂けないでしょうか。
    宜しくお願い致します。

    初心者なので理解が及ばないところが多く、申し訳ありません。

  2. hiroki.kana より:

    こんにちは。
    いつも見ていただきありがとうございます。

    このClockworkで立ち上げて/systemと/data領域をマウントするのは書くと長くなるので省いてしまいました…

    手順ですが、まず、http://forum.xda-developers.com/showthread.php?t=1357642 からGALAXY NEXUS用のClockworkModをダウンロードします。(ファイル名はrecovery-clockwork-5.5.0.2-maguro.imgとかだと思います)
    次にGALAXY NEXUSのボリュームの上下ボタンを同時押ししながら起動するとブートローだが起動します。(ロボットのマスコットが横になっている画面が出ると思います)
    その状態でPCとつなぎ、ターミナルでfastboot boot recovery-clockwork-5.5.0.2-maguro.imgと入力(このときダウンロードしたrecovery-clockwork-5.5.0.2-maguro.imgはカレントディレクトリにあることを確認してください)すると、ClockworkがGALAXY NEXUS側で立ち上がります。
    立ち上がらない場合はブートローダーがlockされていると思うので、fastboot unlockを実行してブートローダのロックを解除してください。(画面にも出ると思いますがこれをやると端末の故障の際などに保証がきかなくなるようです)

    このあとは端末側の操作で各領域のマウントをすることができます。
    メニューの mounts and storageを上下キーを使って選択、電源キーで選択します。
    そうするとmount /dataやmount /systemという選択肢が出てくると思います。
    ここを電源キーを使って選択するとメニューがumount /dataやumount /systemになります。
    これで各領域がマウントされている状態です。
    この状態で上記のadb…からはじまるコマンドを実行してください。

    Windowsでの例になってしまうと思うのですが、Clockworkを起動するまでの流れで下記サイトが参考になります。
    http://androidlover.net/smartphone/galaxynexus/sc-04d-clockworkmod-backup.html

  3. tome より:

    hiroki.kanaさま
    こんにちは。
    ご回答頂きましてありがとうございます。

    アドバイスに従い、どうにかclockworkを起動することができました。そして、data systemをunmountにするところまでできました。
    至らないところが多く、進まずにいましたが、ようやく進むことができてとても嬉しいです。

    しかし、
    「この状態で上記のadb…からはじまるコマンドを実行してください。」
    という箇所でまたつまずいてしまいました。
    お忙しい中申し訳ございませんが、再度アドバイス頂けないでしょうか。
    宜しくお願い致しますm(__)m

    私が行った過程を下記に記載させて頂きました。

    まず、ブートローダーを起動しました。
    そのご、ターミナルを開きました。
    そして、abdからはじまるコマンドをターミナルに入力してenterを押しました。
    しかし、どうしても
    command not found
    になってしまします。

  4. hiroki.kana より:

    clockworkが立ち上がったとのことで、よかったです。

    command not foundになってしまうとのことですが、Android SDKはインストールされていますか?
    which adbと入力しadbコマンドのパスが返ってこない(無い場合/usr/bin/which: no adb in…と表示されるはずです)のであればAndroid SDKが未インストールだと思います。
    http://gadgemin.blog84.fc2.com/blog-entry-15.html こちらのサイトにうまいことまとまっていたので参考になれば…。

    あとadbコマンドが使えないということはfix_cellstandby.shもうまくいっていないと思うので、adbコマンドが使えるようになったらもう1度実行してみてください。
    (そもそもエラーメッセージ出ないfix_cellstandby.shが悪いですね…)

  5. tome より:

    hiroki.kanaさま
    お世話になっております。

    galaxy nexusのrootをとって、4.1を導入した際にAndroid SDKをインストールしておりました。
    また、which adbと入力すると、/usr/bin/which: no adb in…と表示されることは御座いませんでした(入力前に左側に表示されていたものと同じものが表示されました。)。

    もしかしたら基礎的ことを見逃しているのかもしれません。
    もし、お気づきの点がございましたらアドバイス頂けるよう宜しくお願い致します。

  6. tome より:

    追記
    hiroki.kanaさま
    お世話になっております。

    おかげ様で、adb shell “cp /data/local/tmp〜のコマンドを実行するところまで進むことが出来ました。
    しかし、起動画面で止まったままの状態になってしまいます。

    参考までに、環境をお伝え致します。
    mac osx 10.6+galaxy nexus[sc-04d]です。

  7. hiroki.kana より:

    起動画面で止まってしまっているということは、/system/framework/framework.odexがうまく生成されていないのだと思われます…。
    私も手でやったときは何度か同じように起動しなくなったのですが、そういうときはひとまずFactoryImageに戻して端末をまっさらな状態にしてやってみました。
    完全な解決策にならなくて申し訳ないのですが…
    fix_cellstandby.shの出力内容をいただければ何か手がかりがつかめるかもしれません。
    (ひとまず起動する状態に戻すには/system/framework/framework.odex.originalを/system/framework/framework.odexにリネームして再起動するかFactoryImageに戻して再起動してください。)

  8. tome より:

    hiroki.kana 様
    お世話になっております。

    ご助言通り4.1のFactory Imageに戻して再起動致しました。
    ご助言頂きましてありがとうございました

    また、再度
    sh fix_cellstandby.sh
    を実行してみました。

    下記にsh fix_cellstandby.shの出力内容を提示させて頂きました。
    何かアドバイス頂ければ幸いでございます。

    わからないことばかりでご迷惑おかけしておりますが、宜しくお願い致します。

    device-f0a94f:~ yutaka$ cd /Applications/android-sdk-macosx/platform-tools
    device-f0a94f:platform-tools yutaka$ sh fix_cellstandby.sh
    mkdir: tmp: File exists
    mkdir: tmp/tools: File exists
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 775k 100 775k 0 0 256k 0 0:00:03 0:00:03 –:–:– 317k
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 1737k 100 1737k 0 0 384k 0 0:00:04 0:00:04 –:–:– 393k
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    101 2528 101 2528 0 0 1983 0 0:00:01 0:00:01 –:–:– 1983
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 1704k 100 1704k 0 0 372k 0 0:00:04 0:00:04 –:–:– 424k
    error: device not found
    error: device not found
    error: device not found
    patching file tmp/lv14/com/android/internal/telephony/gsm/GsmServiceStateTracker.smali
    fix_cellstandby.sh: line 34: 7za: command not found
    error: device not found
    error: device not found
    error: device not found
    error: device not found
    error: device not found
    error: device not found
    error: device not found
    boot recovery mode(ex:recovery-clockwork). on boot finished, mount /system and /data.
    execute command…
    $ adb shell “cp /data/local/tmp/framework.odex /system/framework/framework.odex.new && mv /system/framework/framework.odex /system/framework/framework.odex.original && mv /system/framework/framework.odex.new /system/framework/framework.odex && sync && reboot”
    device-f0a94f:platform-tools yutaka$

  9. hiroki.kana より:

    出力内容、ありがとうございます。

    どうやら内容的に、adb pull/pushコマンドが軒並み失敗しているようです。
    まずfix_cellstandby.shを実行される前にadb devicesを実行し、GALAXY NEXUSが認識されているか確認し、下記コマンドが成功するか試してみてください。
    $ adb pull /system/framework/framework.jar tmp/framework.jar
    これが成功したらtmpディレクトリを削除し、fix_cellstandby.shを再度実行してみてください。
    「error: device not found」のメッセージが出なくなっていたら成功しています。
    (そもそもはプログラム側で端末がなかったらメッセージを出して停止するとかすべきですね…)

  10. tome より:

    hiroki.kana様
    お世話になっております。

     ご助言頂いているおかげで、手探りではありますが、着実に進むことができております。すべてhiroki.kana様のおかげでございます。ありがとうございます。

     今回は、adb devicesを実行し、GALAXY NEXUSが認識されているかどうか確認してみました。その後、$ adb pull /system/framework/framework.jar tmp/framework.jarを実行し、tmpディレクトリを削除し、fix_cellstandby.shを実行致しました。

     その後、adb shell “cp /data/local/tmp〜のコマンドを実行致しましたところ、起動画面で止まったままになってしまいました。

     下記に、下記にsh fix_cellstandby.shの出力内容を提示させて頂きました。
    永いことお世話になっており、ご迷惑おかけしていると存じます。大変恐縮ではございますが、お手すきの際に、ご助言頂ければ幸いでございます。

     

  11. tome より:

    追記
    失礼致しました。

    sh fix_cellstandby.shの出力内容でございます。

    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 775k 100 775k 0 0 269k 0 0:00:02 0:00:02 –:–:– 275k
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 1737k 100 1737k 0 0 406k 0 0:00:04 0:00:04 –:–:– 414k
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    101 2528 101 2528 0 0 1605 0 0:00:01 0:00:01 –:–:– 12964
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 1704k 100 1704k 0 0 233k 0 0:00:07 0:00:07 –:–:– 272k
    2212 KB/s (14961 bytes in 0.006s)
    7865 KB/s (11363496 bytes in 1.410s)
    pull: building file list…
    pull: /system/framework/uiautomator.odex -> tmp/framework/uiautomator.odex
    pull: /system/framework/uiautomator.jar -> tmp/framework/uiautomator.jar
    pull: /system/framework/svc.odex -> tmp/framework/svc.odex
    pull: /system/framework/svc.jar -> tmp/framework/svc.jar
    pull: /system/framework/services.odex -> tmp/framework/services.odex
    pull: /system/framework/services.jar -> tmp/framework/services.jar
    pull: /system/framework/send_bug.odex -> tmp/framework/send_bug.odex
    pull: /system/framework/send_bug.jar -> tmp/framework/send_bug.jar
    pull: /system/framework/requestsync.odex -> tmp/framework/requestsync.odex
    pull: /system/framework/requestsync.jar -> tmp/framework/requestsync.jar
    pull: /system/framework/pm.odex -> tmp/framework/pm.odex
    pull: /system/framework/pm.jar -> tmp/framework/pm.jar
    pull: /system/framework/monkey.odex -> tmp/framework/monkey.odex
    pull: /system/framework/monkey.jar -> tmp/framework/monkey.jar
    pull: /system/framework/javax.obex.odex -> tmp/framework/javax.obex.odex
    pull: /system/framework/javax.obex.jar -> tmp/framework/javax.obex.jar
    pull: /system/framework/input.odex -> tmp/framework/input.odex
    pull: /system/framework/input.jar -> tmp/framework/input.jar
    pull: /system/framework/ime.odex -> tmp/framework/ime.odex
    pull: /system/framework/ime.jar -> tmp/framework/ime.jar
    pull: /system/framework/framework.odex -> tmp/framework/framework.odex
    pull: /system/framework/framework.jar -> tmp/framework/framework.jar
    pull: /system/framework/framework-res.apk -> tmp/framework/framework-res.apk
    pull: /system/framework/ext.odex -> tmp/framework/ext.odex
    pull: /system/framework/ext.jar -> tmp/framework/ext.jar
    pull: /system/framework/core.odex -> tmp/framework/core.odex
    pull: /system/framework/core.jar -> tmp/framework/core.jar
    pull: /system/framework/core-junit.odex -> tmp/framework/core-junit.odex
    pull: /system/framework/core-junit.jar -> tmp/framework/core-junit.jar
    pull: /system/framework/content.odex -> tmp/framework/content.odex
    pull: /system/framework/content.jar -> tmp/framework/content.jar
    pull: /system/framework/com.google.widevine.software.drm.odex -> tmp/framework/com.google.widevine.software.drm.odex
    pull: /system/framework/com.google.widevine.software.drm.jar -> tmp/framework/com.google.widevine.software.drm.jar
    pull: /system/framework/com.google.android.media.effects.odex -> tmp/framework/com.google.android.media.effects.odex
    pull: /system/framework/com.google.android.media.effects.jar -> tmp/framework/com.google.android.media.effects.jar
    pull: /system/framework/com.google.android.maps.odex -> tmp/framework/com.google.android.maps.odex
    pull: /system/framework/com.google.android.maps.jar -> tmp/framework/com.google.android.maps.jar
    pull: /system/framework/com.android.nfc_extras.odex -> tmp/framework/com.android.nfc_extras.odex
    pull: /system/framework/com.android.nfc_extras.jar -> tmp/framework/com.android.nfc_extras.jar
    pull: /system/framework/com.android.location.provider.odex -> tmp/framework/com.android.location.provider.odex
    pull: /system/framework/com.android.location.provider.jar -> tmp/framework/com.android.location.provider.jar
    pull: /system/framework/com.android.future.usb.accessory.odex -> tmp/framework/com.android.future.usb.accessory.odex
    pull: /system/framework/com.android.future.usb.accessory.jar -> tmp/framework/com.android.future.usb.accessory.jar
    pull: /system/framework/bu.odex -> tmp/framework/bu.odex
    pull: /system/framework/bu.jar -> tmp/framework/bu.jar
    pull: /system/framework/bouncycastle.odex -> tmp/framework/bouncycastle.odex
    pull: /system/framework/bouncycastle.jar -> tmp/framework/bouncycastle.jar
    pull: /system/framework/bmgr.odex -> tmp/framework/bmgr.odex
    pull: /system/framework/bmgr.jar -> tmp/framework/bmgr.jar
    pull: /system/framework/apache-xml.odex -> tmp/framework/apache-xml.odex
    pull: /system/framework/apache-xml.jar -> tmp/framework/apache-xml.jar
    pull: /system/framework/android.test.runner.odex -> tmp/framework/android.test.runner.odex
    pull: /system/framework/android.test.runner.jar -> tmp/framework/android.test.runner.jar
    pull: /system/framework/android.policy.odex -> tmp/framework/android.policy.odex
    pull: /system/framework/android.policy.jar -> tmp/framework/android.policy.jar
    pull: /system/framework/am.odex -> tmp/framework/am.odex
    pull: /system/framework/am.jar -> tmp/framework/am.jar
    57 files pulled. 0 files skipped.
    7589 KB/s (33218011 bytes in 4.274s)
    patching file tmp/lv14/com/android/internal/telephony/gsm/GsmServiceStateTracker.smali
    /Applications/android-sdk-macosx/platform-tools/fix_cellstandby.sh: line 34: 7za: command not found
    2531 KB/s (14961 bytes in 0.005s)
    1636 KB/s (5512 bytes in 0.003s)
    5868 KB/s (1745016 bytes in 0.290s)
    — BEGIN ‘framework.jar’ (bootstrap=0) —
    — waiting for verify+opt, pid=1737
    — would reduce privs here
    — END ‘framework.jar’ — status=0xff00, process failed
    20+0 records in
    20+0 records out
    boot recovery mode(ex:recovery-clockwork). on boot finished, mount /system and /data.
    execute command…
    $ adb shell “cp /data/local/tmp/framework.odex /system/framework/framework.odex.new && mv /system/framework/framework.odex /system/framework/framework.odex.original && mv /system/framework/framework.odex.new /system/framework/framework.odex && sync && reboot”

  12. ziko より:

    こちらのサイトを参考にパッチ当てを行いました。
    PC環境はWindow7 64bitです

    SC-06D
    CM10(cm-10-20121015-SKRMLK-d2dcm.zip)
    gapps(gapps-jb-20121011-signed.zip)4

    LI3 root済みからカスタムROMインストールで問題無く
    行けました。
    カスタムROMインストール時、CWMにてMVNOパッチ当てを行い、
    framework.jar の差し替えは問題無く終了。

    CM10を使用していましたが、セルスタンバイの圏外100%が
    消えないので、execute.bat中のframework.jar部分を
    framework2.jarにし、CWM画面にて実行しましたが、
    バッチ処理失敗。

    セルスタンバイの圏外表示が消えないかと調べていると、
    モバイルネットワークの通信事業者をDocomoに指定すると
    改善するかもとの情報を得、Docomoに指定すると、圏外
    では無くなりました。

    バッテリーの持ちがどれだけ改善されるかはまだ様子見ですが、
    純正ROMよりかは持ちそうな感じです。

    CM10は安定して動いています。

    ブログ掲載ありがとうございます。

  13. hiroki.kana より:

    tomeさん
    もう1ヶ月も経ってしまって解決していたらごめんなさい。
    /Applications/android-sdk-macosx/platform-tools/fix_cellstandby.sh: line 34: 7za: command not found
    7zaコマンドがないので失敗している模様です。
    homebrewなどからp7zipをインストールして7zaコマンドが利用できる状態で試していただけると成功すると思います。