本文を読み飛ばす

HT-03Aとかでアンテナピクトが正しく表示されない問題に対応する

ひょんなことからHT-03Aを手に入れました.

QWERTYじゃないし, 他の人にでも使ってもらうか...と思ったんですが.

  • Android1.6の端末使うのもなんだしな. version upの方法はないのかな.

  • iijmioかbmobileでデータ端末として運用してもらおう

  • MVNOのSim挿してもアンテナピクト問題があると Tetheringできないのよ

version upはごにょごにょするとできたような できなかったような...

MVNOの対応が難しかったので, メモメモします

以下の手法はroot権限が必要で、かつ失敗すると端末が動かなくなります

端末が動かなくなるとCWMなど BIOSからファイルを復元する方法が必要になるのでご注意ください

情報は以下のサイトからもらいました

この問題, ちょっと前から気づいてはいたんですが 手順が多すぎて無視してました.

あと、手順に対する理解もピンとこなかったので

理解するために プローヴちゃん で配布されている batchファイルの中身を確認しながら手動で実行しました.

以下に手順を私なりにまとめました.

端末がodexかどうであるかは下の 端末がodexされているか、どうかの条件 を参照ください

odex端末(ICS以降とか?)

  1. (PC) adb をダウンロード

    PCに既に入ってました. arm用のadbは確かどこかでもらって来たような.

  2. (PC) smali, baksmali をダウンロード

    私は 1.3.2 でやりました.

    これはodexやdexの逆コンパイルに必要なようです.

    deassembleって書いてますが, まぁいいか

  3. (PC) odexwrapper, busybox をダウンロード

    class.dex入り.jarから.odexを作るodexwrapperを取ってきます.

    私はbusyboxが既に入ってました.

  4. (PC) 参考用に プローヴちゃん で配布しているbatchファイル入手

    私はWindows持ってないので参考用に使いました.

    execute.batを参考にして作業を進めます.

  5. (PC) 端末からframework.jar, framework.odexを取り出します.:

    $ mkdir temp $ adb pull /system/framework/framework.jar temp/framework.jar.org $ adb pull /system/framework/framework.odex temp/framework.odex.org

  6. (PC) frameworkの中身すべて取り出す.:

    $ adb pull /system/framework temp/framework

    多分, 逆コンパイルに必要...

  7. (PC) framework.odexを逆コンパイル:

    $ apilevel=10
    $ tmpdir=temp/lv10
    $ libs=core.jar:bouncycastle.jar:ext.jar:framework.jar:android.policy.jar:
       services.jar:core-junit.jar
       (実際には, 空白なく書いてください)
    
    $ java -jar baksmali-1.3.2.jar --api-level $apilevel
       -d temp/framework -o $tmpdir -x temp/framework.odex -c:$libs

    ちょっと時間がかかります.

    私の場合は-c指定が必要でした.

    逆コンパイル後, たくさんファイルができますが jvm用の中間言語なんですかね. 人間が読めるような感じではないです.

  8. (PC) ソースを修正

    temp/lv10/com/android/internal/telephony/gsm/GsmServiceStateTracker.smali

    にできたソースを修正します.

    うちの2.3.7用ROMでは, 以下を修正.

    これってバイナリ毎に違うはずだから まったく意味が分からない方はやらない方がよい.:

    .packed-switch 0x0
    :pswitch_1f => 1e というか一つ下をコピーする
    :pswitch_1e
    :pswitch_1f => 1e
    :pswitch_1f => 1e
    :pswitch_1f
    :pswitch_1e
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_1e
    :pswitch_5
    :pswitch_1f => 1e
    :pswitch_1f => 1e
    :pswitch_1f
    .end packed-switch

    あらためて完成形はこんな感じ:

    .packed-switch 0x0
    :pswitch_1e
    :pswitch_1e
    :pswitch_1e
    :pswitch_1e
    :pswitch_1f
    :pswitch_1e
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_1e
    :pswitch_5
    :pswitch_1e
    :pswitch_1e
    :pswitch_1f
    .end packed-switch
  9. (PC) コンパイルしclasses.dexを作る

    編集したソースを含めてコンパイルする:

    $ java -jar smali-1.3.2.jar --api-level $apilevel
      -o temp/classes.dex $tmpdir
  10. (PC) classes.dex入りのframework.jarを作る

    .jarはzipだからclasses.dexを入れる:

    $ cd temp
    $ 7z u -tzip framework.jar classes.dex
    $ cd ..

    相対パスでファイルを操作するんでtempディレクトリで 作業が必要です.

  11. (PC) framework.jarとodex作成ツールを端末に転送する:

    $ adb push temp/framework.jar /data/local/tmp/
    $ adb push dexopt-wrapper /data/local/tmp/

    dexopt-wrapperに権限変更が必要なんで SDカード上では作業できません.

    framework.jarは、そんなことないのでSDカードでもいいかも

  12. (端末) odexファイルを作成する

    adb shellした後は端末での作業です.:

    PC$ adb shell
    android$ cd /data/local/tmp
    android$ chmod 755 dexopt-wrapper
    android$ ./dexopt-wrapper framework.jar framework.odex

    ここでframework.jarの作成が失敗していると エラーとなります.

    末尾が(success)ではなく(failed)と出る

    私の場合はclasses.dexを.jarに入れる 場所を間違ってました.

    他にも -x で依存関係の.jarを指定しないといけないかも しれません. (私は必要なかったけど)

  13. (端末) odexファイルの署名を書き換え:

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

    署名は普通にjarsignerでもできる気がしますが, アンテナピクトの解説ではこのやり方みたいです.

    私もこれで成功したので, あまり考えてません.

  14. (端末) odexファイルで置き換え:

    PC$ adb remount
    PC$ adb shell
    android$ cd /data/local/tmp
    android$ cp /system/framework/framework.odex /sdcard/framework.odex.org
    android$ cp framework.odex /sdcard/framework.jar.odex.patched
    android$ rm /system/framework/framework.odex
    android$ cp framework.odex /system/framework/framework.odex

    remountは端末内でやってもOKです.(私は端末でやりました)

    ちなみに私のチープな端末だと, 容量不足で /systemが満杯になりました.

    /system/appの.apkを消したりして対処しましたが結構焦った.

  15. (端末) 中間ファイルは削除:

    android$ rm framework.odex
    android$ rm dexopt-wrapper
  16. (端末) リブートします

