2012年9月14日金曜日

iPhone 4s Ultimate Edition 終極版をDTIのServersMan SIMで使えるようにする

中華系のスマホやPadはb-mobileやDTI ServersMan SIM等のMVNOのSIMを認識しないという問題が あるらしく、こいつもその例外ではなかったです。ServersMan SIMをカットしていれてみたのは いいのですが、No SIM状態→アンテナピクト立たず。この状態だと3G的にも通信ができません。 #アンテナピクトが立たない状態でも通信できるNexus S-JB(4.1)とは状況も違うようです。 Googleでいろいろ調べていると同様の現象を経験されている方が多く見られました。そういうわけで 解決法も確率されているようです。具体的にはframework.jarに含まれるクラスである

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;->()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
dalvikのpacked-switchの戻り値を調整するだけです。javaのコードでいうところの
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/tmp
2.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
reboot
3.起動したら、/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.odex
4.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 コメント:

コメントを投稿