ドコモMVNOデータSIMの不具合対策パッチ当てのつづき

昨日エントリしたドコモMVNOデータSIMの不具合対策パッチ当ての話の続きです。
注意!! WARNING!!
このエントリの内容は海外版Galaxy S II(GT-I9100)についてのものであり、ドコモ版(SC-02C)についてのものではありません(ドコモ版端末であれば基本的にこの問題は発生しないため、パッチ当ての意味はないはずです)。
そしてここに書かれていることは私がパッチ当てをした際の作業手順を記録したもので、私がやった際は成功しましたが、パッチ当てする端末や作業環境などが違えば当然違った結果になります。
従ってここに書かれていることはあくまで参考にするにとどめ、違った環境でやってみる場合はそれに合ったやり方を改めて探してみることをお勧めします。
最後に言うまでもないですが、作業を行なう際はバックアップなど万全を期した上で自己責任で行なってください。


今回の説明の前提条件となる端末、環境は次の通り
端末:Galaxy S II GT-I9100(海外版)、CF-rootでroot化、CWM導入済
ファームウェアバージョン:XILA2(Android 2.3.6ストックROM、odexed)
動作確認したSIM:b-mobile fair SIM
作業に使ったPCのOSバージョン:Windows XP Professional SP3


準備するもの/こと
ブローヴちゃんのバッチファイル(入手先はこちら)
dexopt-wrapper、busybox(ここなどで入手できます)
作業するPCにAndroid SDKを導入し、Toolsフォルダにパスを通しておく(分からない方はググってください)
作業するPCにパッチ当てする端末のADBドライバをインストールしておき、デバッグモードで接続できるようにしておく
Java環境が必要なので、作業するPCにJavaがインストールされているかを確認し、そうでなければインストールしておく
パッチ当てする端末のシステムROM領域に十分な空き(20MB以上が望ましい)があることを確認し、なければ何とかして空きを確保する


作業手順
/system/framework/framework.odexをコピーし、別の場所(外部SDカード)にバックアップ。
CWMを使いNandroid Backupを取っておく。
上記リンクからダウンロードしたブローヴちゃんのバッチファイルを解凍し、できたフォルダにdexopt-wrapper、busyboxをコピー。
execute.batをテキストエディタで開く(右クリック→編集)。
このバッチファイルはdeodexed端末向けのものなので、odexed端末でバッチを走らせても途中でエラーが出て終了します。
そのためバッチファイルの中身を編集します。
バッチファイルの先頭から「**封印** GOTO:EOF」となっているところまでを全て削除し、「Tempディレクトリ作成」から始まるよう書き換えます。
ここまではdeodexed端末向けのバッチなので、odexed端末へのパッチ当てには不要なため削除する必要があります。
そしてodex 作成と署名の書き換えの手前に「exit」と入力し、そこでバッチを終了させるようにします。
パッチ当て→ゴニョゴニョ済framework.jar作成→必要なファイルを端末にコピーまでをバッチで行ない、それ以降の作業は手作業で行なうようにするため、このようにバッチファイルを修正します(busyboxのコピー、アクセス権変更は既に/system/xbinにbusyboxがあれば不要かも知れませんが、念のためバッチファイルから消さずに残しておきます)。
バッチファイルの最初(Tempディレクトリ作成)へ戻り、次にパッチを当てる端末に合うようバッチコマンドを修正する作業をします。
ブローヴちゃんのodexed端末向けバッチファイルはAndroid 4.0(ICS)端末向けに書かれているため、今回作業したGalaxy S II(Android 2.3.6)の場合はその辺りの修正が必要となります。
「逆コンパイル」のコマンドを次のように修正。

java -Xmx512m -jar baksmali-1.3.2.jar --api-level 10 -c:core.jar:bouncycastle.jar:ext.jar:framework.jar:android.policy.jar:services.jar:core-junit.jar -d temp\framework -o temp\lv10 -x temp\framework.odex

BOOTCLASSPATHの内容(-C:以降のファイル名の羅列)は端末により異なるため、その辺りはググって適切な設定を探してください(上記のコマンドは私がやってみてうまくいった時のものです)。
「書き換え」のコマンドを次のように修正。

cscript //Nologo data-only-sim-smali-fixer.wsf temp 10 0 1

このコマンドの最後の数字の部分でAPIレベル、バッチモード、Emergency Calls Only表示の無効化についての設定を行ないます。
詳細はブローヴちゃんバッチファイルに含まれるmsg_ja.batに書かれているのでここでは割愛しますが、
最初の「10」がAPIレベル(パッチ当てする端末のOSバージョンがAndroid 2.3.6なので「10」を指定)
その次の「0」がバッチモードの指定(サムスン端末での動作実績がある「0」を指定)
最後の「1」がEmergency Calls Only表示無効化のON/OFFの指定(無効にしたいので「1」を指定)
を表します。
ここはパッチを当てる端末毎に適切な設定に書き換えましょう。
コンパイル」のコマンドを次のように修正。