これでアンテナが立つようになるはずです.

慎重にやったら2~3時間かかりました.

非odex端末(Android 1.6~2.3.7未満)

プローヴちゃん と全く同じ方法ですが書いておきます.

上の作業やった後だと簡単でした...

  1. (PC) adb をダウンロード

  2. (PC) smali, baksmali をダウンロード

  3. (PC) odexwrapper, busybox をダウンロード

  4. (PC) 参考用に プローヴちゃん で配布しているbatchファイル入手

  5. (PC) 端末からframework.jarを取り出します.

    ここからちょっと手順が変わります.:

    $ mkdir temp
    $ adb pull /system/framework/framework.jar temp/framework.jar.org
  6. (PC) frameworkの中身すべて取り出す.:

    $ adb pull /system/framework temp/framework
  7. (PC) framework.jarからclasses.dexを取り出す:

    $ 7z e temp/framework.jar.org classes.dex
  8. (PC) classes.dexを逆コンパイル:

     $ apilevel=10
     $ tmpdir=temp/lv10
     $ libs=core.jar:bouncycastle.jar:ext.jar:
       framework.jar:android.policy.jar:services.jar:core-junit.jar
     (実際には, 空白なく書いてください)
    
     $ java -jar baksmali-1.3.2.jar --api-level $apilevel
       -d temp/framework -o $tmpdir -x classes.dex -c:$libs
    
    ちょっと時間がかかります
  9. (PC) ソースを修正

    temp/lv10/com/android/internal/telephony/gsm/GsmServiceStateTracker.smali

    にできたソースを修正します.

    違う端末では, 以下を修正.:

    .packed-switch 0x0
    :pswitch_20 => 1f というか一つ下をコピーする
    :pswitch_1f
    :pswitch_20 => 1f
    :pswitch_20 => 1f
    :pswitch_20
    :pswitch_1f
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_1f
    :pswitch_5
    :pswitch_20 => 1f
    :pswitch_20 => 1f
    :pswitch_20
    .end packed-switch

    あらためて完成形はこんな感じ:

    .packed-switch 0x0
    :pswitch_1f
    :pswitch_1f
    :pswitch_1f
    :pswitch_1f
    :pswitch_20
    :pswitch_1f
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_5
    :pswitch_1f
    :pswitch_5
    :pswitch_1f
    :pswitch_1f
    :pswitch_20
    .end packed-switch

    端末(ROMのビルド環境)によってちょっと変わるんですな...(あたりまえか)

  10. (PC) コンパイルしclasses.dexを作る

    編集したソースを含めてコンパイルする:

    $ java -jar smali-1.3.2.jar --api-level $apilevel
      -o temp/classes.dex $tmpdir
  11. (PC) classes.dex入りのframework.jarを作る

    .jarはzipだからclasses.dexを入れる:

    $ cd temp
    $ cp framework.jar.org framework.jar.new
    $ 7z u -tzip framework.jar.new classes.dex
    $ cd ..

    相対パスでファイルを操作するんでtempディレクトリで 作業が必要です.

  12. (PC) framework.jarを端末に転送する:

    $ adb push temp/framework.jar.new /sdcard/
  13. (端末) framework.jarを置き換える

    adb shellした後は端末での作業です.:

    PC$ adb shell
    android$ cd /system/framework
    android$ rm framework.jar
    android$ cp /sdcard/framework.jar.new framework.jar
  14. (端末) リブートします

odex端末の次にやったので 1時間もかかってないです.

結果

アンテナピクトが表示されると

  • 再接続しなくなるので電池持ちがよくなる(らしい)

  • 3G通信ができなくなったときに分かり良い

  • せっかくSim挿してるのに3G通信できてないと 判定してしまう挙動がなくなる

    • Android標準のTetheringができない

      これが一番重要でした :D

    • ブラウザ立ち上げたときに「通信できません」と ポップアップがでる

    • Google Playが接続エラーになる

    • MapView使ったアプリ(一部)が3G通信時に動かない

あと、作ったframework.(odex|jar)は ROM変える毎に修正が必要なんですが それはいかんともし難いのかも...

  • docomo MVNO特有の問題なんですかね?

  • 2.3系のソースにそんな修正入らないかな

ちなみに私が持ってる1端末のstock ROMでは この問題はありませんでした. むむむ...

端末がodexされているか、どうかの条件

以下のような場合がodexされている端末です.

  1. /system/framework/framework.odexがある

  2. framework.jarの中にclasses.dexがない

使ってるROMにもよるみたいなんで 作業する前に確認してみてください.

コメント

Comments powered by Disqus
宣伝: