2013年6月16日日曜日

framework.odexのカスタマイズ

MVNO SIM利用時のセルスタンバイ対策や、テザリング時のAPN強制変更対策をするにはframework.odexのカスタマイズが必要になってきます
カスタマイズ時の手順についてのメモです

0.準備
・端末へbusyboxのインストール
Google PlayからBusybox Installerをインストール
起動して、Busyboxをインストール

・dexopt-wrapperを入手
http://forum.xda-developers.com/showpost.php?p=3864655&postcount=36 このあたり

・smali,baksmaliを入手
https://code.google.com/p/smali/ このあたり

・7za.exeの入手
http://www.7-zip.org/ このあたり

・javaのインストール
http://java.com/ja/download/ このあたり

・adb接続
USB Driverのインストールとadb接続 F-11D編を参照

1.端末からカスタマイズに必要なファイルをダウンロード
C:\> mkdir framework
C:\> cd framework
C:\framework> adb pull /system/framework/framework.jar .
C:\framework> adb pull /system/framework/framework.odex .
C:\framework> adb pull /system/framework/bouncycastle.odex .
C:\framework> adb pull /system/framework/core.odex .
C:\framework> adb pull /system/framework/core-junit.odex .
C:\framework> adb pull /system/framework/ext.odex .

2.逆アセンブラ
C:\framework> java -jar baksmali-1.3.2.jar -c:core-junit.odex -x framework.odex

3.編集
・テザリング時のAPN固定対策
out\com\android\internal\telephony\gsm\GsmDataConnectionTracker.smali
を編集して、MVNO SIM時の挙動をdocomo以外のSIMを刺した場合と同等にする

・セルスタンバイ対策
out\com\android\internal\telephony\gsm\GsmServiceStateTracker.smali
を編集して、searching,registration deniedの際の挙動をin serviceと同等にする

4.classes.dexをframework.jarに統合
C:\framework> 7za u -tzip framework.jar classes.dex

5.端末にframework.jarとodexへの変換プログラムを転送
C:\framework> adb push framework.jar /data/local/tmp/framework.jar
C:\framework> adb push dexopt-wrapper /data/local/tmp/
C:\framework> adb shell chmod 755 /data/local/tmp/dexopt-wrapper

6.端末上で変換
C:\framework> adb shell
shell@android:/ $ cd /data/local/tmp
shell@android:/ $ ./dexopt-wrapper framework.jar framework.odex

7.署名をコピー
shell@android:/ $ busybox dd if=/system/framework/framework.odex of=framework.odex bs=1 count=20 skip=52 seek=52 conv=notrunc

8.既存framework.odexのバックアップと、置換
shell@android:/ $ su
shell@android:/ # busybox cp /system/framework/framework.odex{,.YYYYMMDD}
shell@android:/ # busybox cp framework.odex /system/framework/framework.odex

9.再起動
shell@android:/ # reboot

3 件のコメント:

  1. rootが上手くとれたのでframework.odexの逆コンパイルをやろうとしてるのですが上手く行きません
    C:\> adb pull /system/framework/framework.jar framework
    C:\> adb pull /system/framework/framework.odex framework
    C:\> adb pull /system/framework/bouncycastle.odex framework
    C:\> adb pull /system/framework/core.odex framework
    C:\> adb pull /system/framework/core-junit.odex framework
    C:\> adb pull /system/framework/ext.odex framework
    のとこですが、記述は正確ですか?frameworkというファイルが出来ますが、
    同名でやると記述のたびに上書きされて前の情報が消えていきます。
    また、その後の逆コンパイルの記述でframework.odexとありますが上記では作られません。
    試しにファイルごとに違う名前でpullして、逆コンパイルもファイルごとにやろうとしました。
    ただ、これもエラーで失敗しました。javaを入れろとありましたが、自分はREの方を入れました。
    DKである必要はないんですよね?
    いろいろ乱文になってしまいましたが、とりあえず、最初のpullから逆コンパイルの流れだけでも教えていただけると
    すごく助かります。

    返信削除
  2. pull先のframeworkはファイル名ではなくディレクトリ名のつもりでした。
    御指摘ありがとうございます。
    修正しました。

    8より先は端末が起動しなくなる危険性もありますので、覚悟の上で進めて下さい。

    返信削除
  3. 早い対応ありがとうございました。
    少しだけ前に薦めることが出来ました。
    なお、逆アセンブリが出来なかった問題についてはsmali,baksmaliのバージョンがあたらしすぎて対応できなかったようです。
    バージョン2.xではエラーになるようで、
    ひとまず1.x系の1.4.2に差し替えると無事、逆アセンブリかけることが出来ました。
    (参照先のサイトでは2.0.xに前面出されており、コメント入れておいた方がよいかもしれません。)
    なお、編集についてはいろんなサイト見ながら勉強します。(想像以上に難しいですねーー;生半可なプログラムの知識じゃ)
    ひとまずはソースのままビルドしなおして焼き直そうかと思っていますが、
    7za u -tzip framework.jar classes.dex
    にあるclasses.dexは以下の引数であってますでしょうか?
    java -jar smali-1.4.2.jar -a 15 -o classes.dex out
    一応ビルドでき、framework.jarと7zipでくっつけた成果物が出来ました。
    一緒にpullしてたframework.odexと比べて半分以下なんですがこんなものでしょうか?

    >8より先は端末が起動しなくなる危険性もありますので、覚悟の上で進めて下さい。
    理解はしているつもりです。一応今、やろうとしているのは予備端末です。Amazonで2個調達していたうちの一つ。
    目標はテザリング開放ですが、挑戦するのはもうちょっと先になりそう・・・。

    返信削除