GsmServiceStateTracker.java
を改変します。改変するメソッドは
regCodeToServiceState
です。ソースがあれば、そこからビルドでもいいのでしょうけど、コイツはそんなのは期待できません。 bksmaliをつかってデコンパイルし、内容を改変して、コンパイルしなおして、置き換えるという感じで やるしかないようです。
1.frameworkディレクトリをバックアップしておく
adb pull /system/framework ./framework
2.以下の手順でframework.odexを解体する
※参考にさせていただいたサイト
http://domas-tadamemo.blogspot.jp/2012/03/htc-chacharootdeodexexecutebat.html
はじめにこちらのサイトでzipでかためられているパッチを落としておく。
http://bl.oov.ch/2012/01/android-sim.html?showComment=1330930943649
展開すると現れるexecute.batを参考にさせていただいて、execute.batから抽出したコマンドを 調整したものが下記。api-levelに注意しないとエラーでます。
mkdir temp adb pull /system/framework/framework.jar temp\framework.jar adb pull /system/framework/framework.odex temp\framework.odex adb pull /system/framework temp\framework 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 cscript //Nologo data-only-sim-smali-fixer.wsf temp 10 0 1 #cscriptで変更しきれてない部分を追加で修正する。(あとで説明) #修正したファイルをGsmServiceStateTracker.smaliと入れ替える cd temp cp data-only-sim-fix.smali ./lv10/com/android/internal/telephony/gsm/GsmServiceStateTracker.smali java -Xmx512m -jar smali-1.3.2.jar --api-level 10 -o temp\classes.dex temp\lv10 cd temp ..\7za u -tzip framework.jar classes.dex cd ..
bksmaliで展開して、cscriptのスクリプトを走らせて内容を変更した後に足りない部分をGsmServiceStateTracker.smaliを開いて 編集、method regCodeToServiceStateの中身を書き換える。
cscriptで置換している部分は下記のようにGsmServiceStateTracker.smaliを直接編集しても良い。
.method private regCodeToServiceState(I)I .registers 6 .parameter "code" .prologue const/4 v3, 0x1 .line 1729 packed-switch p1, :pswitch_data_24 .line 1746 :pswitch_4 const-string v0, "GSM" new-instance v1, Ljava/lang/StringBuilder; invoke-direct {v1}, Ljava/lang/StringBuilder;->dalvikのpacked-switchの戻り値を調整するだけです。javaのコードでいうところの()V const-string/jumbo v2, "unexpected service state " invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v1 invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v1 invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v1 invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I move v0, v3 .line 1747 :goto_1e return v0 :pswitch_1f move v0, v3 .line 1738 goto :goto_1e .line 1743 :pswitch_21 const/4 v0, 0x0 goto :goto_1e .line 1729 nop :pswitch_data_24 .packed-switch 0x0 :pswitch_21 ; case 0 :pswitch_21 ; case 1 :pswitch_21 ; case 2 :pswitch_21 ; case 3 :pswitch_1f :pswitch_21 ; case 5 :pswitch_4 :pswitch_4 :pswitch_4 :pswitch_4 :pswitch_1f :pswitch_4 :pswitch_21 ; case 12 :pswitch_21 ; case 13 :pswitch_1f .end packed-switch .end method
return ServiceState.STATE_IN_SERVICE;を返す場所を調整します。
code = 0, 1, 2, 3, 5, 12, 13の場合にSTATE_IN_SERVICEを返します。 全体として、やってることは、framework.jar/framework.odexを本体から抜き出して、あと、farmework全体も抜いておく。 baksmaliにそれを食わせて、解体。GsmServiceStateTracker.smaliを編集して、もう一度コンパイル。 できたclasses.dexを、もともとのframework.jarに入れる。 という感じ。ここまできたらあとは実機に配置していく。その際少し注意するところがある。
※dexopt-wrapperでつくったodexは認識されないぽい。 ので、実際にclasses.jarのはいったframework.jarを配置して実機でframework.dexを生成する方法をとる。
1.上記の作業でtempにできたframework.jarを実機に転送
cd temp adb push framework.jar /data/local/tmp2.framework.jarをいれかえて、framework.odexを消してリブート。framework.dexを生成させる systemをr/wでリマウントして、まず実機内部でバックアップしておく。
adb remount adb shell cd /system/framework cp framework.jar framework.jar.orig cp framework.odex framework.odex.orig※本来はframework.jarをシステムが掴んでない状態で作業するのがいいと思う。clockworkで起動していじる領域だけマウントしてやるとか。
※自分は面倒なんで!直で書き換えます。みなさんはくれぐれも真似しないように。
※リスク高い作業なんで、やるひとは自己責任でよろしく。
busybox cp /data/local/tmp/framework.jar ./ rm framework.odex reboot3.起動したら、/data/dalvik-cacheにdexがあるのを確認し、/system/frameworkに「ムーブ」する
※完全には起動しないです、アップルマークで止まるはず。しかしadb remountはできるし、コマンドも打てる状態。
※このあたり非常に危険w。
adb remount adb shell cd /data/dalvik-cache busybox mv system@framework@framework.jar@classes.dex /system/framework/framework.odex4.framework.odexに署名をコピーする。busyboxのddでやること。
cd /system/framework busybox dd if=./framework.odex.orig of=./framework.odex bs=1 count=20 skip=52 seek=52 conv=notruncここまでやると勝手に起動する。一旦起動するまで待って。framework.jarをもとに戻す 5.framework.jarを戻す
busybox cp framework.jar.orig framework.jar rebootこれで完了。アンテナピクトも立つはず。通知バーにGマークがでてデータ通信が開始されればOK。 ついでにフォントも入れとこう Linaroのフォントを拝借。 http://www.blogfromamerica.com/wp/?p=2897 こちらのページを参考にさせていただきました。 ダウンロードはこれ
http://dl.dropbox.com/u/64994762/wp_images/AndroidJapaneseFont/DroidSansJapanese.ttf
adb remount adb push DroidSansJapanese.ttf /system/fonts/ adb reboot以上
0 コメント:
コメントを投稿