2013年11月10日

Nexus5 と Android 4.4 でのセルスタンバイ問題について

ENGLISH

Nexus5 では docomo MVNO のデータ通信専用 SIM でも LTE 対応のものを使っていればアンテナピクトは表示されるのだが、セルスタンバイの圏外時間は相変わらず 100% のままで、表示上は物凄い勢いで消費しているように見える。
ただし体感上ではすぐ充電がなくなってしまうわけではないし、端末が熱いということもないので、これは表示上のみの問題なのではないかとは個人的には思っている。

そういうこともあって一応何もしなくとも実用に耐えうるかなという思いもあり、かつ Xposed の Android 4.4 対応版がまだ出ていないこともあり、1週間ほどは素のまま使っていた。

ただ、相変わらず 3G のみの SIM に関してはアンテナピクトも出ないようだし、従来の方法でセルスタンバイ問題が解決するかどうか試してみたいというのもあり、やっぱり弄ってみることにした。


はじめに
  • 詳しくない人は素直に通話対応、あるいは SMS 対応の SIM を使ってください
  • この記事はブートローダーアンロックを推奨するものではありません
  • この変更を施した端末は一般的な Nexus5 ではないことを理解してください
    メーカー補償がないばかりか、あらゆるアプリでサポートを受けるべきではありません
何もしていない端末での状況は以下の様なもの。
LTE 対応の SIM を使っている場合でも圏外時間は 100% になり、電池を消費しているプロセスとしてセルスタンバイが大きく占めているように見える状態になる。

対策によって、
  • データ通信専用 SIM によるセルスタンバイの圏外時間 100% 問題が(表示上)解消します
    (実際のバッテリーの消費量自体は大きく変化しないと思われます)
  • 3G のみ対応の SIM であってもアンテナピクトが表示されるはずです(未確認)
  • 「緊急通報のみ」と表示されるのは実害もなさそうだし面倒なので対処していません
  • Windows 上でしか使えないツールを使ってますが、使わなければOSは問いません
  • データ通信専用 SIM じゃないものを使う時は、必ず改変前の状態に戻してください
  • Android 4.4 対応の Xposed がリリースされた場合は恐らくこちらも使えます
手順

工場出荷時状態でユーザーデータが完全なしの状態からの手順。
大まかな流れとしてはアンロック → USBデバッグ有効 → 改変という感じ。
  1. ブートローダーをアンロックする
    音量ダウン+電源ボタンを押してブートローダーを起動して、
    fastboot oem unlock
    端末上で Yes を選択すると、端末内の全てのユーザーデータが消去されアンロックされる
  2. 端末を起動し、初回起動時設定で Wi-Fi の選択をスキップし、次へを連打しホーム画面を出し、MTP を無効、USB デバッグを有効にし、「このパソコンからの USB デバッグを常に許可する」にチェックを入れて電源を切る
  3. 音量ダウン+電源ボタンを押してブートローダーを起動し、リカバリーとして TWRP を焼く
  4. fastboot flash recovery openrecovery-twrp-n.n.n.n-hammerhead.img
  5. Recovery mode で TWRP を起動し Mount メニューで System にチェックを入れる
  6. adb pull /system/framework/telephony-common.jar
    adb pull /system/framework/telephony-common.odex
    でバックアップを取った上で、
    adb shell rm /system/framework/telephony-common.odex
    で、端末内の telephony-common.odex を削除する
  7. Baksmali / Smali Manager をダウンロード、起動する
  8. 0 -> f -> telephony-common.jar と入力
    端末から telephony-common.jar がダウンロードされる
  9. 5 -> 1 と入力
    現在のプロジェクトが telephony-common.jar に設定される
  10. 1 -> x -> Y と入力
    jar が smali で展開され、そのディレクトリがエクスプローラで自動的に開く
  11. com/android/internal/telephony/ServiceStateTracker.smali をメモ帳などで開き
    「useDataRegStateForDataOnlyDevices()」でテキスト内を検索し、
    そのすぐ下にある「if-nez」を「if-eqz」に書き換えて保存して閉じる
    ServiceStateTracker::useDataRegStateForDataOnlyDevices() の最初の if 文の判定の逆にしています)
  12. Baksmali / Smali Manager に戻り、2 -> N と入力
    改変済みのファイルを含む jar が再作成される
  13. 続けて 3 -> Y -> f -> R と入力
    端末が再起動される
これで改変が適用された状態なると思います。
USB デバッグを有効にしておいたので、端末起動中に adb logcat するとログも見れます。

改変後はセルスタンバイの圏外時間が減り、電池消費量も減った(ように見える)。
恐らくアンテナピクトが出なかった環境では出るようにもなったと思う。
この状態から fastbook oem lock もできます。

2013-11-11 追記 ----

セルスタンバイの沈静化は表示上のみで、根本的には解決していないはずなので一部表現を修正。

2013-11-18 追記 ----

↑ リンクを追加。
自分の IIJmio の SIM も SMS 対応のものに切り替えさせてもらったし、バッテリー消耗速度の比較とかやりたい。気もする。
Clip to Evernote