2012年1月10日

Android + データ専用 SIM での動作修正パッチ

Information for Non-Japanese speakers by SBS

※Android 4.0.3 以降の端末の場合は現在ではこのページの内容よりも Xposed Installer + docomo MVNO Sim Patcher による手法のほうが副作用が少なく安全でオススメです。Xposed モジュールの手法で上手く動かなかった場合や、Android 4.0.3 未満の端末の場合のみ、このページの手法を試すことをオススメします。

これは主に docomo の MVNO でのデータ専用 SIM で発生する「セルスタンバイが大量にバッテリーを消費する問題」や「アンテナが表示されない問題」を回避するためのパッチです。
前回 b-mobile のデータ専用 SIM での動作を改善してみたものが、どうやら他の環境でも動く気配がしているのでバッチファイルにまとめました。
どの SIM で動くのか、どの端末で動くのかは手元に情報もないし、私自身 Galaxy Nexus が初めてのスマートフォンで難しいことがよくわかっていないので聞かれても答えられません。なので答えません(改善報告があった端末は一応別ページにリストがありますが、私が確認したわけでもないので聞かれても答えられません)。

このバッチファイルは「何もかもわからなくてもこのバッチファイルさえ実行すれば全て上手くいく」というものではなく「手作業でのやり方がわかっている人が楽をするためのもの」だと思って下さい。

動作保証などは一切しませんので自己責任でご利用下さい。
上手くいかないようなら手作業でやった時の記録も参考にしてみてください。

Download: Windows Only
  Latest:
  http://test.oov.ch/android/datasim_framework_jar_patcher_20120317.zip
  誤字修正など
  (使いそうなファイル大体一緒に突っ込んでるので再配布問題ありそうなら改善します)
  ※Android 4.2.2 で ADB 変わったらしいので、zip に同梱してるものだと動かないかも

    Old releases:
    http://test.oov.ch/android/datasim_framework_jar_patcher_20120316b.zip 英語対応
    http://test.oov.ch/android/datasim_framework_jar_patcher_20120316.zip メッセージ関連を別ファイルに分離
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120206.zip 「緊急通報のみ」関連メッセージ修正
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120204.zip smali / baksmali のエラー対策
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120123a.zip 「緊急通報のみ」改変精度改善
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120123.zip 一部の ROM 向け対策
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120121.zip 「緊急通報のみ」修正など
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120118.zip 「緊急通報のみ」無効化
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120111a.zip モード99の扱いを変更
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120111.zip 日本語パス対処実験
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120110a.zip 処理モード選択を追加
    http://test.oov.ch/android/bmobile_framework_jar_patcher_20120110.zip

動作対象環境: 改善報告があった端末などのリストはこちら
  framework.jar が deodex された状態の Android 1.5 ~の端末が必要
  adb でファイル送受信などができる環境
  端末に書き込むなら /system が書き込み可能で root でないと駄目
  (バッチファイル内で adb root や adb remount は行いません)

  ※条件を満たしていても全ての環境で動作するとは限りません
 ※Android 4.2 では framework.jar ではなく telephony-common.jar に変わったようなので
   まだ動きません。手作業でやるか、もうしばらくお待ちください
 ※Android 4.2.1 以降ではこちら

簡単な解説:
作業前に端末全体のバックアップをとっておくことを推奨します。
自分の環境ではちゃんと動いていますが、全ての環境で上手く動く保証はありません。

バッチファイル execute.bat を実行すると処理が始まります。
まず最初にこのような画面が出て入力待ちになります。
何かキーを押すと次に進みます。
実行環境チェックが始まります。
足りない実行ファイルがある場合はこの段階でなるべく通知するようにしてあります。
何かキーを押すと次に進みます。
次は処理対象の Android OS バージョンを API Level で入力する画面が現れます。
使っているOSに合わせて入力して Enter を押して下さい。
(ここで入力した値は主に smali.jar と baksmali.jar に渡す引数として使用されます)
次に処理モード選択画面が表示されます。
機種によって書き換える場所が若干変わるようですので選択する必要があります。
Xperia 系の端末の場合モード 1 を選ぶと良いそうですが、arc では 99 じゃないと駄目かも知れないという情報もありましたのでご注意下さい。

(スクリーンショット準備中)

ここで「緊急通報のみ」の表示を消すかどうかをオプションで選択することができます。
色々な機種で動作テストができていないので失敗する可能性もありますがお好みでお使いください。
※この機能が正しく動くと、例えば ICS のロック画面や通知が左から右のように変わります。

処理開始前の最終確認が行われます。
問題なければ y、ここで中断するなら n を入力して Enter を押して下さい。
ここから先は基本的に勝手に進んでいきますが、まだバッチファイルと同じ場所に framework.jar.orig が存在しない場合、バックアップを作成するか聞くようになっています。
ここから先の処理が正常に進行したように見えても実は失敗している可能性も考えられるので、この時点でバックアップを作成しておくことを強く推奨します。

ここから先は問題が起こらない限りはしばらく自動で進行していきます。
最後まで上手く実行されると、バッチファイルと同じ場所に改変済みの framework.jar が作成されます。
ここで y を答えると /system/framework/framework.jar を書き換えますが、特に su や mount などはしないため多くの場合失敗すると思います。
(ここでの実行は ClockworkMod Recovery で /system を mount した状態で実行するのを想定しています)

