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以降とか?)
-
(PC) adb をダウンロード
PCに既に入ってました. arm用のadbは確かどこかでもらって来たような.
-
(PC) smali, baksmali をダウンロード
私は 1.3.2 でやりました.
これはodexやdexの逆コンパイルに必要なようです.
deassembleって書いてますが, まぁいいか
-
(PC) odexwrapper, busybox をダウンロード
class.dex入り.jarから.odexを作るodexwrapperを取ってきます.
私はbusyboxが既に入ってました.
-
(PC) 参考用に プローヴちゃん で配布しているbatchファイル入手
私はWindows持ってないので参考用に使いました.
execute.batを参考にして作業を進めます.
-
(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
-
(PC) frameworkの中身すべて取り出す.:
$ adb pull /system/framework temp/framework
多分, 逆コンパイルに必要...
-
(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用の中間言語なんですかね. 人間が読めるような感じではないです.
-
(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
-
(PC) コンパイルしclasses.dexを作る
編集したソースを含めてコンパイルする:
$ java -jar smali-1.3.2.jar --api-level $apilevel -o temp/classes.dex $tmpdir
-
(PC) classes.dex入りのframework.jarを作る
.jarはzipだからclasses.dexを入れる:
$ cd temp $ 7z u -tzip framework.jar classes.dex $ cd ..
相対パスでファイルを操作するんでtempディレクトリで 作業が必要です.
-
(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カードでもいいかも
-
(端末) 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を指定しないといけないかも しれません. (私は必要なかったけど)
-
(端末) odexファイルの署名を書き換え:
android$ dd if=/system/framework/framework.odex of=framework.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
署名は普通にjarsignerでもできる気がしますが, アンテナピクトの解説ではこのやり方みたいです.
私もこれで成功したので, あまり考えてません.
-
(端末) 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を消したりして対処しましたが結構焦った.
-
(端末) 中間ファイルは削除:
android$ rm framework.odex android$ rm dexopt-wrapper
(端末) リブートします
これでアンテナが立つようになるはずです.
慎重にやったら2~3時間かかりました.
非odex端末(Android 1.6~2.3.7未満)
プローヴちゃん と全く同じ方法ですが書いておきます.
上の作業やった後だと簡単でした...
(PC) adb をダウンロード
(PC) smali, baksmali をダウンロード
(PC) odexwrapper, busybox をダウンロード
(PC) 参考用に プローヴちゃん で配布しているbatchファイル入手
-
(PC) 端末からframework.jarを取り出します.
ここからちょっと手順が変わります.:
$ mkdir temp $ adb pull /system/framework/framework.jar temp/framework.jar.org
-
(PC) frameworkの中身すべて取り出す.:
$ adb pull /system/framework temp/framework
-
(PC) framework.jarからclasses.dexを取り出す:
$ 7z e temp/framework.jar.org classes.dex
-
(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 ちょっと時間がかかります
-
(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のビルド環境)によってちょっと変わるんですな...(あたりまえか)
-
(PC) コンパイルしclasses.dexを作る
編集したソースを含めてコンパイルする:
$ java -jar smali-1.3.2.jar --api-level $apilevel -o temp/classes.dex $tmpdir
-
(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ディレクトリで 作業が必要です.
-
(PC) framework.jarを端末に転送する:
$ adb push temp/framework.jar.new /sdcard/
-
(端末) framework.jarを置き換える
adb shellした後は端末での作業です.:
PC$ adb shell android$ cd /system/framework android$ rm framework.jar android$ cp /sdcard/framework.jar.new framework.jar
(端末) リブートします
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されている端末です.
/system/framework/framework.odexがある
framework.jarの中にclasses.dexがない
使ってるROMにもよるみたいなんで 作業する前に確認してみてください.
コメント
Comments powered by Disqus