java -Xmx512m -jar smali-1.3.2.jar --api-level 10 -o temp\classes.dex temp\lv10

ここではAPIレベルを指定している部分を変更(14→10)します。
これもパッチを当てる端末毎に適切な設定に書き換えましょう。
これでバッチファイルの修正は完了です。


パッチ当てする端末をデバッグモードで作業PCに接続し、修正済execute.batを実行。
処理項目毎にエラーが出ていないかを確認しながらEnterキーで進めていきます。
コンパイル時にエラーが出た場合はエラーメッセージを確認し、BOOTCLASSPATHとして指定しているファイル名に過不足がないかを確認し、修正してから再度バッチファイルを実行しましょう。
次の「書き換え」の実行後「ファイルの差し替えはやってないので手動で…」と出たところで一旦バッチ実行をストップ。
ここで「(バッチファイルのあるフォルダ)\Temp」フォルダを開くと、「processed-emergency.smali」ファイルがあるので、ファイル名を「GsmServiceStateTracker.smali」に変更します。
そしてそのGsmServiceStateTracker.smaliを「temp\lv10\com\android\internal\telephony\gsm」フォルダにコピーし、元からあるGsmServiceStateTracker.smaliと置き換え(上書き)します。
それが済んだらバッチ実行中のコマンドプロンプトへ戻り、残りのバッチを実行します。


ここから「framework.jarをframework.odexに変換」「framework.odexに署名を付ける」「ゴニョゴニョ済framework.odexをオリジナルと置き換え」を手作業で行ないます。
最初にコマンドプロンプトからadb shellを使うなり、端末上でファイルマネージャを使うなりして/data/local/tmpに「framework.jar」「dexopt-wrapper」「busybox」があることを確認しておきましょう。
「framework.jarをframework.odexに変換」
パッチ当てする端末をデバッグモードでPCに接続し、コマンドプロンプトから次のコマンドを実行

adb shell
cd /data/local/tmp
./dexopt-wrapper framework.jar framework.odex

そして実行結果に(success)と出ればOK。
コマンドプロンプトは閉じずに、次に進みます。
「framework.odexに署名を付ける」
前作業のコマンドプロンプトが開いた状態で次のコマンドを実行。

busybox dd if=/system/framework/framework.odex of=framework.odex bs=1 count=20 skip=52 seek=52 conv=notrunc

を実行し

20+0 records in
20+0 records out
20 bytes (20B) copied, 0.xxxxx seconds, x.xKB/s

というレスポンスが返ってくればOK(x部分は実行毎に異なる値になります)。
busyboxのエラーが出る場合は/system/xbinにbusyboxをコピーしてから再度試すと解決するかも知れません。
そしてframework.odexの名前を「framework.odex.mod」などに変更し、コマンドプロンプトを閉じます。
「ゴニョゴニョ済framework.odexをオリジナルと置き換え」
端末をリカバリーモード(CWM)で起動し、/systemと/dataをマウントした状態でPCにつなぎ、コマンドプロンプトで次のコマンドを実行します(ゴニョゴニョ済framework.odexの名前が「framework.odex.mod」の場合)。

adb shell
cp /data/local/tmp/framework.odex.mod /system/framework/framework.odex.mod
mv /system/framework/framework.odex /system/framework/framework.odex.org
mv /system/framework/framework.odex.mod /system/framework/framework.odex
sync

この後CWMから「Wipe cache partition」と「Wipe Dalvik Cache」を行なってから端末を再起動します。
しかし私は今回はそれを行なわずに再起動(syncの後にrebootコマンドを入力して再起動させた)してしまいましたが、パッチ当てに成功した状態でちゃんと起動できました。
ここまでの手作業についての詳細は


非Deodex環境 (SO-02C) でセルスタンバイ問題を解決する - nunnun’s weblog


の手順10番から12番を参照してください(私もここの記載にほぼ従って作業しています)。
もしframework.odex置き換え後通常起動しなくなった場合はリカバリーモード(CWM)で起動して/systemをマウントしてPCにつなぎ、オリジナルのframework.odex(上の例ではframework.odex.org)へ戻しましょう。


最後に上でリンクしたところ以外で今回参考にしたサイトはというと…
めもめも…〆: HTC chacha(要rootかつ非deodexな状態)でのセルスタンバイ問題解決方法。〜execute.bat改変まで〜
よくわかってないBlog その2 : Galaxy Tab 7.7(GT-P6800)
といったところです(情報ありがとうございます)。
そしてバッチファイルを作成したoovさんにも感謝です。


というわけで海外版になってしまいドコモMVNOのSIMで不具合が出るようになったGalaxy Tabにもパッチを当てることにするかな。