以上でバッチファイルの処理は全て終了です。

端末に framework.jar を転送した際は ClockworkMod Recovery のメニューにある「Wipe cache partition」と、「advanced」の中にある「Wipe Dalvik Cache」を行なってください。
また、adb.exe の仕組み上バッチファイルを実行したあとも adb.exe は実行されたままです。必要に応じて終了してください。

起動画面から先に進まなくなってしまった場合:
キャッシュを削除しているので普段より初回起動は時間が掛かりますが、あまりに立ち上がってこない場合は改変に失敗している可能性があります。
ClockworkMod Recovery で mount /system した状態で、recover.bat を実行するとリカバリー用の処理が走ります。

これは framework.jar.orig を端末に転送するので、リカバリー処理後は「Wipe cache partition」と、「advanced」の中にある「Wipe Dalvik Cache」を行なってください。

リカバリーのバッチファイルも上手く動かない場合は以下のコマンドを打てば大体同じです。
adb push framework.jar.orig /system/framework/framework.jar
adb shell chmod 644 /system/framework/framework.jar

バッチファイルが行う処理について:
この一連の作業を自動化しただけです。実際の改変箇所は
処理モード 0 だと 3, 13
処理モード 1 だと 2, 12
処理モード 2 だと 0, 10
処理モード 99 だと 2, 3, 12, 13
を書き換えます。この改変が終わったあと「緊急通報のみ」の改変も行うように設定されている場合はこの記事の作業内容に従って該当箇所を 0x0 か 0x1 に改変します。

実際に試した方からのレポート:
GALAXY Noteでのb-mobileデータ通信SIMのセルスタンバイ問題を解決する
非Deodex環境 [SO-02C] でセルスタンバイ問題を解決する - nunnun's weblog
HTC chacha(要rootかつ非deodexな状態)でのセルスタンバイ問題解決方法。~execute.bat改変まで~

よくある質問
■deodex された状態ってなんですか?
ここでは /system/framework/framework.odex が存在しない ROM のことだと思って下さい。
存在する場合はこちらの手順が参考になるかもしれません(※手作業になります)。

■Java が見つからないと言われてバッチファイルが実行できない
JDK がインストールしてあるのにそのメッセージが出る場合、java.exe へのパスが通っていないのが原因でエラーが起きている可能性があります。
execute.bat をテキストエディタで開くと set JAVA= という行があるので、その後ろに java.exe の場所を書くと上手くいくかもしれません。

■バッチファイルを動かすと framework.jar の転送に失敗して進ません
adb が使える環境でなければ上手く動かないと思います。
USB ドライバが入ってないとか、色々ありそうですね。

■ステップ 2 の framework.jar の中から classes.dex の抽出で失敗する
deodexed な ROM じゃないのではないでしょうか。
/system/framework/framework.odex が存在している ROM にはバッチファイルは使えません。
おそらく大体の OTA で飛んでくる ROM と、一部のカスタム ROM は駄目です。
違う ROM に入れ替えるか、odex ファイルを処理する方法を調べてください。

■ステップ 4 の smali ファイルの書き換えで失敗する
wsf ファイルの実行に失敗しているか、書き換え対象のファイルが想定していない形になっていて失敗するかのどちらかだと思います。
実行はできているものの想定外の形だった場合「Could not found modification block.」という英語的に正しいのかわかりませんがメッセージが出てくるはずなので、ROM などを教えて頂ければ対策できるかも知れません。
が、多くの場合はバッチファイルに頼らず手作業で改変したほうが早く結果まで辿りつけると思います。
また、「緊急通報のみ」を無効化する機能は機種によって上手く改変できないケースがあるため、「変更しない」を選んでみてください。

■「今すぐデバイスに転送しますか?」で「y」と答えても転送できない
adb root や adb remount をバッチファイル内で行わないため、事前に行っていない場合は転送できません。
その辺のコマンドはバッチファイルから勝手に呼ぶのも怖いので呼ぶ処理は入っていません。
転送に失敗し、原因を探している時にこの文章を見つけた方は、自分の手でしっかり確認しながら手作業で転送すればいいと思います。

■セルスタンバイが減らない / アンテナに 3G/H マークが出ない / アンテナに違うマークが出る
機種や ROM に依存する問題だと思うので私にはわかりません。
セルスタンバイに関しては表示上の問題ではないかという話もあります。
この改変で一番意味があるのはアンテナが立たない事でアプリが回線なしと誤判定するのを回避できるかもしれない部分だと思うので、大目に見てやってはくれませんか。

■音声通話できる SIM と併用する場合 / SIM を抜いた状態で使う場合
そもそも音声通話ができる状態を装うことで問題を回避しているので、恐らくそのSIMで音声通話ができなくなった時検出不能でしょうし、想定できない色々な問題が発生する可能性があります。
データ専用 SIM を入れっぱなしの状態で使わないと酷い問題が色々起こりかねません。
SIM を抜いたり音声通話対応 SIM も使う場合は必要に応じて元の framework.jar に戻した方がいいでしょう。
Clip to Evernote